From f68c9103fa67fd96322bb45c6ae66086d53bc18d Mon Sep 17 00:00:00 2001 From: clover caruso Date: Wed, 30 Sep 2026 21:03:24 -0700 Subject: [PATCH] feat: password-protected sections, notebook recycle bin, unread changes, and Direct3D 11 on Windows 7 - Password-protected sections: unlock, protect, change and remove passwords, lock all, auto-lock - Notebook Recycle Bin view with restore and empty - Unread changes in bold with Mark as Read and Next Unread - Save As for pages, sections and notebooks, and .onepkg pack and unpack - Direct3D 11 renderer for Windows 7 and machines without Direct3D 12 - Windows 7 Aero toolbar styles (bar, pills, frost, tint, tint-tiles) - Section colour, notebook properties and default font colour - Right-to-left pages open where OneNote puts them - Update summaries listing what each update brings - Sync status popup with Work Offline in its header - iOS soft axis lock while scrolling and a zoom detent at 100% - Single-instance handoff on Windows and Linux - iOS no longer seeds a sample notebook on first launch - Search finds text from templates, restored versions and copied pages - PDF export follows OneNote order and skips date-only untitled pages - A whole-page paste followed by a sync refresh no longer crashes - Another device drops its plaintext copy once a section is protected - Setting a password never overwrites a concurrent revision - Local CI gate (tools/ci.py) used by releases Assisted-by: claude-opus-5.5 --- Cargo.lock | 69 ++ apps/ios/Snowbound.xcodeproj/project.pbxproj | 4 - apps/ios/Snowbound/App.swift | 21 +- apps/ios/Snowbound/CanvasView.swift | 184 ++++- apps/ios/Snowbound/ICloud.swift | 6 + apps/ios/Snowbound/Lists.swift | 141 +++- apps/ios/Snowbound/Notebooks.swift | 110 ++- apps/ios/Snowbound/PageViewController.swift | 48 +- apps/ios/Snowbound/Prototypes.swift | 241 ++++++ apps/ios/Snowbound/Script.swift | 8 +- apps/ios/Snowbound/Server.swift | 6 - arc/canvas.md | 5 + arc/file-format.md | 18 +- arc/platforms.md | 28 +- arc/sync.md | 10 +- corpus/m6/native-page-direction-03/ORACLE.md | 7 +- corpus/notebook-package/README.md | 27 + .../notebook-package/candidate/Packed.onepkg | Bin 0 -> 3416 bytes .../candidate/Unpacked/Group/Inner.one | Bin 0 -> 6032 bytes .../Unpacked/Group/Open Notebook.onetoc2 | Bin 0 -> 4120 bytes .../candidate/Unpacked/New Section 1.one | Bin 0 -> 6024 bytes .../candidate/Unpacked/Open Notebook.onetoc2 | Bin 0 -> 6120 bytes corpus/notebook-package/cold/commands.jsonl | 3 + corpus/notebook-package/cold/machine.json | 1 + .../cold/notebook/Group/Inner.one | Bin 0 -> 6032 bytes .../cold/notebook/Group/Open Notebook.onetoc2 | Bin 0 -> 4120 bytes .../cold/notebook/New Section 1.one | Bin 0 -> 6024 bytes .../cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 6120 bytes .../cold/read/environment.json | 7 + .../notebook-package/cold/read/hierarchy.xml | 2 + .../cold/read/page-000.navigation.json | 13 + .../notebook-package/cold/read/page-000.png | Bin 0 -> 40349 bytes .../notebook-package/cold/read/page-000.xml | 2 + .../cold/read/page-001.navigation.json | 13 + .../notebook-package/cold/read/page-001.png | Bin 0 -> 40196 bytes .../notebook-package/cold/read/page-001.xml | 2 + .../notebook-package/cold/read/payloads.json | 3 + corpus/notebook-package/cold/run.json | 18 + corpus/notebook-package/cold/scripts/cold.ps1 | 27 + corpus/notebook-package/cold/scripts/read.ps1 | 144 ++++ corpus/notebook-package/cold/source.json | 26 + corpus/notebook-package/cold/teardown.json | 1 + corpus/notebook-package/native/Lab.onepkg | Bin 0 -> 6309 bytes .../onenote-unpacked/hierarchy.xml | 2 + .../onenote-unpacked/unpack-dialog.png | Bin 0 -> 71668 bytes .../onenote-unpacked/unpacked.png | Bin 0 -> 43855 bytes .../save-as/candidate/Inner copy.one | Bin 0 -> 6032 bytes .../save-as/candidate/Inside.one | Bin 0 -> 6032 bytes .../save-as/cold/commands.jsonl | 3 + .../save-as/cold/machine.json | 1 + .../save-as/cold/notebook/Inner copy.one | Bin 0 -> 6032 bytes .../save-as/cold/notebook/Inside.one | Bin 0 -> 6032 bytes .../cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 4880 bytes .../save-as/cold/read/environment.json | 7 + .../save-as/cold/read/hierarchy.xml | 2 + .../cold/read/page-000.navigation.json | 13 + .../save-as/cold/read/page-000.png | Bin 0 -> 40347 bytes .../save-as/cold/read/page-000.xml | 2 + .../cold/read/page-001.navigation.json | 13 + .../save-as/cold/read/page-001.png | Bin 0 -> 40217 bytes .../save-as/cold/read/page-001.xml | 2 + .../save-as/cold/read/payloads.json | 3 + corpus/notebook-package/save-as/cold/run.json | 18 + .../save-as/cold/scripts/cold.ps1 | 27 + .../save-as/cold/scripts/read.ps1 | 144 ++++ .../notebook-package/save-as/cold/source.json | 14 + .../save-as/cold/teardown.json | 1 + corpus/protected-edit/README.md | 4 +- corpus/protected-sections/README.md | 58 ++ .../candidate/notebook/Changed.one | Bin 0 -> 26248 bytes .../candidate/notebook/Conflicted.one | Bin 0 -> 44384 bytes .../candidate/notebook/Edited.one | Bin 0 -> 28952 bytes .../candidate/notebook/New Section 1.one | Bin 0 -> 6064 bytes .../candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 8520 bytes .../candidate/notebook/Protected.one | Bin 0 -> 22976 bytes .../candidate/notebook/Removed.one | Bin 0 -> 19656 bytes .../candidate/passwords.json | 7 + ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../cold/before-read/environment.json | 7 + .../cold/before-read/hierarchy.xml | 2 + .../cold/before-read/page-000.xml | 10 + .../cold/before-read/page-001.xml | 2 + .../cold/before-read/page-002.xml | 2 + .../cold/before-read/page-003.xml | 2 + .../cold/before-read/payloads.json | 10 + corpus/protected-sections/cold/commands.jsonl | 11 + corpus/protected-sections/cold/machine.json | 1 + .../cold/notebook/Changed.one | Bin 0 -> 29336 bytes .../cold/notebook/Conflicted.one | Bin 0 -> 47472 bytes .../cold/notebook/Edited.one | Bin 0 -> 41312 bytes .../cold/notebook/New Section 1.one | Bin 0 -> 7512 bytes .../cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 8520 bytes .../cold/notebook/Protected.one | Bin 0 -> 26064 bytes .../cold/notebook/Removed.one | Bin 0 -> 22560 bytes ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + .../cold/read/environment.json | 7 + .../cold/read/hierarchy.xml | 2 + .../protected-sections/cold/read/page-000.xml | 13 + .../protected-sections/cold/read/page-001.xml | 11 + .../protected-sections/cold/read/page-002.xml | 2 + .../protected-sections/cold/read/page-003.xml | 2 + .../protected-sections/cold/read/page-004.xml | 2 + .../protected-sections/cold/read/page-005.xml | 10 + .../protected-sections/cold/read/page-006.xml | 2 + .../protected-sections/cold/read/page-007.xml | 2 + .../protected-sections/cold/read/page-008.xml | 2 + .../protected-sections/cold/read/page-009.xml | 10 + .../protected-sections/cold/read/page-010.xml | 2 + .../protected-sections/cold/read/page-011.xml | 2 + .../protected-sections/cold/read/page-012.xml | 2 + .../protected-sections/cold/read/page-013.xml | 2 + .../protected-sections/cold/read/page-014.xml | 2 + .../protected-sections/cold/read/page-015.xml | 11 + .../cold/read/payloads.json | 42 + corpus/protected-sections/cold/run.json | 18 + .../protected-sections/cold/scripts/cold.ps1 | 27 + .../protected-sections/cold/scripts/read.ps1 | 144 ++++ corpus/protected-sections/cold/source.json | 44 + corpus/protected-sections/cold/teardown.json | 1 + .../cold/unlock-Changed.json | 13 + .../cold/unlock-Changed.png | Bin 0 -> 40416 bytes .../cold/unlock-Conflicted.json | 13 + .../cold/unlock-Conflicted.png | Bin 0 -> 40655 bytes .../cold/unlock-Edited.json | 13 + .../protected-sections/cold/unlock-Edited.png | Bin 0 -> 40619 bytes .../cold/unlock-Protected.json | 13 + .../cold/unlock-Protected.png | Bin 0 -> 40939 bytes corpus/protected-sections/manifest.json | 10 + corpus/protected-sections/native/changed.one | Bin 0 -> 27064 bytes .../observed/onenote-change-password.png | Bin 0 -> 60960 bytes .../native/observed/onenote-locked-page.png | Bin 0 -> 48538 bytes .../observed/onenote-options-lock-after.png | Bin 0 -> 52296 bytes .../observed/onenote-options-passwords.png | Bin 0 -> 49725 bytes .../observed/onenote-pane-protected.png | Bin 0 -> 57542 bytes ...e-relocks-after-remote-password-change.png | Bin 0 -> 59276 bytes .../observed/onenote-remove-password.png | Bin 0 -> 60664 bytes .../native/observed/onenote-search-locked.png | Bin 0 -> 44611 bytes .../native/observed/onenote-set-password.png | Bin 0 -> 60679 bytes .../native/observed/onenote-tags-locked.png | Bin 0 -> 52933 bytes .../native/observed/onenote-tags-unlocked.png | Bin 0 -> 54819 bytes .../native/observed/onenote-unlock-dialog.png | Bin 0 -> 49704 bytes .../native/observed/onenote-unlock-wrong.png | Bin 0 -> 50432 bytes .../onenote-unlocked-shows-locked-append.png | Bin 0 -> 64768 bytes .../protected-sections/native/protected.one | Bin 0 -> 25848 bytes corpus/protected-sections/native/removed.one | Bin 0 -> 20152 bytes .../snowbound-changed-then-onenote-edit.one | Bin 0 -> 30664 bytes .../protected-sections/source/synthetic.one | Bin 0 -> 31512 bytes corpus/recycle-bin-view/README.md | 19 + .../candidate/after/New Section 1.one | Bin 0 -> 10768 bytes .../OneNote_DeletedPages.one | Bin 0 -> 14816 bytes .../OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 6440 bytes .../candidate/after/Open Notebook.onetoc2 | Bin 0 -> 11160 bytes .../candidate/after/Restored.one | Bin 0 -> 6120 bytes .../candidate/before/New Section 1.one | Bin 0 -> 6024 bytes .../before/OneNote_RecycleBin/Back.one | Bin 0 -> 6072 bytes .../before/OneNote_RecycleBin/Copied.one | Bin 0 -> 6072 bytes .../before/OneNote_RecycleBin/Emptied.one | Bin 0 -> 6120 bytes .../OneNote_DeletedPages.one | Bin 0 -> 10816 bytes .../OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 5880 bytes .../before/OneNote_RecycleBin/Purged.one | Bin 0 -> 6072 bytes .../before/OneNote_RecycleBin/Restored.one | Bin 0 -> 6120 bytes .../candidate/before/Open Notebook.onetoc2 | Bin 0 -> 10656 bytes .../cold/after/commands.jsonl | 3 + .../recycle-bin-view/cold/after/machine.json | 1 + .../cold/after/notebook/New Section 1.one | Bin 0 -> 10768 bytes .../OneNote_DeletedPages.one | Bin 0 -> 14816 bytes .../OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 6440 bytes .../cold/after/notebook/Open Notebook.onetoc2 | Bin 0 -> 11160 bytes .../cold/after/notebook/Restored.one | Bin 0 -> 6120 bytes .../cold/after/read/environment.json | 7 + .../cold/after/read/hierarchy.xml | 2 + .../cold/after/read/page-000.navigation.json | 13 + .../cold/after/read/page-000.png | Bin 0 -> 41556 bytes .../cold/after/read/page-000.xml | 2 + .../cold/after/read/page-001.navigation.json | 13 + .../cold/after/read/page-001.png | Bin 0 -> 42087 bytes .../cold/after/read/page-001.xml | 2 + .../cold/after/read/page-002.navigation.json | 13 + .../cold/after/read/page-002.png | Bin 0 -> 41199 bytes .../cold/after/read/page-002.xml | 2 + .../cold/after/read/page-003.navigation.json | 13 + .../cold/after/read/page-003.png | Bin 0 -> 41982 bytes .../cold/after/read/page-003.xml | 2 + .../cold/after/read/payloads.json | 3 + corpus/recycle-bin-view/cold/after/run.json | 18 + .../cold/after/scripts/cold.ps1 | 27 + .../cold/after/scripts/read.ps1 | 144 ++++ .../recycle-bin-view/cold/after/source.json | 32 + .../recycle-bin-view/cold/after/teardown.json | 1 + .../cold/before/commands.jsonl | 3 + .../recycle-bin-view/cold/before/machine.json | 1 + .../cold/before/notebook/New Section 1.one | Bin 0 -> 6024 bytes .../notebook/OneNote_RecycleBin/Back.one | Bin 0 -> 6072 bytes .../notebook/OneNote_RecycleBin/Copied.one | Bin 0 -> 6072 bytes .../notebook/OneNote_RecycleBin/Emptied.one | Bin 0 -> 6120 bytes .../OneNote_DeletedPages.one | Bin 0 -> 10816 bytes .../OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 5880 bytes .../notebook/OneNote_RecycleBin/Purged.one | Bin 0 -> 6072 bytes .../notebook/OneNote_RecycleBin/Restored.one | Bin 0 -> 6120 bytes .../before/notebook/Open Notebook.onetoc2 | Bin 0 -> 10656 bytes .../cold/before/read/environment.json | 7 + .../cold/before/read/hierarchy.xml | 2 + .../cold/before/read/page-000.navigation.json | 13 + .../cold/before/read/page-000.png | Bin 0 -> 45162 bytes .../cold/before/read/page-000.xml | 2 + .../cold/before/read/page-001.navigation.json | 13 + .../cold/before/read/page-001.png | Bin 0 -> 44960 bytes .../cold/before/read/page-001.xml | 2 + .../cold/before/read/page-002.navigation.json | 13 + .../cold/before/read/page-002.png | Bin 0 -> 45643 bytes .../cold/before/read/page-002.xml | 2 + .../cold/before/read/page-003.navigation.json | 13 + .../cold/before/read/page-003.png | Bin 0 -> 39793 bytes .../cold/before/read/page-003.xml | 2 + .../cold/before/read/page-004.navigation.json | 13 + .../cold/before/read/page-004.png | Bin 0 -> 45220 bytes .../cold/before/read/page-004.xml | 2 + .../cold/before/read/page-005.navigation.json | 13 + .../cold/before/read/page-005.png | Bin 0 -> 45709 bytes .../cold/before/read/page-005.xml | 2 + .../cold/before/read/page-006.navigation.json | 13 + .../cold/before/read/page-006.png | Bin 0 -> 45579 bytes .../cold/before/read/page-006.xml | 2 + .../cold/before/read/page-007.navigation.json | 13 + .../cold/before/read/page-007.png | Bin 0 -> 44905 bytes .../cold/before/read/page-007.xml | 2 + .../cold/before/read/page-008.navigation.json | 13 + .../cold/before/read/page-008.png | Bin 0 -> 44843 bytes .../cold/before/read/page-008.xml | 2 + .../cold/before/read/payloads.json | 3 + corpus/recycle-bin-view/cold/before/run.json | 18 + .../cold/before/scripts/cold.ps1 | 27 + .../cold/before/scripts/read.ps1 | 144 ++++ .../recycle-bin-view/cold/before/source.json | 56 ++ .../cold/before/teardown.json | 1 + corpus/rtl-page/README.md | 19 + .../rtl-page/candidate/Open Notebook.onetoc2 | Bin 0 -> 1612 bytes corpus/rtl-page/candidate/synthetic.one | Bin 0 -> 45760 bytes corpus/rtl-page/cold/commands.jsonl | 3 + corpus/rtl-page/cold/machine.json | 1 + .../cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3780 bytes corpus/rtl-page/cold/notebook/synthetic.one | Bin 0 -> 45760 bytes ...0b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + corpus/rtl-page/cold/read/environment.json | 7 + corpus/rtl-page/cold/read/hierarchy.xml | 2 + .../cold/read/page-000.navigation.json | 13 + corpus/rtl-page/cold/read/page-000.png | Bin 0 -> 43273 bytes corpus/rtl-page/cold/read/page-000.xml | 31 + corpus/rtl-page/cold/read/payloads.json | 10 + corpus/rtl-page/cold/run.json | 18 + corpus/rtl-page/cold/scripts/cold.ps1 | 27 + corpus/rtl-page/cold/scripts/read.ps1 | 144 ++++ corpus/rtl-page/cold/source.json | 14 + corpus/rtl-page/cold/teardown.json | 1 + crates/canvas/Cargo.toml | 4 + crates/canvas/examples/reading_inventory.rs | 382 +++++++++ .../canvas/examples/unsupported_inventory.rs | 49 +- crates/canvas/src/conflict.rs | 44 +- crates/canvas/src/date.rs | 2 +- crates/canvas/src/document.rs | 10 +- crates/canvas/src/editor.rs | 248 +++--- crates/canvas/src/editor/equation.rs | 12 +- crates/canvas/src/editor/format.rs | 152 ++-- crates/canvas/src/editor/ink.rs | 78 +- crates/canvas/src/editor/link.rs | 35 +- crates/canvas/src/editor/ops.rs | 31 +- crates/canvas/src/editor/page.rs | 65 +- crates/canvas/src/editor/recording.rs | 4 +- crates/canvas/src/editor/space.rs | 23 +- crates/canvas/src/editor/table.rs | 196 ++--- crates/canvas/src/gpu/page.rs | 155 ++-- crates/canvas/src/gpu/page/background.rs | 15 +- crates/canvas/src/gpu/page/picture.rs | 8 +- .../canvas/src/interaction/accessibility.rs | 2 + crates/canvas/src/interaction/mod.rs | 128 ++- crates/canvas/src/interaction/scroll.rs | 42 +- crates/canvas/src/interaction/tests.rs | 14 + crates/canvas/src/language.rs | 2 +- crates/canvas/src/layout.rs | 30 +- crates/canvas/src/lib.rs | 11 + crates/canvas/src/math.rs | 8 +- crates/canvas/src/outline.rs | 52 +- crates/canvas/src/reading.rs | 638 +++++++++++++++ crates/canvas/src/search.rs | 65 +- crates/canvas/src/spelling.rs | 12 +- crates/canvas/tests/reading.rs | 90 +++ crates/canvas/tests/rtl_page.rs | 188 +++++ crates/draw/Cargo.toml | 16 +- crates/draw/src/draw.hlsl | 153 ++++ crates/draw/src/edit.rs | 18 +- crates/draw/src/lib.rs | 22 +- crates/draw/src/render.rs | 355 +++++---- crates/draw/src/render/d3d11.rs | 585 ++++++++++++++ crates/draw/src/render/dual.rs | 135 +++- crates/draw/src/render/dxbc/compile.ps1 | 52 ++ .../draw/src/render/dxbc/draw.fragment.dxbc | Bin 0 -> 11252 bytes crates/draw/src/render/dxbc/draw.vertex.dxbc | Bin 0 -> 1204 bytes .../src/render/dxbc/translucent.fragment.dxbc | Bin 0 -> 960 bytes .../src/render/dxbc/translucent.vertex.dxbc | Bin 0 -> 612 bytes crates/draw/src/render/gl.rs | 220 ++--- crates/draw/src/render/icon.rs | 82 +- crates/draw/src/render/pdf.rs | 69 +- crates/draw/src/render/translucent.hlsl | 21 + crates/draw/src/render/webgpu.rs | 346 ++++---- crates/mobile/Cargo.toml | 2 + crates/mobile/include/snowbound.h | 5 + crates/mobile/src/lib.rs | 159 ++-- crates/mobile/src/library.rs | 249 ++++-- crates/mobile/src/tests.rs | 26 +- crates/notebook/Cargo.toml | 10 +- crates/notebook/README.md | 65 +- crates/notebook/examples/document.rs | 11 - crates/notebook/examples/keystroke_probe.rs | 1 + crates/notebook/examples/open_probe.rs | 1 + crates/notebook/examples/save_probe.rs | 1 + crates/notebook/src/background.rs | 17 +- crates/notebook/src/base.rs | 14 + crates/notebook/src/discover.rs | 59 +- crates/notebook/src/discover/source.rs | 6 +- crates/notebook/src/lib.rs | 116 +-- crates/notebook/src/location.rs | 2 +- crates/notebook/src/migrate.rs | 1 + crates/notebook/src/package.rs | 236 ++++++ crates/notebook/src/queue.rs | 181 ++++- crates/notebook/src/recovery.rs | 33 +- crates/notebook/src/session.rs | 452 ++++++++--- crates/notebook/src/session/tests.rs | 123 +++ crates/notebook/src/sidecar/tests.rs | 4 + crates/notebook/src/smb/mod.rs | 31 +- crates/notebook/src/smb/tests.rs | 51 +- crates/notebook/src/sync.rs | 60 +- crates/notebook/src/worker.rs | 1 + crates/notebook/src/working.rs | 119 +-- crates/notebook/tests/cache.rs | 4 +- crates/notebook/tests/package.rs | 265 ++++++ crates/notebook/tests/protected.rs | 751 +++++++++++++++--- .../notebook/tests/support/page_schedule.rs | 50 +- crates/onestore/Cargo.toml | 15 +- crates/onestore/README.md | 70 +- crates/onestore/examples/scratch_dump.rs | 53 -- crates/onestore/src/active.rs | 11 +- crates/onestore/src/commit.rs | 57 +- crates/onestore/src/create.rs | 62 +- crates/onestore/src/document.rs | 5 - crates/onestore/src/identity.rs | 54 ++ crates/onestore/src/lib.rs | 5 +- crates/onestore/src/objects.rs | 11 +- crates/onestore/src/op/content.rs | 2 +- crates/onestore/src/op/lower.rs | 1 + crates/onestore/src/page/mod.rs | 5 + crates/onestore/src/protected/crypto.rs | 162 +++- crates/onestore/src/protected/mod.rs | 646 +++++++++------ crates/onestore/src/section.rs | 210 +++-- crates/onestore/src/section/versions.rs | 51 +- crates/onestore/src/toc.rs | 24 +- crates/onestore/src/write.rs | 296 ++++--- crates/onestore/tests/protected.rs | 447 +++++++---- crates/snowbound/Cargo.toml | 2 + crates/snowbound/assets/icons/info.svg | 10 + crates/snowbound/assets/icons/warning.svg | 8 + crates/snowbound/linux/onenote.xml | 1 + crates/snowbound/linux/package.sh | 30 +- crates/snowbound/src/aqua.rs | 25 +- crates/snowbound/src/art.rs | 2 + crates/snowbound/src/commands.rs | 129 ++- crates/snowbound/src/conflict_render.rs | 2 +- crates/snowbound/src/desktop_linux.rs | 2 +- crates/snowbound/src/history.rs | 86 +- crates/snowbound/src/icloud_linux.rs | 6 +- crates/snowbound/src/icloud_macos.rs | 9 +- crates/snowbound/src/keys.rs | 9 +- crates/snowbound/src/library.rs | 350 ++++---- crates/snowbound/src/link.rs | 17 +- crates/snowbound/src/linux.rs | 82 +- crates/snowbound/src/macos.rs | 78 +- crates/snowbound/src/main.rs | 557 +++++++------ crates/snowbound/src/manage.rs | 80 +- crates/snowbound/src/media_linux.rs | 24 +- crates/snowbound/src/menubar.rs | 12 + crates/snowbound/src/menus.rs | 149 +++- crates/snowbound/src/navigation.rs | 1 + crates/snowbound/src/options.rs | 66 ++ crates/snowbound/src/pane.rs | 2 +- crates/snowbound/src/prefetch.rs | 13 + crates/snowbound/src/print.rs | 195 ++++- crates/snowbound/src/properties.rs | 20 +- crates/snowbound/src/protection.rs | 642 +++++++++++++++ crates/snowbound/src/recycle.rs | 393 +++++++++ crates/snowbound/src/rename.rs | 6 +- crates/snowbound/src/save_as.rs | 271 +++++++ crates/snowbound/src/search.rs | 72 +- crates/snowbound/src/settings.rs | 26 + crates/snowbound/src/sidebar.rs | 58 +- crates/snowbound/src/spell_linux.rs | 7 +- crates/snowbound/src/surface_gl.rs | 22 +- crates/snowbound/src/surface_windows.rs | 90 ++- crates/snowbound/src/sync.rs | 525 +++++++++--- crates/snowbound/src/tags.rs | 24 +- crates/snowbound/src/themes.rs | 17 +- crates/snowbound/src/undo.rs | 112 ++- crates/snowbound/src/unpack.rs | 235 ++++++ crates/snowbound/src/unread.rs | 431 ++++++++++ crates/snowbound/src/update.rs | 285 ++++++- crates/snowbound/src/windows.rs | 118 ++- crates/snowbound/tests/replay.rs | 98 +++ crates/ui/src/layout.rs | 17 +- crates/ui/src/lib.rs | 62 +- crates/ui/src/popup.rs | 177 ++--- crates/ui/src/shell.rs | 24 +- crates/ui/src/tests.rs | 6 +- crates/ui/src/text.rs | 15 +- crates/ui/src/theme.rs | 8 +- crates/ui/src/widgets.rs | 40 +- fuzz/Cargo.lock | 240 ++++++ fuzz/Cargo.toml | 2 +- fuzz/fuzz_targets/canvas_editor.rs | 48 +- fuzz/fuzz_targets/offline_model.rs | 3 + fuzz/fuzz_targets/offline_page.rs | 3 + fuzz/fuzz_targets/protected.rs | 20 +- fuzz/fuzz_targets/protected_write.rs | 73 +- platform/linux/ar.sh | 2 + platform/linux/cargo.sh | 23 + platform/linux/cc.sh | 8 + platform/snow-leopard/Cargo.lock | 1 + platform/snow-leopard/probe/src/render.rs | 4 +- platform/snow-leopard/probe/src/text.rs | 4 +- tools/RELEASE.md | 32 +- tools/TESTING.md | 43 + tools/canvas/README.md | 2 + tools/canvas/build_macos.py | 5 +- tools/ci.py | 448 +++++++++++ tools/document_model.py | 12 +- tools/native/protected.ps1 | 42 + tools/native_protected.py | 63 ++ tools/release.py | 73 +- tools/test_notebook_package.py | 113 +++ tools/test_protected_sections.py | 131 +++ tools/test_recycle_bin_view.py | 68 ++ tools/test_release.py | 22 + tools/test_rtl_page.py | 31 + tools/verify-document.py | 23 +- 441 files changed, 15952 insertions(+), 4491 deletions(-) create mode 100644 apps/ios/Snowbound/Prototypes.swift create mode 100644 corpus/notebook-package/README.md create mode 100644 corpus/notebook-package/candidate/Packed.onepkg create mode 100644 corpus/notebook-package/candidate/Unpacked/Group/Inner.one create mode 100644 corpus/notebook-package/candidate/Unpacked/Group/Open Notebook.onetoc2 create mode 100644 corpus/notebook-package/candidate/Unpacked/New Section 1.one create mode 100644 corpus/notebook-package/candidate/Unpacked/Open Notebook.onetoc2 create mode 100644 corpus/notebook-package/cold/commands.jsonl create mode 100644 corpus/notebook-package/cold/machine.json create mode 100644 corpus/notebook-package/cold/notebook/Group/Inner.one create mode 100644 corpus/notebook-package/cold/notebook/Group/Open Notebook.onetoc2 create mode 100644 corpus/notebook-package/cold/notebook/New Section 1.one create mode 100644 corpus/notebook-package/cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/notebook-package/cold/read/environment.json create mode 100644 corpus/notebook-package/cold/read/hierarchy.xml create mode 100644 corpus/notebook-package/cold/read/page-000.navigation.json create mode 100644 corpus/notebook-package/cold/read/page-000.png create mode 100644 corpus/notebook-package/cold/read/page-000.xml create mode 100644 corpus/notebook-package/cold/read/page-001.navigation.json create mode 100644 corpus/notebook-package/cold/read/page-001.png create mode 100644 corpus/notebook-package/cold/read/page-001.xml create mode 100644 corpus/notebook-package/cold/read/payloads.json create mode 100644 corpus/notebook-package/cold/run.json create mode 100644 corpus/notebook-package/cold/scripts/cold.ps1 create mode 100644 corpus/notebook-package/cold/scripts/read.ps1 create mode 100644 corpus/notebook-package/cold/source.json create mode 100644 corpus/notebook-package/cold/teardown.json create mode 100644 corpus/notebook-package/native/Lab.onepkg create mode 100644 corpus/notebook-package/onenote-unpacked/hierarchy.xml create mode 100644 corpus/notebook-package/onenote-unpacked/unpack-dialog.png create mode 100644 corpus/notebook-package/onenote-unpacked/unpacked.png create mode 100644 corpus/notebook-package/save-as/candidate/Inner copy.one create mode 100644 corpus/notebook-package/save-as/candidate/Inside.one create mode 100644 corpus/notebook-package/save-as/cold/commands.jsonl create mode 100644 corpus/notebook-package/save-as/cold/machine.json create mode 100644 corpus/notebook-package/save-as/cold/notebook/Inner copy.one create mode 100644 corpus/notebook-package/save-as/cold/notebook/Inside.one create mode 100644 corpus/notebook-package/save-as/cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/notebook-package/save-as/cold/read/environment.json create mode 100644 corpus/notebook-package/save-as/cold/read/hierarchy.xml create mode 100644 corpus/notebook-package/save-as/cold/read/page-000.navigation.json create mode 100644 corpus/notebook-package/save-as/cold/read/page-000.png create mode 100644 corpus/notebook-package/save-as/cold/read/page-000.xml create mode 100644 corpus/notebook-package/save-as/cold/read/page-001.navigation.json create mode 100644 corpus/notebook-package/save-as/cold/read/page-001.png create mode 100644 corpus/notebook-package/save-as/cold/read/page-001.xml create mode 100644 corpus/notebook-package/save-as/cold/read/payloads.json create mode 100644 corpus/notebook-package/save-as/cold/run.json create mode 100644 corpus/notebook-package/save-as/cold/scripts/cold.ps1 create mode 100644 corpus/notebook-package/save-as/cold/scripts/read.ps1 create mode 100644 corpus/notebook-package/save-as/cold/source.json create mode 100644 corpus/notebook-package/save-as/cold/teardown.json create mode 100644 corpus/protected-sections/README.md create mode 100644 corpus/protected-sections/candidate/notebook/Changed.one create mode 100644 corpus/protected-sections/candidate/notebook/Conflicted.one create mode 100644 corpus/protected-sections/candidate/notebook/Edited.one create mode 100644 corpus/protected-sections/candidate/notebook/New Section 1.one create mode 100644 corpus/protected-sections/candidate/notebook/Open Notebook.onetoc2 create mode 100644 corpus/protected-sections/candidate/notebook/Protected.one create mode 100644 corpus/protected-sections/candidate/notebook/Removed.one create mode 100644 corpus/protected-sections/candidate/passwords.json create mode 100644 corpus/protected-sections/cold/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/protected-sections/cold/before-read/environment.json create mode 100644 corpus/protected-sections/cold/before-read/hierarchy.xml create mode 100644 corpus/protected-sections/cold/before-read/page-000.xml create mode 100644 corpus/protected-sections/cold/before-read/page-001.xml create mode 100644 corpus/protected-sections/cold/before-read/page-002.xml create mode 100644 corpus/protected-sections/cold/before-read/page-003.xml create mode 100644 corpus/protected-sections/cold/before-read/payloads.json create mode 100644 corpus/protected-sections/cold/commands.jsonl create mode 100644 corpus/protected-sections/cold/machine.json create mode 100644 corpus/protected-sections/cold/notebook/Changed.one create mode 100644 corpus/protected-sections/cold/notebook/Conflicted.one create mode 100644 corpus/protected-sections/cold/notebook/Edited.one create mode 100644 corpus/protected-sections/cold/notebook/New Section 1.one create mode 100644 corpus/protected-sections/cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/protected-sections/cold/notebook/Protected.one create mode 100644 corpus/protected-sections/cold/notebook/Removed.one create mode 100644 corpus/protected-sections/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/protected-sections/cold/read/environment.json create mode 100644 corpus/protected-sections/cold/read/hierarchy.xml create mode 100644 corpus/protected-sections/cold/read/page-000.xml create mode 100644 corpus/protected-sections/cold/read/page-001.xml create mode 100644 corpus/protected-sections/cold/read/page-002.xml create mode 100644 corpus/protected-sections/cold/read/page-003.xml create mode 100644 corpus/protected-sections/cold/read/page-004.xml create mode 100644 corpus/protected-sections/cold/read/page-005.xml create mode 100644 corpus/protected-sections/cold/read/page-006.xml create mode 100644 corpus/protected-sections/cold/read/page-007.xml create mode 100644 corpus/protected-sections/cold/read/page-008.xml create mode 100644 corpus/protected-sections/cold/read/page-009.xml create mode 100644 corpus/protected-sections/cold/read/page-010.xml create mode 100644 corpus/protected-sections/cold/read/page-011.xml create mode 100644 corpus/protected-sections/cold/read/page-012.xml create mode 100644 corpus/protected-sections/cold/read/page-013.xml create mode 100644 corpus/protected-sections/cold/read/page-014.xml create mode 100644 corpus/protected-sections/cold/read/page-015.xml create mode 100644 corpus/protected-sections/cold/read/payloads.json create mode 100644 corpus/protected-sections/cold/run.json create mode 100644 corpus/protected-sections/cold/scripts/cold.ps1 create mode 100644 corpus/protected-sections/cold/scripts/read.ps1 create mode 100644 corpus/protected-sections/cold/source.json create mode 100644 corpus/protected-sections/cold/teardown.json create mode 100644 corpus/protected-sections/cold/unlock-Changed.json create mode 100644 corpus/protected-sections/cold/unlock-Changed.png create mode 100644 corpus/protected-sections/cold/unlock-Conflicted.json create mode 100644 corpus/protected-sections/cold/unlock-Conflicted.png create mode 100644 corpus/protected-sections/cold/unlock-Edited.json create mode 100644 corpus/protected-sections/cold/unlock-Edited.png create mode 100644 corpus/protected-sections/cold/unlock-Protected.json create mode 100644 corpus/protected-sections/cold/unlock-Protected.png create mode 100644 corpus/protected-sections/manifest.json create mode 100644 corpus/protected-sections/native/changed.one create mode 100644 corpus/protected-sections/native/observed/onenote-change-password.png create mode 100644 corpus/protected-sections/native/observed/onenote-locked-page.png create mode 100644 corpus/protected-sections/native/observed/onenote-options-lock-after.png create mode 100644 corpus/protected-sections/native/observed/onenote-options-passwords.png create mode 100644 corpus/protected-sections/native/observed/onenote-pane-protected.png create mode 100644 corpus/protected-sections/native/observed/onenote-relocks-after-remote-password-change.png create mode 100644 corpus/protected-sections/native/observed/onenote-remove-password.png create mode 100644 corpus/protected-sections/native/observed/onenote-search-locked.png create mode 100644 corpus/protected-sections/native/observed/onenote-set-password.png create mode 100644 corpus/protected-sections/native/observed/onenote-tags-locked.png create mode 100644 corpus/protected-sections/native/observed/onenote-tags-unlocked.png create mode 100644 corpus/protected-sections/native/observed/onenote-unlock-dialog.png create mode 100644 corpus/protected-sections/native/observed/onenote-unlock-wrong.png create mode 100644 corpus/protected-sections/native/observed/onenote-unlocked-shows-locked-append.png create mode 100644 corpus/protected-sections/native/protected.one create mode 100644 corpus/protected-sections/native/removed.one create mode 100644 corpus/protected-sections/native/snowbound-changed-then-onenote-edit.one create mode 100644 corpus/protected-sections/source/synthetic.one create mode 100644 corpus/recycle-bin-view/README.md create mode 100644 corpus/recycle-bin-view/candidate/after/New Section 1.one create mode 100644 corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/OneNote_DeletedPages.one create mode 100644 corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/candidate/after/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/candidate/after/Restored.one create mode 100644 corpus/recycle-bin-view/candidate/before/New Section 1.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Back.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Copied.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Emptied.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/OneNote_DeletedPages.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Purged.one create mode 100644 corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Restored.one create mode 100644 corpus/recycle-bin-view/candidate/before/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/cold/after/commands.jsonl create mode 100644 corpus/recycle-bin-view/cold/after/machine.json create mode 100644 corpus/recycle-bin-view/cold/after/notebook/New Section 1.one create mode 100644 corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one create mode 100644 corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/cold/after/notebook/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/cold/after/notebook/Restored.one create mode 100644 corpus/recycle-bin-view/cold/after/read/environment.json create mode 100644 corpus/recycle-bin-view/cold/after/read/hierarchy.xml create mode 100644 corpus/recycle-bin-view/cold/after/read/page-000.navigation.json create mode 100644 corpus/recycle-bin-view/cold/after/read/page-000.png create mode 100644 corpus/recycle-bin-view/cold/after/read/page-000.xml create mode 100644 corpus/recycle-bin-view/cold/after/read/page-001.navigation.json create mode 100644 corpus/recycle-bin-view/cold/after/read/page-001.png create mode 100644 corpus/recycle-bin-view/cold/after/read/page-001.xml create mode 100644 corpus/recycle-bin-view/cold/after/read/page-002.navigation.json create mode 100644 corpus/recycle-bin-view/cold/after/read/page-002.png create mode 100644 corpus/recycle-bin-view/cold/after/read/page-002.xml create mode 100644 corpus/recycle-bin-view/cold/after/read/page-003.navigation.json create mode 100644 corpus/recycle-bin-view/cold/after/read/page-003.png create mode 100644 corpus/recycle-bin-view/cold/after/read/page-003.xml create mode 100644 corpus/recycle-bin-view/cold/after/read/payloads.json create mode 100644 corpus/recycle-bin-view/cold/after/run.json create mode 100644 corpus/recycle-bin-view/cold/after/scripts/cold.ps1 create mode 100644 corpus/recycle-bin-view/cold/after/scripts/read.ps1 create mode 100644 corpus/recycle-bin-view/cold/after/source.json create mode 100644 corpus/recycle-bin-view/cold/after/teardown.json create mode 100644 corpus/recycle-bin-view/cold/before/commands.jsonl create mode 100644 corpus/recycle-bin-view/cold/before/machine.json create mode 100644 corpus/recycle-bin-view/cold/before/notebook/New Section 1.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Back.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Copied.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Emptied.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Purged.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Restored.one create mode 100644 corpus/recycle-bin-view/cold/before/notebook/Open Notebook.onetoc2 create mode 100644 corpus/recycle-bin-view/cold/before/read/environment.json create mode 100644 corpus/recycle-bin-view/cold/before/read/hierarchy.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-000.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-000.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-000.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-001.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-001.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-001.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-002.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-002.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-002.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-003.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-003.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-003.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-004.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-004.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-004.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-005.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-005.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-005.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-006.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-006.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-006.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-007.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-007.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-007.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/page-008.navigation.json create mode 100644 corpus/recycle-bin-view/cold/before/read/page-008.png create mode 100644 corpus/recycle-bin-view/cold/before/read/page-008.xml create mode 100644 corpus/recycle-bin-view/cold/before/read/payloads.json create mode 100644 corpus/recycle-bin-view/cold/before/run.json create mode 100644 corpus/recycle-bin-view/cold/before/scripts/cold.ps1 create mode 100644 corpus/recycle-bin-view/cold/before/scripts/read.ps1 create mode 100644 corpus/recycle-bin-view/cold/before/source.json create mode 100644 corpus/recycle-bin-view/cold/before/teardown.json create mode 100644 corpus/rtl-page/README.md create mode 100644 corpus/rtl-page/candidate/Open Notebook.onetoc2 create mode 100644 corpus/rtl-page/candidate/synthetic.one create mode 100644 corpus/rtl-page/cold/commands.jsonl create mode 100644 corpus/rtl-page/cold/machine.json create mode 100644 corpus/rtl-page/cold/notebook/Open Notebook.onetoc2 create mode 100644 corpus/rtl-page/cold/notebook/synthetic.one create mode 100644 corpus/rtl-page/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment create mode 100644 corpus/rtl-page/cold/read/environment.json create mode 100644 corpus/rtl-page/cold/read/hierarchy.xml create mode 100644 corpus/rtl-page/cold/read/page-000.navigation.json create mode 100644 corpus/rtl-page/cold/read/page-000.png create mode 100644 corpus/rtl-page/cold/read/page-000.xml create mode 100644 corpus/rtl-page/cold/read/payloads.json create mode 100644 corpus/rtl-page/cold/run.json create mode 100644 corpus/rtl-page/cold/scripts/cold.ps1 create mode 100644 corpus/rtl-page/cold/scripts/read.ps1 create mode 100644 corpus/rtl-page/cold/source.json create mode 100644 corpus/rtl-page/cold/teardown.json create mode 100644 crates/canvas/examples/reading_inventory.rs create mode 100644 crates/canvas/src/reading.rs create mode 100644 crates/canvas/tests/reading.rs create mode 100644 crates/canvas/tests/rtl_page.rs create mode 100644 crates/draw/src/draw.hlsl create mode 100644 crates/draw/src/render/d3d11.rs create mode 100644 crates/draw/src/render/dxbc/compile.ps1 create mode 100644 crates/draw/src/render/dxbc/draw.fragment.dxbc create mode 100644 crates/draw/src/render/dxbc/draw.vertex.dxbc create mode 100644 crates/draw/src/render/dxbc/translucent.fragment.dxbc create mode 100644 crates/draw/src/render/dxbc/translucent.vertex.dxbc create mode 100644 crates/draw/src/render/translucent.hlsl create mode 100644 crates/notebook/src/package.rs create mode 100644 crates/notebook/src/session/tests.rs create mode 100644 crates/notebook/tests/package.rs delete mode 100644 crates/onestore/examples/scratch_dump.rs create mode 100644 crates/onestore/src/identity.rs create mode 100644 crates/snowbound/assets/icons/info.svg create mode 100644 crates/snowbound/assets/icons/warning.svg create mode 100644 crates/snowbound/src/protection.rs create mode 100644 crates/snowbound/src/recycle.rs create mode 100644 crates/snowbound/src/save_as.rs create mode 100644 crates/snowbound/src/unpack.rs create mode 100644 crates/snowbound/src/unread.rs create mode 100755 platform/linux/ar.sh create mode 100755 platform/linux/cargo.sh create mode 100755 platform/linux/cc.sh create mode 100644 tools/ci.py create mode 100644 tools/native/protected.ps1 create mode 100644 tools/native_protected.py create mode 100644 tools/test_notebook_package.py create mode 100644 tools/test_protected_sections.py create mode 100644 tools/test_recycle_bin_view.py create mode 100644 tools/test_rtl_page.py diff --git a/Cargo.lock b/Cargo.lock index e20e679dbdee903dedff8325f5612f9c093525ea..3a62b4bc78dca8915ff60716e6ac1f108275aa8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -563,6 +563,12 @@ dependencies = [ "syn 3.0.5", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "byteorder-lite" version = "0.1.0" @@ -575,6 +581,18 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +[[package]] +name = "cab" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171228650e6721d5acc0868a462cd864f49ac5f64e4a42cde270406e64e404d2" +dependencies = [ + "byteorder", + "flate2", + "lzxd", + "time", +] + [[package]] name = "calloop" version = "0.13.0" @@ -900,6 +918,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + [[package]] name = "digest" version = "0.11.3" @@ -987,6 +1011,7 @@ dependencies = [ "subsetter", "swash", "wgpu", + "windows", ] [[package]] @@ -1849,6 +1874,12 @@ dependencies = [ "twox-hash", ] +[[package]] +name = "lzxd" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17f346186eccb574ba5581acefc514f0c70a642db4f96e245034a0a158a7168" + [[package]] name = "md-5" version = "0.11.0" @@ -1946,6 +1977,7 @@ dependencies = [ "serde_json", "tempfile", "wgpu", + "zeroize", ] [[package]] @@ -2042,6 +2074,11 @@ dependencies = [ name = "notebook" version = "0.1.0" dependencies = [ + "aes-gcm", + "base64 0.22.1", + "cab", + "getrandom 0.4.3", + "hmac", "libc", "nix", "onestore", @@ -2067,6 +2104,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + [[package]] name = "num-traits" version = "0.2.19" @@ -2747,6 +2790,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "presser" version = "0.3.1" @@ -3392,6 +3441,7 @@ dependencies = [ "windows-sys 0.61.2", "winit", "zbus", + "zeroize", ] [[package]] @@ -3591,6 +3641,25 @@ dependencies = [ "zune-jpeg", ] +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + [[package]] name = "tiny-skia" version = "0.11.4" diff --git a/apps/ios/Snowbound.xcodeproj/project.pbxproj b/apps/ios/Snowbound.xcodeproj/project.pbxproj index 494656c41f48fbe70e14f43441d296196416928c..6da247470093f069e0f90697945b417c770146c0 100644 --- a/apps/ios/Snowbound.xcodeproj/project.pbxproj +++ b/apps/ios/Snowbound.xcodeproj/project.pbxproj @@ -7,14 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - 5B0000000000000000000101 /* Sample in Resources */ = {isa = PBXBuildFile; fileRef = 5B0000000000000000000201 /* Sample */; }; 5B0000000000000000000126 /* Snowbound Guide in Resources */ = {isa = PBXBuildFile; fileRef = 5B0000000000000000000226 /* Snowbound Guide */; }; 5B0000000000000000000102 /* Snowbound-Tahoe.icon in Resources */ = {isa = PBXBuildFile; fileRef = 5B0000000000000000000205 /* Snowbound-Tahoe.icon */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 5B0000000000000000000200 /* Snowbound.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Snowbound.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5B0000000000000000000201 /* Sample */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Sample; path = "../../corpus/m6/native-features-01/notebook"; sourceTree = SOURCE_ROOT; }; 5B0000000000000000000226 /* Snowbound Guide */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "Snowbound Guide"; path = "../../docs/guide-notebook/Snowbound Guide"; sourceTree = SOURCE_ROOT; }; 5B0000000000000000000202 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5B0000000000000000000203 /* Snowbound-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Snowbound-Bridging-Header.h"; sourceTree = ""; }; @@ -45,7 +43,6 @@ isa = PBXGroup; children = ( 5B0000000000000000000300 /* Snowbound */, - 5B0000000000000000000201 /* Sample */, 5B0000000000000000000226 /* Snowbound Guide */, 5B0000000000000000000205 /* Snowbound-Tahoe.icon */, 5B0000000000000000000202 /* Info.plist */, @@ -126,7 +123,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5B0000000000000000000101 /* Sample in Resources */, 5B0000000000000000000126 /* Snowbound Guide in Resources */, 5B0000000000000000000102 /* Snowbound-Tahoe.icon in Resources */, ); diff --git a/apps/ios/Snowbound/App.swift b/apps/ios/Snowbound/App.swift index f9b5ac77699c548fc50618072c125d7093e55f84..5a3f12581274e1c45c1c4c80923398f4f73d22cf 100644 --- a/apps/ios/Snowbound/App.swift +++ b/apps/ios/Snowbound/App.swift @@ -150,6 +150,8 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewContro private let notebooks = NotebooksViewController() private let pages = PagesViewController() private var showingPage = false + /// A first launch opened a page by itself. + private var landed = false private var background = UIBackgroundTaskIdentifier.invalid func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options: UIScene.ConnectionOptions) { @@ -203,8 +205,15 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewContro } return } - guard let place = Place.saved, place.notebook == notebook.id, - let tab = notebook.tabs.first(where: { $0.path == place.section }) + guard let place = Place.saved else { + // The first notebook found opens at its first page, as Notes opens on a note. + guard Prototype.welcome, !landed, let tab = notebook.tabs.first(where: \.readable) else { return } + landed = true + return open(tab, of: notebook) { [weak self] section in + if let page = section.rows.first { self?.show(section: section, page: page.id) } + } + } + guard place.notebook == notebook.id, let tab = notebook.tabs.first(where: { $0.path == place.section }) else { return } open(tab, of: notebook, page: place.page) } @@ -213,7 +222,8 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewContro _ tab: Tab, of notebook: Notebook, page: String? = nil, reveal: Reveal? = nil, then: ((Section) -> Void)? = nil ) { - guard Author.name != nil else { + // The welcome prototype asks at the first edit instead. + guard Author.name != nil || Prototype.welcome else { return Author.ask(from: split) { [weak self] in self?.open(tab, of: notebook, page: page, reveal: reveal, then: then) } @@ -223,7 +233,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewContro Section.open(tab, of: notebook) { [weak self] section, problem in guard let self else { return } guard let section else { - pages.failed(tab, problem) + pages.failed(problem) return } pages.load(section) @@ -300,7 +310,8 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, UISplitViewContro /// Composition ends and every edit is stored and published while the system allows. func sceneDidEnterBackground(_ scene: UIScene) { NotificationCenter.default.post(name: PageViewController.leaving, object: nil) - for notebook in Notebooks.all { notebook.pause() } + // Protected sections open again only once unlocked. + for notebook in Notebooks.all { notebook.pause(); notebook.lockAll() } let sections = Section.all guard !sections.isEmpty, background == .invalid else { return } background = UIApplication.shared.beginBackgroundTask(withName: "Saving") { [weak self] in diff --git a/apps/ios/Snowbound/CanvasView.swift b/apps/ios/Snowbound/CanvasView.swift index b2ed72e138d477a6cd0af10a4eba8e5cfde9c44a..fa18181abb96ee5c25c55b192731f2100eeb97b4 100644 --- a/apps/ios/Snowbound/CanvasView.swift +++ b/apps/ios/Snowbound/CanvasView.swift @@ -81,6 +81,11 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI private var origin = CGPoint.zero private var syncing = false private var scrolled = false + private var drag: Drag? + /// The zoom and finger spread a pinch started from. + private var pinchStart: (zoom: CGFloat, spread: CGFloat)? + private var inDetent = false + private let detentTick = UISelectionFeedbackGenerator() /// How far right of the content's corner a page opens. private var left: CGFloat = 0 /// The zoom a double tap returns to. @@ -230,7 +235,7 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI paper() sync() let skip = margin - resting = openingZoom() + resting = openingZoom(skipping: skip) zoomScale = resting left = skip * resting home() @@ -301,12 +306,14 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI dirty = true } - /// The zoom the reader last pinched to, within reason; before that, 100%, where OneNote's - /// 11 pt body text shows at 17 points. - private func openingZoom() -> CGFloat { - guard let zoom = UserDefaults.standard.object(forKey: Self.zoomKey) as? Double else { return 1 } - // A page opens readable however far the last one was pinched. - return min(2, max(0.75, zoom)) + /// The zoom the reader last pinched to, within reason, or before that 100%, where OneNote's + /// 11 pt body text shows at 17 points; less where that fits the page right of `skip` + /// across the screen. + private func openingZoom(skipping skip: CGFloat) -> CGFloat { + let pinched = UserDefaults.standard.object(forKey: Self.zoomKey) as? CGFloat ?? 1 + let fit = bounds.inset(by: safeAreaInsets).width / max(1, content.bounds.width - skip) + // A page opens readable however far the last one was pinched or however wide it is. + return max(0.75, min(2, pinched, fit)) } /// The empty page left of its first outline, which a phone skips on opening, keeping @@ -329,22 +336,114 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI if !scrolled { contentOffset = CGPoint(x: left - adjustedContentInset.left, y: -adjustedContentInset.top) } } - func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { scrolled = true } - func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrolled = true } + /// A drag that starts within 30° of an axis sticks to it; a 24-point stretch of the + /// finger more than 40° off it lets go, and the page catches up over the next 48 points. + private struct Drag { + static let snap = tan(CGFloat.pi / 6) + static let release = tan(CGFloat.pi * 2 / 9) + static let stretch: CGFloat = 24 + static let catchUp: CGFloat = 48 + + /// The axis the lock holds still. + let cross: WritableKeyPath + var locked = true + /// The offset last shown, from which the scroll view's next step is measured. + var offset: CGPoint + /// The translation where the stretch of the gesture being judged began. + var stretch: CGPoint + /// How far the held axis trails the finger. + var lag: CGFloat = 0 + } + + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + scrolled = true + let moved = panGestureRecognizer.translation(in: self) + let cross: WritableKeyPath? = + abs(moved.x) <= abs(moved.y) * Drag.snap ? \.x : abs(moved.y) <= abs(moved.x) * Drag.snap ? \.y : nil + drag = cross.map { Drag(cross: $0, offset: contentOffset, stretch: moved) } + } + + func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { + scrolled = true + drag = nil + pinchStart = spread.map { (zoomScale, $0) } + inDetent = abs(log(zoomScale)) < Self.detent + detentTick.prepare() + } + func viewForZooming(in scrollView: UIScrollView) -> UIView? { content } - func scrollViewDidScroll(_ scrollView: UIScrollView) { transform() } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if var drag, isDragging || isDecelerating, !isZooming { + let cross = drag.cross + let along = cross == \CGPoint.x ? \CGPoint.y : \CGPoint.x + var offset = contentOffset + let step = offset[keyPath: cross] - drag.offset[keyPath: cross] + if drag.locked { + drag.lag += step + offset[keyPath: cross] = drag.offset[keyPath: cross] + let moved = panGestureRecognizer.translation(in: self) + let stretch = CGPoint(x: moved.x - drag.stretch.x, y: moved.y - drag.stretch.y) + if isTracking, hypot(stretch.x, stretch.y) >= Drag.stretch { + drag.locked = abs(stretch[keyPath: cross]) <= abs(stretch[keyPath: along]) * Drag.release + drag.stretch = moved + } + } else { + let travel = hypot(step, offset[keyPath: along] - drag.offset[keyPath: along]) + let paid = drag.lag * (1 - exp(-travel / Drag.catchUp)) + offset[keyPath: cross] += paid + drag.lag -= paid + } + drag.offset = offset + self.drag = drag.locked || abs(drag.lag) >= 0.5 ? drag : nil + if offset != contentOffset { contentOffset = offset } + } + transform() + } + + /// How far apart a pinch's two fingers are. + private var spread: CGFloat? { + guard let pinch = pinchGestureRecognizer, pinch.numberOfTouches == 2 else { return nil } + let a = pinch.location(ofTouch: 0, in: self), b = pinch.location(ofTouch: 1, in: self) + return hypot(a.x - b.x, a.y - b.y) + } + + /// How far either side of 100% a pinch sticks, as a log of the zoom. + private static let detent = log(CGFloat(1.1)) + + /// Pinching near 100% sticks there: within `detent` of it the zoom follows the fingers + /// on a curve flat at 100% that meets them again at the band's edges. func scrollViewDidZoom(_ scrollView: UIScrollView) { + if let pinch = pinchGestureRecognizer, pinch.state == .changed, let pinchStart, let spread { + // The scroll view's pinch reports the zoom it shows, so the fingers give the raw one. + let raw = log(pinchStart.zoom * spread / pinchStart.spread) + let x = abs(raw) / Self.detent + if x < 1 { + if !inDetent { detentTick.selectionChanged() } + let shown = exp(Self.detent * x * x * (2 - x) * (raw < 0 ? -1 : 1)) + if abs(shown - zoomScale) > 0.0001 { + let focus = pinch.location(in: content) + let screen = CGPoint(x: pinch.location(in: self).x - contentOffset.x, y: pinch.location(in: self).y - contentOffset.y) + zoomScale = shown + contentOffset = CGPoint(x: focus.x * shown - screen.x, y: focus.y * shown - screen.y) + } + } + inDetent = x < 1 + } transform() // Scrolling carries the caret and handles along; zooming moves them within the page. display.setNeedsSelectionUpdate() } func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) { + pinchStart = nil if tapZooming { tapZooming = false } else { - resting = scale - UserDefaults.standard.set(Double(scale), forKey: Self.zoomKey) + // A pinch let go within the detent settles on 100%. + resting = abs(log(scale)) < Self.detent ? 1 : scale + if resting != scale { setZoomScale(resting, animated: true) } + UserDefaults.standard.set(Double(resting), forKey: Self.zoomKey) } } @@ -694,8 +793,10 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI edit(external: true) { sb_delete_backward(handle) } } - /// Runs a change to the page, telling the system when it did not ask for it. - private func edit(external: Bool = false, _ change: () -> Bool) { + /// Runs a change to the page, telling the system when it did not ask for it; returns + /// whether it changed. + @discardableResult + private func edit(external: Bool = false, _ change: () -> Bool) -> Bool { if external { inputDelegate?.selectionWillChange(self) inputDelegate?.textWillChange(self) @@ -712,6 +813,7 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI } display.setNeedsSelectionUpdate() changedSelection() + return changed } /// Tells the bar buttons and the format bar what the selection now has. @@ -736,6 +838,10 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI override var inputAccessoryView: UIView? { formatBar } override func becomeFirstResponder() -> Bool { + if Prototype.welcome, Author.name == nil, let controller = window?.rootViewController { + Prototype.askName(from: controller) { [weak self] in _ = self?.becomeFirstResponder() } + return false + } guard super.becomeFirstResponder() else { return false } if let handle { sb_view_focus(handle, true) } display.isActivated = true @@ -876,6 +982,37 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI /// A conflict page, which shows what is stored and takes no edits. var readOnly: Bool { handle.map(sb_view_read_only) ?? false } + /// The column a reading view fills: the screen's width less the room tags hang in. + private var readingWidth: Float { Float(bounds.inset(by: safeAreaInsets).width - 34 - 12) } + + /// Whether the page has a reading view here, and how it reads or why not. + var reading: (offered: Bool, verdict: String)? { + struct Reading: Decodable { + let offered: Bool + let verdict: String + } + guard let handle, let read = decode(Reading.self, sb_view_reading(handle, readingWidth)) else { return nil } + return (read.offered, read.verdict) + } + + /// Whether the page shows reflowed, as `showReading` left it. + private(set) var readingShown = false + + /// Shows the page reflowed into the screen's width at 100%, read-only, or as laid out. + func showReading(_ on: Bool) { + guard let handle else { return } + _ = resignFirstResponder() + readingShown = sb_view_set_reading(handle, on ? readingWidth : 0) + zoomScale = 1 + resting = 1 + scrolled = false + sync() + left = margin + home() + dirty = true + onChange?() + } + /// The title as typed; nil on a page without an editable title. var pageTitle: String? { handle.flatMap { take(sb_view_title($0)) } } @@ -933,11 +1070,7 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI /// Selects paragraph `id` and brings it into view. func selectParagraph(_ id: String) -> Bool { guard let handle else { return false } - var found = false - edit(external: true) { - found = sb_view_select_paragraph(handle, id) - return found - } + let found = edit(external: true) { sb_view_select_paragraph(handle, id) } if found { reveal(selectedTextRange.map { firstRect(for: $0) } ?? .zero) } return found } @@ -966,11 +1099,7 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI /// Selects the first place `query` occurs and brings it into view. func find(_ query: String) -> Bool { guard let handle else { return false } - var found = false - edit(external: true) { - found = sb_view_find(handle, query) - return found - } + let found = edit(external: true) { sb_view_find(handle, query) } if found { reveal(selectedTextRange.map { firstRect(for: $0) } ?? .zero) } return found } @@ -978,12 +1107,7 @@ final class CanvasView: UIScrollView, UIScrollViewDelegate, UITextInput, UITextI /// Puts the caret at the end of the page title. func focusTitle() -> Bool { guard let handle else { return false } - var focused = false - edit(external: true) { - focused = sb_view_focus_title(handle) - return focused - } - return focused + return edit(external: true) { sb_view_focus_title(handle) } } /// A photo as OneNote 2010 can read it: JPEG, at most 2048 pixels across, shown at most diff --git a/apps/ios/Snowbound/ICloud.swift b/apps/ios/Snowbound/ICloud.swift index 62fdc27a8fb43e443df4ebefd25ca87cc3e2f802..fbe77e22b30191a421013df06a1fd931acc22bf8 100644 --- a/apps/ios/Snowbound/ICloud.swift +++ b/apps/ios/Snowbound/ICloud.swift @@ -78,6 +78,12 @@ enum ICloud { /// Looks the folder up off the main thread, as asking iCloud can take a while. static func lookUp() { background({ () -> URL? in + #if DEBUG + // A simulator signs into no account; `SNOWBOUND_ICLOUD` names a folder standing in. + if let folder = ProcessInfo.processInfo.environment["SNOWBOUND_ICLOUD"] { + return URL(fileURLWithPath: folder, isDirectory: true) + } + #endif guard let container = FileManager.default.url(forUbiquityContainerIdentifier: identifier)? .appendingPathComponent("Documents", isDirectory: true) diff --git a/apps/ios/Snowbound/Lists.swift b/apps/ios/Snowbound/Lists.swift index 136f9b12ccc0bf434edc0a7652c94372f5dbd8c5..725d16780fff5ca43cefc58209e6722178606fea 100644 --- a/apps/ios/Snowbound/Lists.swift +++ b/apps/ios/Snowbound/Lists.swift @@ -133,6 +133,13 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke func reload() { guard isViewLoaded else { return } + if Prototype.welcome { + let welcome = Prototype.welcome( + new: { [weak self] in self?.newNotebook(inCloud: ICloud.documents != nil) }, + openFolder: { [weak self] in self?.openFolder() }, connect: { [weak self] in self?.connect() }) + contentUnavailableConfiguration = welcome + if welcome != nil { return dataSource.apply(.init(), animatingDifferences: false) } + } let copied = Notebooks.onDevice.contains { $0.source == .documents(path: Notebooks.guide) } let guide: [Item] = Notebooks.guideOffered && !copied ? [.guide] : [] let cloud: [(Location, [Notebook], [Item])] = @@ -186,6 +193,14 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke reload() } + /// Lists the notebooks again and opens the first section of the one from `source`. + private func rescan(opening source: Source) { + rescan { [weak self] notebook in + guard notebook.source == source, let tab = notebook.tabs.first(where: \.readable) else { return } + self?.onOpen?(tab, notebook) + } + } + private func showOnDevice(_ shown: Bool) { Notebooks.showsOnDevice = shown rescan() @@ -239,7 +254,9 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke content.image = UIImage( systemName: tab.readable ? "rectangle.portrait.fill" : tab.downloading ? "icloud.and.arrow.down" : "lock.fill") content.imageProperties.tintColor = tab.uiColor - if !tab.readable { + if tab.locked { + content.secondaryText = "Password protected" + } else if !tab.readable { content.secondaryText = tab.downloading ? "Downloading…" : tab.problem ?? "Can’t be opened here" content.textProperties.color = .secondaryLabel } @@ -370,7 +387,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke return closed ? nil : problem ?? "" }) { [weak self] problem in if let problem { - self?.refuse(title, problem) + self?.alert(title, problem) return } notebook.pause() @@ -387,7 +404,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke isFile ? name + "." + folder.pathExtension : name) guard target != folder else { return } guard !FileManager.default.fileExists(atPath: target.path) else { - self?.refuse("“\(name)” Already Exists", "Choose a different name.") + self?.alert("“\(name)” Already Exists", "Choose a different name.") return } self?.close(notebook, refusing: "Can’t Rename") { @@ -395,7 +412,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke try FileManager.default.moveItem(at: folder, to: target) _ = sb_notebook_moved(cacheDirectory.path, folder.path, target.path, nil) } catch { - self?.refuse("Can’t Rename", error.localizedDescription) + self?.alert("Can’t Rename", error.localizedDescription) } self?.rescan() } @@ -406,10 +423,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke field.clearButtonMode = .whileEditing NotificationCenter.default.addObserver( forName: UITextField.textDidChangeNotification, object: field, queue: .main - ) { _ in - let name = (field.text ?? "").trimmingCharacters(in: .whitespaces) - rename.isEnabled = !name.isEmpty && !name.hasPrefix(".") && !name.contains("/") - } + ) { _ in rename.isEnabled = Self.namesFile(field) } } alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) alert.addAction(rename) @@ -417,11 +431,17 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke present(alert, animated: true) } + /// Whether `field` holds a name a notebook's folder can take. + private static func namesFile(_ field: UITextField) -> Bool { + let name = (field.text ?? "").trimmingCharacters(in: .whitespaces) + return !name.isEmpty && !name.hasPrefix(".") && !name.contains("/") + } + /// Copies the notebook beside itself, named as Files names a duplicate. private func duplicate(_ folder: URL, of notebook: Notebook) { // The copy takes what the open sections have stored. for section in Section.all where section.notebook === notebook && !section.flush(10) { - return refuse("Can’t Duplicate", "Some changes haven’t been saved to the notebook yet.") + return alert("Can’t Duplicate", "Some changes haven’t been saved to the notebook yet.") } let base = folder.deletingPathExtension().lastPathComponent let ext = folder.pathExtension @@ -436,7 +456,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke do { try FileManager.default.copyItem(at: folder, to: target) } catch { return error.localizedDescription } return nil }) { [weak self] problem in - if let problem { self?.refuse("Can’t Duplicate", problem) } + if let problem { self?.alert("Can’t Duplicate", problem) } self?.rescan() } } @@ -475,7 +495,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke }) alert.addAction(UIAlertAction(title: "Delete", style: .destructive) { [weak self] _ in do { try FileManager.default.removeItem(at: folder) } catch { - self?.refuse("Can’t Delete", error.localizedDescription) + self?.alert("Can’t Delete", error.localizedDescription) } self?.rescan() }) @@ -495,7 +515,8 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke guard let item = dataSource.itemIdentifier(for: indexPath) else { return false } switch item { case .section(let id, let path): - return notebook(id)?.tabs.first(where: { $0.path == path })?.readable == true + let tab = notebook(id)?.tabs.first(where: { $0.path == path }) + return tab?.readable == true || tab?.locked == true case .status(let id): guard let notebook = notebook(id), notebook.problem != nil else { return false } let spinner = UIActivityIndicatorView(style: .medium) @@ -532,9 +553,36 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke guard case .section(let id, let path) = dataSource.itemIdentifier(for: indexPath), let notebook = notebook(id), let tab = notebook.tabs.first(where: { $0.path == path }) else { return } + if tab.locked { return unlock(tab, of: notebook, wrong: false) } onOpen?(tab, notebook) } + /// Asks for a protected section's password, as OneNote's Protected Section dialog does, + /// and opens it once unlocked. + private func unlock(_ tab: Tab, of notebook: Notebook, wrong: Bool) { + let alert = UIAlertController( + title: "Protected Section", + message: wrong ? "Password is incorrect." : "Section “\(tab.name)” is password protected.", + preferredStyle: .alert) + alert.addTextField { field in + field.isSecureTextEntry = true + field.placeholder = "Password" + } + alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) + alert.addAction(UIAlertAction(title: "OK", style: .default) { [weak self, weak alert] _ in + let password = alert?.textFields?.first?.text ?? "" + notebook.unlock(tab.path, password: password) { unlocked in + self?.reload() + if unlocked, let opened = notebook.tabs.first(where: { $0.path == tab.path }) { + self?.onOpen?(opened, notebook) + } else { + self?.unlock(tab, of: notebook, wrong: true) + } + } + }) + present(alert, animated: true) + } + private func add(_ notebook: Notebook) { Notebooks.add(notebook) openFirstSection(of: notebook) @@ -572,10 +620,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke field.autocapitalizationType = .words NotificationCenter.default.addObserver( forName: UITextField.textDidChangeNotification, object: field, queue: .main - ) { _ in - let name = (field.text ?? "").trimmingCharacters(in: .whitespaces) - create.isEnabled = !name.isEmpty && !name.hasPrefix(".") && !name.contains("/") - } + ) { _ in create.isEnabled = Self.namesFile(field) } } alert.addAction(UIAlertAction(title: "Cancel", style: .cancel)) alert.addAction(create) @@ -587,7 +632,7 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke let place = inCloud ? ICloud.documents : documentsDirectory guard let folder = place?.appendingPathComponent(name) else { return } guard !FileManager.default.fileExists(atPath: folder.path) else { - return refuse("“\(name)” Already Exists", "Choose a different name.") + return alert("“\(name)” Already Exists", "Choose a different name.") } let (date, time) = titleDate() background({ () -> String? in @@ -597,14 +642,9 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke return made ? nil : problem ?? "" }) { [weak self] problem in guard let self else { return } - if let problem { return refuse("Can’t Create Notebook", problem) } + if let problem { return alert("Can’t Create Notebook", problem) } if !inCloud && !Notebooks.showsOnDevice { Notebooks.showsOnDevice = true } - rescan { [weak self] notebook in - guard notebook.source == (inCloud ? .icloud(path: name) : .documents(path: name)), - let tab = notebook.tabs.first(where: \.readable) - else { return } - self?.onOpen?(tab, notebook) - } + rescan(opening: inCloud ? .icloud(path: name) : .documents(path: name)) } } @@ -621,23 +661,12 @@ final class NotebooksViewController: UICollectionViewController, UIDocumentPicke return nil }) { [weak self] problem in guard let self else { return } - if let problem { return refuse("Can’t Open the Guide", problem) } + if let problem { return alert("Can’t Open the Guide", problem) } if !Notebooks.showsOnDevice { Notebooks.showsOnDevice = true } - rescan { [weak self] notebook in - guard notebook.source == .documents(path: Notebooks.guide), - let tab = notebook.tabs.first(where: \.readable) - else { return } - self?.onOpen?(tab, notebook) - } + rescan(opening: .documents(path: Notebooks.guide)) } } - private func refuse(_ title: String, _ message: String) { - let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default)) - present(alert, animated: true) - } - private func openFolder() { let picker = UIDocumentPickerViewController( forOpeningContentTypes: [.folder, UTType(filenameExtension: "one") ?? .data]) @@ -721,6 +750,11 @@ final class PagesViewController: UITableViewController { /// Opens a page of the section. var onOpen: ((Section, String) -> Void)? + /// The section strip prototype, over the pages. + private lazy var strip = SectionStrip { [weak self] tab, notebook in + (self?.view.window?.windowScene?.delegate as? SceneDelegate)?.open(tab, of: notebook) + } + init() { super.init(style: .plain) } @@ -740,6 +774,25 @@ final class PagesViewController: UITableViewController { ] NotificationCenter.default.addObserver( self, selector: #selector(changed), name: Section.changed, object: nil) + if Prototype.sectionStrip { + for direction in [UISwipeGestureRecognizer.Direction.left, .right] { + let swipe = UISwipeGestureRecognizer(target: self, action: #selector(swiped)) + swipe.direction = direction + tableView.addGestureRecognizer(swipe) + } + } + } + + @objc private func swiped(_ swipe: UISwipeGestureRecognizer) { + if let tab = strip.neighbour(swipe.direction == .left ? 1 : -1) { strip.pick(tab) } + } + + override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + Prototype.sectionStrip && strip.notebook != nil ? strip : nil + } + + override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + Prototype.sectionStrip && strip.notebook != nil ? 50 : 0 } override func viewWillAppear(_ animated: Bool) { @@ -751,6 +804,10 @@ final class PagesViewController: UITableViewController { section = nil items = [] title = tab.name + if Prototype.sectionStrip, let notebook = strip.notebook { + title = notebook.name + strip.select(tab.path) + } tableView.reloadData() var loading = UIContentUnavailableConfiguration.loading() loading.text = "Opening…" @@ -768,7 +825,7 @@ final class PagesViewController: UITableViewController { navigationController?.setToolbarHidden(true, animated: false) } - func failed(_ tab: Tab, _ problem: String?) { + func failed(_ problem: String?) { var empty = UIContentUnavailableConfiguration.empty() empty.text = "Can’t Open Section" empty.secondaryText = problem @@ -778,6 +835,10 @@ final class PagesViewController: UITableViewController { func load(_ section: Section) { self.section = section title = section.tab.name + if Prototype.sectionStrip { + title = section.notebook.name + strip.show(section.notebook, selected: section.tab.path) + } navigationController?.setToolbarHidden(false, animated: false) reload() } @@ -816,7 +877,7 @@ final class PagesViewController: UITableViewController { } private func delete(_ item: Item) { - section?.delete(item.id) { _ in } + section?.delete(item.id) } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { items.count } @@ -859,6 +920,8 @@ final class PagesViewController: UITableViewController { override func tableView( _ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath ) -> UISwipeActionsConfiguration? { + // A swipe across the list changes section instead; the context menu deletes. + if Prototype.sectionStrip { return nil } let item = items[indexPath.row] let delete = UIContextualAction(style: .destructive, title: "Delete") { [weak self] _, _, done in self?.delete(item) diff --git a/apps/ios/Snowbound/Notebooks.swift b/apps/ios/Snowbound/Notebooks.swift index 17562e7fdfb14a1e7ff3021420d38e255db6cb2a..bf45c3e19f0c55ed00057bc7efc5304fd50630bc 100644 --- a/apps/ios/Snowbound/Notebooks.swift +++ b/apps/ios/Snowbound/Notebooks.swift @@ -30,7 +30,11 @@ enum Author { static var name: String? { get { UserDefaults.standard.string(forKey: key) } - set { UserDefaults.standard.set(newValue, forKey: key) } + set { + UserDefaults.standard.set(newValue, forKey: key) + // Open sections name it in their edits from now on. + for section in Section.all { sb_section_set_author(section.handle, newValue ?? "") } + } } /// Asks for the user name OneNote shows beside changes, then runs `then`. @@ -126,13 +130,22 @@ struct Tab: Decodable, Equatable { let group: String let color: [UInt8] let readable: Bool + /// Password protected and not unlocked: `Notebook.unlock` opens it. + let locked: Bool /// Not on this device yet; `Notebook` asks iCloud Drive for it. let downloading: Bool /// Why the file could not be read, where retrying or repair may help. let problem: String? - var uiColor: UIColor { - UIColor(red: CGFloat(color[0]) / 255, green: CGFloat(color[1]) / 255, blue: CGFloat(color[2]) / 255, alpha: 1) + var uiColor: UIColor { UIColor(rgb: color) } +} + +extension UIViewController { + /// Tells the reader `title` and `message` in an alert they dismiss with OK. + func alert(_ title: String, _ message: String) { + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "OK", style: .default)) + present(alert, animated: true) } } @@ -205,13 +218,8 @@ final class Notebook { } let accessed = url.startAccessingSecurityScopedResource() ? url : nil let local = onThisDevice(url) - var library: OpaquePointer? - // A coordinated read brings a cloud folder's files down before they are read. - var coordination: NSError? - NSFileCoordinator().coordinate(readingItemAt: url, options: [], error: &coordination) { url in - library = sb_library_open(url.path, cacheDirectory.path, local, &error) - } - return (library, accessed, take(error) ?? coordination?.localizedDescription, local ? url : nil) + let (library, problem) = coordinatedOpen(url, local: local) + return (library, accessed, problem, local ? url : nil) case .documents(let path): let url = documentsDirectory.appendingPathComponent(path) let library = sb_library_open(url.path, cacheDirectory.path, true, &error) @@ -220,12 +228,8 @@ final class Notebook { guard let url = ICloud.documents?.appendingPathComponent(path) else { return (nil, nil, "Turn on iCloud Drive in Settings to open this notebook.", nil) } - var library: OpaquePointer? - var coordination: NSError? - NSFileCoordinator().coordinate(readingItemAt: url, options: [], error: &coordination) { url in - library = sb_library_open(url.path, cacheDirectory.path, false, &error) - } - return (library, nil, take(error) ?? coordination?.localizedDescription, url) + let (library, problem) = coordinatedOpen(url, local: false) + return (library, nil, problem, url) case .path(let path): let url = URL(fileURLWithPath: path) let local = onThisDevice(url) @@ -262,6 +266,21 @@ final class Notebook { } } + /// Unlocks the protected section at `path` with `password` off the main thread, then lists + /// the sections again; `done` learns whether the password matched. + func unlock(_ path: String, password: String, done: @escaping (Bool) -> Void) { + guard let handle else { return done(false) } + let pointer = Int(bitPattern: handle) + background({ sb_library_unlock(OpaquePointer(bitPattern: pointer), path, password) }) { [self] unlocked in + reload { done(unlocked) } + } + } + + /// Locks every protected section, as OneNote's Lock All does. + func lockAll() { + if let handle { sb_library_lock_all(handle) } + } + /// Lists the sections again, off the main thread. func reload(done: @escaping () -> Void) { guard let handle else { @@ -323,6 +342,18 @@ final class Notebook { } } +/// Opens the library at `url` within a coordinated read, which brings a cloud folder's files +/// down before they are read; nil with why where it cannot. +private func coordinatedOpen(_ url: URL, local: Bool) -> (OpaquePointer?, String?) { + var library: OpaquePointer? + var error: UnsafeMutablePointer? + var coordination: NSError? + NSFileCoordinator().coordinate(readingItemAt: url, options: [], error: &coordination) { url in + library = sb_library_open(url.path, cacheDirectory.path, local, &error) + } + return (library, take(error) ?? coordination?.localizedDescription) +} + /// Whether `url` is kept on this device, rather than by a file provider that keeps it elsewhere /// too, as iCloud Drive does. private func onThisDevice(_ url: URL) -> Bool { @@ -414,7 +445,7 @@ enum Notebooks { set { UserDefaults.standard.set(!newValue, forKey: hidden) } } - /// The kept notebooks and those in Documents, where the bundled sample goes on first launch. + /// The kept notebooks and those in Documents. static func load() { if let scripted { elsewhere = [ @@ -435,12 +466,6 @@ enum Notebooks { return Notebook(id: entry.id, name: entry.name, source: entry.source) } } else { - let sample = documentsDirectory.appendingPathComponent("Sample") - if !FileManager.default.fileExists(atPath: sample.path), - let bundled = Bundle.main.url(forResource: "notebook", withExtension: nil) - { - try? FileManager.default.copyItem(at: bundled, to: sample) - } // The notebook the first version remembered from Files. if let bookmark = UserDefaults.standard.data(forKey: "notebook") { var stale = false @@ -456,34 +481,31 @@ enum Notebooks { /// Lists Documents again, keeping the notebooks still there; returns those new to the list. @discardableResult static func scan() -> [Notebook] { - guard showsOnDevice else { - onDevice = [] - return [] - } - var added: [Notebook] = [] - onDevice = notebooks(in: documentsDirectory).map { name in - if let kept = onDevice.first(where: { $0.id == "Documents/" + name }) { return kept } - let notebook = Notebook( - id: "Documents/" + name, name: (name as NSString).deletingPathExtension, source: .documents(path: name)) - added.append(notebook) - return notebook - } - return added + let folder = showsOnDevice ? documentsDirectory : nil + return rescan(folder, "Documents/", &onDevice) { .documents(path: $0) } } /// Lists Snowbound's folder in iCloud Drive again, as `scan` lists Documents; none while /// iCloud Drive is off. @discardableResult static func scanICloud() -> [Notebook] { - guard let folder = ICloud.documents, scripted == nil else { - inCloud = [] + rescan(scripted == nil ? ICloud.documents : nil, "iCloud/", &inCloud) { .icloud(path: $0) } + } + + /// Lists `folder`'s notebooks into `list`, keeping those still there and naming new ones by + /// `prefix` and their `source`; returns the new ones. + private static func rescan( + _ folder: URL?, _ prefix: String, _ list: inout [Notebook], source: (String) -> Source + ) -> [Notebook] { + guard let folder else { + list = [] return [] } var added: [Notebook] = [] - inCloud = notebooks(in: folder).map { name in - if let kept = inCloud.first(where: { $0.id == "iCloud/" + name }) { return kept } + list = notebooks(in: folder).map { [list] name in + if let kept = list.first(where: { $0.id == prefix + name }) { return kept } let notebook = Notebook( - id: "iCloud/" + name, name: (name as NSString).deletingPathExtension, source: .icloud(path: name)) + id: prefix + name, name: (name as NSString).deletingPathExtension, source: source(name)) added.append(notebook) return notebook } @@ -650,13 +672,13 @@ final class Section { return id } - func delete(_ id: String, done: @escaping (Bool) -> Void) { + func delete(_ id: String, done: @escaping () -> Void = {}) { let (date, time) = titleDate() let pointer = Int(bitPattern: handle) - background({ sb_section_delete_page(OpaquePointer(bitPattern: pointer), id, date, time) }) { [self] deleted in + background({ sb_section_delete_page(OpaquePointer(bitPattern: pointer), id, date, time) }) { [self] _ in reloadRows() NotificationCenter.default.post(name: Self.changed, object: self, userInfo: ["flags": Self.listed]) - done(deleted) + done() } } diff --git a/apps/ios/Snowbound/PageViewController.swift b/apps/ios/Snowbound/PageViewController.swift index ccaa9a8eb997ef3b8ac0d4b3aab941754e4d56d1..04379b01e3b1d20aa072d6efc34eec5ac4cd1a11 100644 --- a/apps/ios/Snowbound/PageViewController.swift +++ b/apps/ios/Snowbound/PageViewController.swift @@ -21,6 +21,8 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate private let titleFocus: Bool private lazy var canvas = CanvasView(section: section, page: page) private let bar = ConflictBar() + /// Reading View, beside the page menu where the page has one. + private var reader: UIBarButtonItem? /// Opens another page or conflict page of the section. var onOpen: ((String) -> Void)? private lazy var done = UIBarButtonItem( @@ -96,6 +98,12 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate if revealed || titleFocus && canvas.focusTitle() { _ = canvas.becomeFirstResponder() } + if Prototype.reading, canvas.reading?.offered == true { + reader = UIBarButtonItem( + title: "Reading View", image: UIImage(systemName: "text.justify.left"), + primaryAction: UIAction { [weak self] _ in self?.toggleReading() }) + editingChanged() + } } private func showTitle(_ title: String) { @@ -121,8 +129,10 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate undo.isEnabled = canvas.canUndo(redo: false) redo.isEnabled = canvas.canUndo(redo: true) // Drawing keeps undo at hand, as typing does. + reader?.isSelected = canvas.readingShown guard canvas.isFirstResponder || canvas.pickerShown else { - if navigationItem.rightBarButtonItems?.first !== more { navigationItem.rightBarButtonItems = [more, draw] } + let resting = [more, draw] + (reader.map { [$0] } ?? []) + if navigationItem.rightBarButtonItems != resting { navigationItem.rightBarButtonItems = resting } return } let items = canvas.isFirstResponder ? [done, more, draw, redo, undo] : [more, draw, redo, undo] @@ -164,7 +174,7 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate title: "Space", image: UIImage(systemName: "arrow.up.and.down.text.horizontal"), attributes: editable ) { [weak self] _ in self?.canvas.insertSpace() }, ]) - return [ + return (Prototype.reading ? [readingAction()] : []) + [ insert, UIAction(title: "Page Background…", image: UIImage(systemName: "paintpalette"), attributes: editable) { [weak self] _ in self?.showPaper() @@ -189,12 +199,27 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate UIAction(title: "Delete Page", image: UIImage(systemName: "trash"), attributes: .destructive) { [weak self] _ in guard let self else { return } - section.delete(page) { _ in } + section.delete(page) }, ]), ] } + /// Reading View: the page reflowed into the screen's width, read-only, where it reflows. + private func readingAction() -> UIAction { + let reading = canvas.reading + return UIAction( + title: "Reading View", subtitle: reading.flatMap { Prototype.readingNote($0.verdict) }, + image: UIImage(systemName: "text.justify.left"), + attributes: reading?.offered == true || canvas.readingShown ? [] : .disabled, + state: canvas.readingShown ? .on : .off + ) { [weak self] _ in self?.toggleReading() } + } + + private func toggleReading() { + canvas.showReading(!canvas.readingShown) + } + /// The page's theme, its section's and its notebook's, each pickable; the page wears a /// new one when it opens again. private func themeMenu() -> UIMenu { @@ -228,12 +253,8 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate let paper = letter ? CGSize(width: 612, height: 792) : CGSize(width: 595.276, height: 841.89) let title = canvas.pageTitle ?? section.row(of: page)?.row.title ?? "" guard let pdf = canvas.pdf(paper: paper, section: section.tab.name) else { - let alert = UIAlertController( - title: export ? "Couldn't Export the PDF" : "Couldn't Print", - message: "The page could not be laid out on paper.", preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default)) - present(alert, animated: true) - return + return alert( + export ? "Couldn't Export the PDF" : "Couldn't Print", "The page could not be laid out on paper.") } if export { let name = title.components(separatedBy: CharacterSet(charactersIn: "/\\:")).joined(separator: "-") @@ -274,12 +295,7 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate // Nothing typed is lost unannounced: the page's text goes on the clipboard. UIPasteboard.general.string = canvas.pageText canvas.reload(discard: true) - let alert = UIAlertController( - title: "Change Not Saved", - message: "The page shows what was last saved. Your text is on the clipboard to paste back.", - preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default)) - present(alert, animated: true) + alert("Change Not Saved", "The page shows what was last saved. Your text is on the clipboard to paste back.") } else if flags & Section.remote != 0 { canvas.reload(discard: false) } @@ -332,7 +348,7 @@ final class PageViewController: UIViewController, PHPickerViewControllerDelegate private func conflictAction() { guard let (row, version) = section.row(of: page) else { return } if version != nil { - section.delete(page) { [weak self] _ in self?.onOpen?(row.id) } + section.delete(page) { [weak self] in self?.onOpen?(row.id) } } else if let newest = row.versions.max(by: { ($0.created ?? 0) < ($1.created ?? 0) }) { onOpen?(newest.id) } diff --git a/apps/ios/Snowbound/Prototypes.swift b/apps/ios/Snowbound/Prototypes.swift new file mode 100644 index 0000000000000000000000000000000000000000..02fe052512703113e441a14f1c9951a102cdf7c9 --- /dev/null +++ b/apps/ios/Snowbound/Prototypes.swift @@ -0,0 +1,241 @@ +import UIKit + +/// Design prototypes, off unless a launch argument turns one on, as +/// `-SnowboundReading YES`, `-SnowboundWelcome YES` or `-SnowboundSectionStrip YES` (Xcode's +/// scheme, `simctl launch`, or `devicectl … --arguments`). +enum Prototype { + /// Page menu: Reading View, the page reflowed into the screen's width, read-only. + static var reading: Bool { UserDefaults.standard.bool(forKey: "SnowboundReading") } +} + +extension Prototype { + /// What the page menu says under Reading View for a verdict from `sb_view_reading`. + static func readingNote(_ verdict: String) -> String? { + let notes = [ + ("Fits", "Page already fits"), + ("RightToLeft", "Right-to-left pages not yet"), + ("Drawn", "Mostly drawings"), + ("Arranged", "Laid out as a canvas"), + ("Asides", "Side notes follow their lines"), + ("SideBySide", "Columns read left to right"), + ("Group", "Overlapping parts stay together"), + ("Wide", "Some parts stay wide"), + ] + let found = notes.filter { verdict.contains($0.0) }.map(\.1) + return found.isEmpty ? nil : found.joined(separator: " · ") + } +} + +extension Prototype { + /// First launch: a welcome where the list would be empty, the first notebook found opened + /// at its first page, and the name asked at the first edit rather than the first open. + static var welcome: Bool { UserDefaults.standard.bool(forKey: "SnowboundWelcome") } + + /// The notebook list's welcome while there are no notebooks, nil once there are or while + /// iCloud Drive is still being looked up. + static func welcome( + new: @escaping () -> Void, openFolder: @escaping () -> Void, connect: @escaping () -> Void + ) -> UIContentUnavailableConfiguration? { + guard Notebooks.all.isEmpty, !ICloud.signedIn || ICloud.documents != nil else { return nil } + var welcome = UIContentUnavailableConfiguration.empty() + welcome.image = UIImage(systemName: "book.closed") + welcome.text = "No Notebooks Yet" + welcome.secondaryText = + ICloud.documents != nil + ? "New notebooks go in iCloud Drive, where OneNote and your other devices can open them." + : "New notebooks stay on this iPhone. Turn on iCloud Drive to use them on all your devices." + var button = UIButton.Configuration.borderedProminent() + button.title = "New Notebook" + welcome.button = button + welcome.buttonProperties.primaryAction = UIAction { _ in new() } + var open = UIButton.Configuration.plain() + open.title = "Open Existing Notebook" + welcome.secondaryButton = open + var elsewhere = [ + UIAction(title: "Open Folder…", image: UIImage(systemName: "folder")) { _ in openFolder() }, + UIAction(title: "Connect to Server…", image: UIImage(systemName: "server.rack")) { _ in connect() }, + ] + if !ICloud.signedIn { + elsewhere.append( + UIAction(title: "Turn On iCloud Drive", image: UIImage(systemName: "icloud")) { _ in + if let settings = URL(string: UIApplication.openSettingsURLString) { + UIApplication.shared.open(settings) + } + }) + } + welcome.secondaryButtonProperties.menu = UIMenu(children: elsewhere) + return welcome + } + + /// Asks for the name edits are stored under, then runs `then`. + static func askName(from controller: UIViewController, then: @escaping () -> Void) { + let alert = UIAlertController( + title: "Your Name", message: "OneNote shows it beside the pages and changes you make.", + preferredStyle: .alert) + let save = UIAlertAction(title: "Continue", style: .default) { [weak alert] _ in + Author.name = alert?.textFields?.first?.text?.trimmingCharacters(in: .whitespaces) + then() + } + save.isEnabled = false + alert.addTextField { field in + field.placeholder = "Name" + field.textContentType = .name + field.autocapitalizationType = .words + NotificationCenter.default.addObserver( + forName: UITextField.textDidChangeNotification, object: field, queue: .main + ) { _ in save.isEnabled = !(field.text ?? "").trimmingCharacters(in: .whitespaces).isEmpty } + } + alert.addAction(UIAlertAction(title: "Not Now", style: .cancel)) + alert.addAction(save) + alert.preferredAction = save + (controller.presentedViewController ?? controller).present(alert, animated: true) + } +} + +extension Prototype { + /// Pages list: the notebook's sections as OneNote's coloured tabs over the pages; a tab or + /// a swipe across the list changes section. + static var sectionStrip: Bool { UserDefaults.standard.bool(forKey: "SnowboundSectionStrip") } +} + +/// A notebook's sections as a row of coloured tabs, the open one raised; a section group is a +/// tab whose menu holds its sections. +final class SectionStrip: UIView { + private let scroll = UIScrollView() + private let row = UIStackView() + private let rule = UIView() + private(set) var notebook: Notebook? + private var selected = "" + private let onPick: (Tab, Notebook) -> Void + + init(onPick: @escaping (Tab, Notebook) -> Void) { + self.onPick = onPick + super.init(frame: CGRect(x: 0, y: 0, width: 320, height: 50)) + backgroundColor = .systemBackground + scroll.showsHorizontalScrollIndicator = false + row.axis = .horizontal + row.spacing = 2 + row.alignment = .bottom + for view in [scroll, rule] as [UIView] { + view.translatesAutoresizingMaskIntoConstraints = false + addSubview(view) + } + row.translatesAutoresizingMaskIntoConstraints = false + scroll.addSubview(row) + NSLayoutConstraint.activate([ + scroll.leadingAnchor.constraint(equalTo: leadingAnchor), + scroll.trailingAnchor.constraint(equalTo: trailingAnchor), + scroll.topAnchor.constraint(equalTo: topAnchor, constant: 6), + scroll.bottomAnchor.constraint(equalTo: rule.topAnchor), + rule.leadingAnchor.constraint(equalTo: leadingAnchor), + rule.trailingAnchor.constraint(equalTo: trailingAnchor), + rule.bottomAnchor.constraint(equalTo: bottomAnchor), + rule.heightAnchor.constraint(equalToConstant: 3), + row.leadingAnchor.constraint(equalTo: scroll.contentLayoutGuide.leadingAnchor, constant: 12), + row.trailingAnchor.constraint(equalTo: scroll.contentLayoutGuide.trailingAnchor, constant: -12), + row.topAnchor.constraint(equalTo: scroll.contentLayoutGuide.topAnchor), + row.bottomAnchor.constraint(equalTo: scroll.contentLayoutGuide.bottomAnchor), + row.heightAnchor.constraint(equalTo: scroll.frameLayoutGuide.heightAnchor), + ]) + } + + required init?(coder: NSCoder) { fatalError() } + + /// The readable sections in the notebook's order, groups' sections where the group is. + private var readable: [Tab] { notebook?.tabs.filter(\.readable) ?? [] } + + func show(_ notebook: Notebook, selected path: String) { + let first = self.notebook == nil + self.notebook = notebook + select(path) + #if DEBUG + // `SNOWBOUND_STRIP_TOUR=N` steps N sections on, one each 1.5 s, for recordings. + if first, let steps = ProcessInfo.processInfo.environment["SNOWBOUND_STRIP_TOUR"].flatMap(Int.init) { + for step in 1...max(1, steps) { + DispatchQueue.main.asyncAfter(deadline: .now() + 1.5 * Double(step)) { [weak self] in + if let tab = self?.neighbour(1) { self?.pick(tab) } + } + } + } + #endif + } + + func select(_ path: String) { + selected = path + guard let notebook else { return } + for view in row.arrangedSubviews { view.removeFromSuperview() } + var groups: Set = [] + for tab in notebook.tabs where tab.readable { + let group = tab.group.split(separator: "/").first.map(String.init) + if let group { + guard groups.insert(group).inserted else { continue } + let inside = notebook.tabs.filter { $0.readable && $0.group.hasPrefix(group) } + let current = inside.first { $0.path == path } + row.addArrangedSubview( + button(current?.name ?? group, color: current?.uiColor ?? .systemGray, raised: current != nil, + folder: true, menu: UIMenu(title: group, children: inside.map { tab in + UIAction(title: tab.name, image: swatch(tab.uiColor), + state: tab.path == path ? .on : .off) { [weak self] _ in self?.pick(tab) } + }))) + } else { + let tab = tab + let button = button(tab.name, color: tab.uiColor, raised: tab.path == path, folder: false, menu: nil) + button.addAction(UIAction { [weak self] _ in self?.pick(tab) }, for: .primaryActionTriggered) + row.addArrangedSubview(button) + } + } + rule.backgroundColor = notebook.tabs.first { $0.path == path }?.uiColor ?? .separator + layoutIfNeeded() + if let raised = row.arrangedSubviews.first(where: { $0.tag == 1 }) { + scroll.scrollRectToVisible(raised.frame.insetBy(dx: -40, dy: 0), animated: false) + } + } + + /// The readable section `step` places after the open one, if any. + func neighbour(_ step: Int) -> Tab? { + let tabs = readable + guard let at = tabs.firstIndex(where: { $0.path == selected }), tabs.indices.contains(at + step) else { + return nil + } + return tabs[at + step] + } + + func pick(_ tab: Tab) { + guard let notebook else { return } + select(tab.path) + onPick(tab, notebook) + } + + private func button(_ title: String, color: UIColor, raised: Bool, folder: Bool, menu: UIMenu?) -> UIButton { + var configuration = UIButton.Configuration.filled() + configuration.title = title + configuration.image = folder ? UIImage(systemName: "folder") : nil + configuration.imagePadding = 4 + configuration.preferredSymbolConfigurationForImage = UIImage.SymbolConfiguration(textStyle: .caption1) + configuration.baseBackgroundColor = raised ? color : color.withAlphaComponent(0.28) + configuration.baseForegroundColor = raised ? .white : .label + configuration.background.cornerRadius = 9 + configuration.contentInsets = NSDirectionalEdgeInsets( + top: raised ? 11 : 8, leading: 14, bottom: raised ? 9 : 7, trailing: 14) + configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { + var attributes = $0 + attributes.font = .preferredFont(forTextStyle: .subheadline).withTraits(raised ? .traitBold : []) + return attributes + } + let button = UIButton(configuration: configuration) + // Tabs: only the top corners round, the open one meeting the rule beneath. + button.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + button.layer.cornerRadius = 9 + button.clipsToBounds = true + button.tag = raised ? 1 : 0 + if let menu { + button.menu = menu + button.showsMenuAsPrimaryAction = true + } + return button + } + + private func swatch(_ color: UIColor) -> UIImage? { + UIImage(systemName: "rectangle.portrait.fill")?.withTintColor(color, renderingMode: .alwaysOriginal) + } +} diff --git a/apps/ios/Snowbound/Script.swift b/apps/ios/Snowbound/Script.swift index e48f4e36679deea2b141ec39aed7a3daceab0ed8..42926d5eeba70461f40701f6d2a4d77e64ea9671 100644 --- a/apps/ios/Snowbound/Script.swift +++ b/apps/ios/Snowbound/Script.swift @@ -14,7 +14,7 @@ extension CanvasView { /// `tool:pen:N`, `tool:shape:N`, `tool:eraser` or `tool:lasso` gives it a tool, `picker` shows or hides the /// drawing tools, `pencildoubletap` is the Pencil's double tap, and `deleteink` deletes /// what the lasso picked; `rotate:landscape` or `rotate:portrait` turns the device; `done` - /// ends editing, `tree` saves the view hierarchy to + /// ends editing, `reading` turns the reading view on or off, `tree` saves the view hierarchy to /// Documents/tree.txt, and `shot:a` the window to Documents/a.png, as a device has no /// screenshot command. func runScript() { @@ -73,8 +73,9 @@ extension CanvasView { from: position(from: beginningOfDocument, offset: values[0])!, to: position(from: beginningOfDocument, offset: values[1])!) case "scroll": - let values = argument.split(separator: ",").compactMap { Double($0) } - setContentOffset(CGPoint(x: values[0], y: values[1]), animated: true) + // `scroll:,Y` keeps the horizontal offset. + let values = argument.split(separator: ",", omittingEmptySubsequences: false).map { Double($0) } + setContentOffset(CGPoint(x: values[0] ?? contentOffset.x, y: values[1] ?? contentOffset.y), animated: true) case "zoom": setZoomScale(Double(argument) ?? 1, animated: false) case "doubletap": let values = argument.split(separator: ",").compactMap { Double($0) } @@ -90,6 +91,7 @@ extension CanvasView { menu.presentEditMenu(with: UIEditMenuConfiguration(identifier: nil, sourcePoint: CGPoint(x: caret.midX, y: caret.minY))) case "done": _ = resignFirstResponder() case "selectall": selectAll(nil) + case "reading": showReading(!readingShown) case "format": apply(UInt8(argument) ?? 0) case "find": _ = find(argument) case "title": _ = focusTitle() diff --git a/apps/ios/Snowbound/Server.swift b/apps/ios/Snowbound/Server.swift index b7de342be353709c8e4ab954d35d3a9a160057f3..98b4a5c4c7246ac589f86cedea4a29ce15ecea40 100644 --- a/apps/ios/Snowbound/Server.swift +++ b/apps/ios/Snowbound/Server.swift @@ -110,12 +110,6 @@ final class ServerViewController: UITableViewController, UITextFieldDelegate { } } - private func alert(_ title: String, _ message: String) { - let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) - alert.addAction(UIAlertAction(title: "OK", style: .default)) - present(alert, animated: true) - } - override func numberOfSections(in tableView: UITableView) -> Int { registered ? 2 : 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 } diff --git a/arc/canvas.md b/arc/canvas.md index e098a9305527713283a691dd63ea2d4c5ef2e99b..9e35300d4d9d3a458ae5af171f2059302be4a350 100644 --- a/arc/canvas.md +++ b/arc/canvas.md @@ -84,6 +84,11 @@ same line heights, same places. That took measuring, not guessing. Snap To Grid (the shape gallery's last item, kept between launches) is off. Tags sit in a column to the left of the text with OneNote's spacing, and a tag's colour paints the whole paragraph as it does there. +- **A right-to-left page is the same frame, seen from its right.** OneNote 2010 + keeps its positions left to right like any page's, from a margin origin some + 10,800 pt out, and opens it scrolled to the right end of its content, keeping + that edge as the window resizes. The canvas does the same and stores clicks, + strokes and drags as on any page (`corpus/rtl-page`). These rules were established against OneNote's own output: its XML export gives outline sizes, its PDF export gives exact line breaks, and screenshots diff --git a/arc/file-format.md b/arc/file-format.md index 2b85e489fb14427f56db24b84f9fc0dba0be1098..f500abeed01a32a0fefe110186fc20dccd69d1d6 100644 --- a/arc/file-format.md +++ b/arc/file-format.md @@ -182,11 +182,19 @@ tools), while the writer stays strict. ## Protected sections -Password-protected sections keep their encrypted structure. With the -`protected` feature, `onestore` opens OneNote 2010's AES wrapper for a supplied -password. Edits are sealed back under the section's key, with a fresh IV for -each object. Plaintext never reaches the replica's cache. A protected section is -edited directly in its file and never queued. +A password-protected section keeps its structure in the clear and encrypts every +object and payload under one AES-128 key, which Office's Agile password encryption +wraps (SHA-1, 100,000 rounds). `protected::Key` opens it with the password, and +`Section::unlock` keeps the section open under it: objects decode into the arena as it +opens, and each seal encrypts what it appends with a fresh IV and names the key in every +revision. Edits are ops like any other's; only the bytes differ. + +Setting, changing or removing a password is one of the few whole-image writes, as it is +in OneNote 2010, which writes the section anew under a new file identity, new object +space identities and new payload identities, and leaves its TOC to follow. Snowbound does +the same (`protected::rekey`): keeping any identity would let a cache, OneNote's or a +replica, mistake the old file's revisions or payloads for the new file's. The evidence, +with the crypto, is in `corpus/protected-sections`. ## Looking inside diff --git a/arc/platforms.md b/arc/platforms.md index 36d86630cd1ae56f92d6cb38625ef93e626caf86..97c307868b48b21cc6a22bba9c5e4b911b47b26e 100644 --- a/arc/platforms.md +++ b/arc/platforms.md @@ -10,7 +10,7 @@ drawn by Snowbound versus the operating system. shell snowbound + ui snowbound + ui snowbound + ui UIKit (apps/ios) glue snowbound/src/macos snowbound/src/linux snowbound/src/windows crates/mobile (C ABI) page canvas ─────────────────────────────────────────────────────────────────────► -paint draw (wgpu: Metal) draw (Vulkan or GL) draw (D3D12, or GL on 7) draw (Metal) +paint draw (wgpu: Metal) draw (Vulkan or GL) draw (D3D12; D3D11 on 7) draw (Metal) data notebook::session + embedded SMB client ────────────────────────────────────► format onestore ───────────────────────────────────────────────────────────────────► ``` @@ -103,9 +103,15 @@ keyboard, the toolbar and the macOS menu bar all run commands from it. imports, and aarch64 for Windows 11 on Arm. The few imports of Windows 8 and later that dependencies still name are answered by `platform/windows/rt/shims.c`; everything newer is looked up at run time. -- `draw` builds both backends on Windows and the surface picks one: +- `draw` builds three backends on Windows and the surface picks one: Direct3D 12 through wgpu where Windows has it (10 and 11), otherwise - OpenGL 2.1 on a WGL context, as on Windows 7 (`surface_windows.rs`). + Direct3D 11, as on Windows 7, on WARP where no device reaches feature + level 10_0, and OpenGL 2.1 on a WGL context only where neither starts + (`surface_windows.rs`). Direct3D 11 presents through a blit-model DXGI + swap chain, as 7 has no flip model, and through DirectComposition on 10, + whose window has no redirection surface; OpenGL drivers such as Intel's + place their frames below the caption the system would draw even where the + row takes its place. - The toolbar's row is the title bar wherever the desktop composes windows. On Windows 7 with Aero and on 11, the system's frame keeps its sides, its caption gives way to the row, its material (Aero glass, Mica) lies @@ -115,11 +121,17 @@ keyboard, the toolbar and the macOS menu bar all run commands from it. draws them as 11 does, lit where the system reports the pointer. On 8 and 10, whose frames are opaque, the window has no system frame and the row draws and runs caption buttons as 10 does, over acrylic on 10. Over - 7's glass the sidebar stays opaque, and fields and tool buttons take white - faces, as Internet Explorer's do there. The theme and material follow the - system's colour mode as it changes. With Windows 7's basic or classic - theme the system draws the title bar and the row lies beneath it, as on - KDE. + 7's glass, which takes any colour and whatever lies behind the window, + the toolbar keeps opaque faces under its icons: by default the strip is + opaque, as Explorer's command bar is under its glass, stopping short of the + caption buttons 7 draws beneath the window's pixels, and + `SNOWBOUND_W7_CHROME` tries the alternatives, `pills` for a face per group + of tools over the glass, `frost` for a strip the glass tints through, and + `tint` and `tint-tiles` for one panel or a tile per group in the glass's + colour at a lightness text keeps its contrast on, as Mica tints. + The theme and material follow the system's colour mode as it changes. + With Windows 7's basic or classic theme the system draws the title bar + and the row lies beneath it, as on KDE. - A notebook on a share opens by its UNC path through Windows' own SMB client, which takes OneNote's opens and locks natively: `onestore` opens a section as OneNote does (a reader shares it with everyone, a writer denies diff --git a/arc/sync.md b/arc/sync.md index 4fe269ae6f0309f53038f622a1f910c803be271b..2c2e936ada2948daa32c0fd3568b6425ec6d2936 100644 --- a/arc/sync.md +++ b/arc/sync.md @@ -55,7 +55,15 @@ reopens the same queue after a relaunch. It holds: - **payloads**: picture and attachment bytes, stored once each, keyed by hash. The working state is never stored. It is the base with each sealed batch -replayed and the open batch applied, rebuilt on open. The database runs in WAL +replayed and the open batch applied, rebuilt on open. + +A password-protected section's replica holds nothing in the clear. Its base and sealed +transactions are the file's own ciphertext, and its edits and payloads are sealed with +AES-256-GCM under a key derived from the section's, so the queue opens, offline or after a +relaunch, only once the section is unlocked. A locked section is never opened in the +background; its edits wait until it is unlocked again. A replica of a section another device +then protects is deleted the next time the notebook is read, unless edits wait in it; those +wait for the key, then come back as copies of the pages they changed. The database runs in WAL mode with full synchronous commits, and every setting is read back to check it took. diff --git a/corpus/m6/native-page-direction-03/ORACLE.md b/corpus/m6/native-page-direction-03/ORACLE.md index 8ddcc5c70408bd38368566e59908f1d262db06b5..dbc5ae55faa46dd823f7d659b6d2223478dddc7d 100644 --- a/corpus/m6/native-page-direction-03/ORACLE.md +++ b/corpus/m6/native-page-direction-03/ORACLE.md @@ -5,9 +5,10 @@ table columns to 96 and 144 points through OneNote COM. `before.xml`, `after.xml and `read/page-000.xml` retain the native observations. The saved store uses visual left-to-right column order [Right cell, Left cell], with widths [144, 96]. COM exports cells in page direction [Left cell, Right cell], with widths [96, 144]. -The native PDF independently confirms the physical cell order. Default outline alignment anchors the right edge: -store x + LayoutMaxWidth - PageMarginOriginX - 36 equals native x + native width. -The native table outline measures wider than its stored suggested maximum width. +The native PDF independently confirms the physical cell order. Native x is store x - +PageMarginOriginX - 36; the native table outline measures wider than its stored suggested +maximum width and keeps its right edge, store x + LayoutMaxWidth - PageMarginOriginX - 36 +equalling native x + native width (`corpus/rtl-page` has narrower outlines keep their left). Vertical coordinates retain the 14.4-point canonical origin. The public fixture includes images, a file and two opaque ink objects. All diff --git a/corpus/notebook-package/README.md b/corpus/notebook-package/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4368a79a478a51e3d31f12ccc2e0fa04cf616136 --- /dev/null +++ b/corpus/notebook-package/README.md @@ -0,0 +1,27 @@ +# Notebook packages + +OneNote 2010's Save As offers a page and a section as a OneNote 2010 section (`.one`), 2007 +section, PDF, XPS or single-file web page, and a notebook as a OneNote Package (`.onepkg`), PDF +or XPS. Observed in a lab clone on 2026-10-01: + +- `native/Lab.onepkg` is OneNote's package of a notebook of two sections and a recycle bin: an + LZX (2^18-byte window) cabinet of the TOC and sections at their paths, the bin left out though + the TOC keeps its entry; each file written anew, with no `guidAncestor` or `crcName`. +- A section or page saved as a section is a file of its own identity, outside any notebook, + which OneNote then opens among Open Sections. +- Unpack Notebook (opening a package) asks for the name (the package's), colour (the package's) + and folder, writes each file with a new identity and version, places it under its folder's + TOC, and lists it anew beside its stale entry. +- Show Unread Changes, Mark as Read and what is unread live in OneNote's local cache, not in the + notebook's files or the registry. + +`candidate/Packed.onepkg` and `candidate/Unpacked` are what +`a_notebook_packs_and_unpacks_as_onenote_packs_one` in `crates/notebook/tests/package.rs` +exports with `NOTEBOOK_PACKAGE_EXPORT`: Snowbound's MSZIP package of a notebook with a section +group, and the notebook Snowbound unpacked from it. `onenote-unpacked` is OneNote 2010 unpacking +Snowbound's package through its Unpack Notebook dialog; `cold` is a fresh OneNote 2010's read of +Snowbound's unpacked notebook, every file left as written. `save-as/candidate` holds Save As's +copy of a section and section of a page as `save_as_writes_copies_outside_the_notebook` exports +them with `NOTEBOOK_SAVE_AS_EXPORT`; `save-as/cold` is OneNote 2010 opening their folder, which +adopts them (new identities, placed) and reads each page. `tools/test_notebook_package.py` +checks them all without a VM. diff --git a/corpus/notebook-package/candidate/Packed.onepkg b/corpus/notebook-package/candidate/Packed.onepkg new file mode 100644 index 0000000000000000000000000000000000000000..517d53e70ca683c1a95639d73236bf1ed5aacb9f GIT binary patch literal 3416 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 literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/candidate/Unpacked/Group/Open Notebook.onetoc2 b/corpus/notebook-package/candidate/Unpacked/Group/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d273afe517d6429be34549ca0ddc1e5a84432124 GIT binary patch literal 4120 zcmZ3e|KIuM`!b(-j|5(YE0x9PoUBN!%ry6C61KYD>wm3-0S(ySoh2YW@vG<33*r;s zo>+H78Yqv9Vaopl0f@~E6M)h%ahUK+L%B&4loef9ct(11iJ!XXLp@RXM zZ$Y`63y2|FL1d%>Ljz1i2B`W!5CerJKw>~}1BktM88;mkJ=6{Jj}Taffq@5TDY}Iq zBLy57CI~<+yZ}`TDyu*M#6>qx7^;S20>gv{P<;VFF>GeD;II>7I;#1gaOVJGkb9Yc z7-SEK2Dx#DWbBF$P(Q)~2PixWMnhmU1V&B>G_WvCk!6tCDZ?O=4W#!0X;2Z_DxDf} z*FoLA_ZQFn#wv@Wpb|p_h&>tdfH0Mzh(V7bAIxH4fR$?Cas^tHg6aT}9tePyo1pRt zBnm3)cl~l)>FUMpu{&zPx&Q6#b|7(l`CmRUZHV literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/candidate/Unpacked/New Section 1.one b/corpus/notebook-package/candidate/Unpacked/New Section 1.one new file mode 100644 index 0000000000000000000000000000000000000000..8f24418f706c772ef0879974ea18e4861ab991c6 GIT binary patch literal 6024 zcmeHLdu)_N5T9$W586^%xLOEzeR-y62p;Jv7_3~iG$6fF6e{3@0wF>qP--DiFn-hu zmjcO^R|*0)0#Xy@6_kT$iBwI+pgdwg!>dRPBs7#F4>gFt-+kX6$9Zl1$3N7YWN!D{ znVp@P-I<-ei_g8ZXvL}R?j5_IUvTu{bthWpe)pa={zCBq_nn81Tt1l~Au#;RhLryG zH%4tcnqJ@Dy5rO%pa-L3zYAbLN(~sT8dt-Y2WPDEKA1hCY1G6~3F(K=I%Gn#qOtYH z>R(PY4x?YL4+VZb>4C1l^Hp`(;wjGk?wa!}6XMg}+81q*8*>Y?&n4#;F7XVx^24-_ zg8OGhz9Js@UwS}`5{Ff+)2-4s1rBIwZk~8`#Ps5A<2BPq*X?ghSzg|;v1d#H-)PZN zV-w4Ar&yY;Vi^Dev99SNe!uwT){WiOWm_qUu(w>aig`cYaz3%S_(0{bqB{F)Hz_J7 zMKn8T_!#CrALCOrpaeX5l*#IGCx1 zL?33O0WjAP*dKi$ucjsK&~l|;DhC0U3eiH>SEgpPik4sXSwdM{Tglq?Pcz#-Dc!DU z`s{nZ`uHxdcuNh%8bJ(ad2NMwbiH)Vl#EqAXX>Od+R$=J4@aZn%&=C!&E>t(1)K+l z+G~&`2|f>JZ;DI29fsx|6aom=GE`n4okikd@%b42qZCaz+2$_RbQwZMVxE%Ea}x*T z{;;Lqw2-W9>4}5Ajve+W1q_`r9D#@jA|CjUdjRpTCBa6MWLm|pXI;Z&E!KaJUB_Lf z?x(xBr_{an{Tg$1&VZ7lJ+Y5>{(dm$eM%{knNlgQOBMR+9`nl#+<9EDC#XH78nWiu z#CjX}B(NBFpBq>L90Qze6Z`2qS6@g5cY(}<%o#EV(nXk}3V_UC1Z}vE;=+eZw}I<$ zW}JVWEZAm&%rxLrz*^unAm!`)U=dSNIzAg4F{(Z?!D(LgI?{Av}?9^hVJ zJ@5*~?xI!es5LB*VkB4SOK_nDnl`NOho0BPF?x}J8e3!TX5J>o``70laoq(r$yx~P z0UxTh)jB42=o^hGo%uf2KR1VZXNY~EQ?mZBN(%KQYv{hwA3dn37A4#p?ve8NU-yE1 z(K5*?)&$5;gk0KLDpTZDnJ(jS9;##(dLp#u8H~@u*i`J}Onm16MKj4T_{_g%px&Vr z0_&Z+(dOJsgJO#sZ+hpP%^$Xt8V1)pp(jz*JG*$*1Ns8l9Rg37IGOcMt3jNAZ(jQj zx=azXI0Bdfq<<2FXL<}GuUQ`Dfx*P125|uh^j1)p$+if3FTqqbvaHz|ei63Ix`HlltGN zEI)Z|%(9lM)C*0g=PH`caqm|jXC3G=6!l>!+==L_4s?CI>l$mlP;G+iz)%`Dk>1to z!0zg{2MkqN2Zlf6o26Z)Rst!SZ zh5~sS`5yDMGuW;`y-7?0~DZ|q~aE9B( zu40LAD$Z{;G;hHCa9-(Z{zBjF^?FQUV%RuP=ZvX{`tm(=iMbL`3JmondBXXL_Xnpj vAMxG8IOUn*`Hcs1UpY=gm{_&U?=DJm>TG zobx;9-Vawyh7VrNkEc;6C^BOnUjaL!Vc0W#p&hCxT2;K!NbhhNR;6ab^

$KTLVud;S&I+#K@a1)U!}VzbOYDhs++>8 zXb}qn76kq$1ZKW%?q&+a3zCjL)7%E8P`Hh^muy(Yqs-$Z@!n3#!GCxf#txfY*heFg zt*)UJKfal4i*~-0*0FT9n|ZSrD1VXVu?&{OvPlnSfpRIG>WJ5!Ie+541^#^Ln3P&| zq#(McI@@8Q<8m5$*5Xt$%L4yA{E0U&s^!$U?e00z9R6;5{%;-EzjMNy7ra^ujwJD> zBwo0vkN2>N`%>W}BkamoW?kY#z(F!fN$@VMMaES}g=uWD!YOPeYcpKY$!DXZr9j(R7=9(Ix1j-(=kH( zsTi5v?|AwHXRF4#lbv}jk(C<{)Q#MWvnyaT|!iee0EyNfAhRqAaR14< zn=jsp@=pfF#Ca4`#A&SKKJ{LJubcbCUO>C4op2L0M>0xj{(aE3tFPX}emL$_{9ljt zUg*cUzlZyp8fnG*n?2hKGMr$T z3TCDiYck8C5mznVL^Unmoa^37;*h3NTNxqB(GOzrIroLZhfYY~8MCLJ?JlFf?zBWCO|=+q3pAElAm_!uor9LYxM_uKEg%epSsKmAednK^s!ch9-! zp2xlCp1bEJJXgN*#P;l(+KFY2iR%wfSeAFJ{;lz2KYio4%ewxS_`|T%)iHh6T+iCp z*lW#|hME(Pg25LRe;a`P5H(=7YFrJ^-CtI)sCZyzMUO$pSB*R7JXLV^bwy+A3OBye z&?KAvd}GM_>+0q0dOEMpNm_d5)W8utO6p5q-aF^pP?LQ6d_vwYZRHsozdJP9?fh}a zowI^pK@a>dJ)nn3vL@PWO?t<`0s4~Sr;ki=I6jL1CVYW2VZ7v}rXC!B+T!(%9x4?! zv93rH>*tzS`-4DS{{A`qe%W&4dhO!8t&~LAlP~%Y8{XWxzjbYn>vqbr*?+XXKv4-X zqT4|u&z7(o;m1|GE8Szb9`oQ7V8W=h7|y0qA-0komzlpcsi!9PoLY*uTH^>$8+QToy{H6v<1n0AEZ|!-33S1bvu+;=qT) zuz~AvW`t**c-Urz%$~rZz)Ij%AmtnUUz3Ih zei1MVK2&R~bu8@AH#$=~^L@ByZUXi0EB2%`iNCE$4D}`J-EpHwqT25PJwzBI#!7kq z?wDW->X@l%qIJSLogtt0=1PGSVlPa>o+y>Mo?St!Mq+#}#%3U%#rRGDif)m?@SU-; zsw*gkz`CdC?R^8z=Lnz($jEf|o#`}*yl%OrlYEJdCb0|zdMnzOm}y4Y0RlHy7hj^&BvLGW z)m0I{+9S?JlgOjRZDC=6p|DsA4p$AivVW8P!^-L>`la_HbF0rX+y~iYrfHie&&yvh zYQ~D2y?;9N*@1W7BXc@U0B}ie953^_9YY?f`)z!$1dN9*ev<^doc0@<@pyT7+S6TDq|A&|eC5k3l`?i8cDoCT}2lAnE^5-u3Kx>Ou_jzENh{BxyvN z*co`+&xMW)BO^zBvb3M>PD#A3-YRNV`+G$FMZj};w0O)TeRi&Nte##ov}*a~T5{j( zT-q^*Jfm-3*}NpszEJj7 z@gxJ%f!vLJmwED&X;PqlqVl7W1dOwEdF;%}nMVr8tZq57wk3Jcdg>MEy=7R&v(#id zvkshrqS(<{;@gVz8%@otFh7u2I-0+zu63hvrZDj@-$m4y@1kbrN%4L_K?r&v=z)KU2Yhn?RsItT*EEp; literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/cold/notebook/Group/Open Notebook.onetoc2 b/corpus/notebook-package/cold/notebook/Group/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d273afe517d6429be34549ca0ddc1e5a84432124 GIT binary patch literal 4120 zcmZ3e|KIuM`!b(-j|5(YE0x9PoUBN!%ry6C61KYD>wm3-0S(ySoh2YW@vG<33*r;s zo>+H78Yqv9Vaopl0f@~E6M)h%ahUK+L%B&4loef9ct(11iJ!XXLp@RXM zZ$Y`63y2|FL1d%>Ljz1i2B`W!5CerJKw>~}1BktM88;mkJ=6{Jj}Taffq@5TDY}Iq zBLy57CI~<+yZ}`TDyu*M#6>qx7^;S20>gv{P<;VFF>GeD;II>7I;#1gaOVJGkb9Yc z7-SEK2Dx#DWbBF$P(Q)~2PixWMnhmU1V&B>G_WvCk!6tCDZ?O=4W#!0X;2Z_DxDf} z*FoLA_ZQFn#wv@Wpb|p_h&>tdfH0Mzh(V7bAIxH4fR$?Cas^tHg6aT}9tePyo1pRt zBnm3)cl~l)>FUMpu{&zPx&Q6#b|7(l`CmRUZHV literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/cold/notebook/New Section 1.one b/corpus/notebook-package/cold/notebook/New Section 1.one new file mode 100644 index 0000000000000000000000000000000000000000..8f24418f706c772ef0879974ea18e4861ab991c6 GIT binary patch literal 6024 zcmeHLdu)_N5T9$W586^%xLOEzeR-y62p;Jv7_3~iG$6fF6e{3@0wF>qP--DiFn-hu zmjcO^R|*0)0#Xy@6_kT$iBwI+pgdwg!>dRPBs7#F4>gFt-+kX6$9Zl1$3N7YWN!D{ znVp@P-I<-ei_g8ZXvL}R?j5_IUvTu{bthWpe)pa={zCBq_nn81Tt1l~Au#;RhLryG zH%4tcnqJ@Dy5rO%pa-L3zYAbLN(~sT8dt-Y2WPDEKA1hCY1G6~3F(K=I%Gn#qOtYH z>R(PY4x?YL4+VZb>4C1l^Hp`(;wjGk?wa!}6XMg}+81q*8*>Y?&n4#;F7XVx^24-_ zg8OGhz9Js@UwS}`5{Ff+)2-4s1rBIwZk~8`#Ps5A<2BPq*X?ghSzg|;v1d#H-)PZN zV-w4Ar&yY;Vi^Dev99SNe!uwT){WiOWm_qUu(w>aig`cYaz3%S_(0{bqB{F)Hz_J7 zMKn8T_!#CrALCOrpaeX5l*#IGCx1 zL?33O0WjAP*dKi$ucjsK&~l|;DhC0U3eiH>SEgpPik4sXSwdM{Tglq?Pcz#-Dc!DU z`s{nZ`uHxdcuNh%8bJ(ad2NMwbiH)Vl#EqAXX>Od+R$=J4@aZn%&=C!&E>t(1)K+l z+G~&`2|f>JZ;DI29fsx|6aom=GE`n4okikd@%b42qZCaz+2$_RbQwZMVxE%Ea}x*T z{;;Lqw2-W9>4}5Ajve+W1q_`r9D#@jA|CjUdjRpTCBa6MWLm|pXI;Z&E!KaJUB_Lf z?x(xBr_{an{Tg$1&VZ7lJ+Y5>{(dm$eM%{knNlgQOBMR+9`nl#+<9EDC#XH78nWiu z#CjX}B(NBFpBq>L90Qze6Z`2qS6@g5cY(}<%o#EV(nXk}3V_UC1Z}vE;=+eZw}I<$ zW}JVWEZAm&%rxLrz*^unAm!`)U=dSNIzAg4F{(Z?!D(LgI?{Av}?9^hVJ zJ@5*~?xI!es5LB*VkB4SOK_nDnl`NOho0BPF?x}J8e3!TX5J>o``70laoq(r$yx~P z0UxTh)jB42=o^hGo%uf2KR1VZXNY~EQ?mZBN(%KQYv{hwA3dn37A4#p?ve8NU-yE1 z(K5*?)&$5;gk0KLDpTZDnJ(jS9;##(dLp#u8H~@u*i`J}Onm16MKj4T_{_g%px&Vr z0_&Z+(dOJsgJO#sZ+hpP%^$Xt8V1)pp(jz*JG*$*1Ns8l9Rg37IGOcMt3jNAZ(jQj zx=azXI0Bdfq<<2FXL<}GuUQ`Dfx*P125|uh^j1)p$+if3FTqqbvaHz|ei63Ix`HlltGN zEI)Z|%(9lM)C*0g=PH`caqm|jXC3G=6!l>!+==L_4s?CI>l$mlP;G+iz)%`Dk>1to z!0zg{2MkqN2Zlf6o26Z)Rst!SZ zh5~sS`5yDMGuW;`y-7?0~DZ|q~aE9B( zu40LAD$Z{;G;hHCa9-(Z{zBjF^?FQUV%RuP=ZvX{`tm(=iMbL`3JmondBXXL_Xnpj vAMxG8IOUn*`Hcs1UpY=gm{_&U?=DJm>TG zobx;9-Vawyh7VrNkEc;6C^BOnUjaL!Vc0W#p&hCxT2;K!NbhhNR;6ab^

$KTLVud;S&I+#K@a1)U!}VzbOYDhs++>8 zXb}qn76kq$1ZKW%?q&+a3zCjL)7%E8P`Hh^muy(Yqs-$Z@!n3#!GCxf#txfY*heFg zt*)UJKfal4i*~-0*0FT9n|ZSrD1VXVu?&{OvPlnSfpRIG>WJ5!Ie+541^#^Ln3P&| zq#(McI@@8Q<8m5$*5Xt$%L4yA{E0U&s^!$U?e00z9R6;5{%;-EzjMNy7ra^ujwJD> zBwo0vkN2>N`%>W}BkamoW?kY#z(F!fN$@VMMaES}g=uWD!YOPeYcpKY$!DXZr9j(R7=9(Ix1j-(=kH( zsTi5v?|AwHXRF4#lbv}jk(C<{)Q#MWvnyaT|!iee0EyNfAhRqAaR14< zn=jsp@=pfF#Ca4`#A&SKKJ{LJubcbCUO>C4op2L0M>0xj{(aE3tFPX}emL$_{9ljt zUg*cUzlZyp8fnG*n?2hKGMr$T z3TCDiYck8C5mznVL^Unmoa^37;*h3NTNxqB(GOzrIroLZhfYY~ + diff --git a/corpus/notebook-package/cold/read/page-000.navigation.json b/corpus/notebook-package/cold/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..163d0e2ebf70e671e15b2c4234850d0c72fe963e --- /dev/null +++ b/corpus/notebook-package/cold/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Inside - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/notebook-package/cold/read/page-000.png b/corpus/notebook-package/cold/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..03c501cc8e58fea42f18bfd09675d77f2849e93d GIT binary patch literal 40349 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 + diff --git a/corpus/notebook-package/cold/read/page-001.navigation.json b/corpus/notebook-package/cold/read/page-001.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..418643b70158be86cb7e65ea2ffe9eb552c0e2f7 --- /dev/null +++ b/corpus/notebook-package/cold/read/page-001.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "First - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/notebook-package/cold/read/page-001.png b/corpus/notebook-package/cold/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..e499cee932ef4dde5f6988365495cde9bad05c96 GIT binary patch literal 40196 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 literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/cold/read/page-001.xml b/corpus/notebook-package/cold/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7250fae78ed575b6ff282ad9a8295a4b455da99 --- /dev/null +++ b/corpus/notebook-package/cold/read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/notebook-package/cold/read/payloads.json b/corpus/notebook-package/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/notebook-package/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/notebook-package/cold/run.json b/corpus/notebook-package/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..c55c40654ee7e020fc7f24922adef7cba3f80185 --- /dev/null +++ b/corpus/notebook-package/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-notebook-features/package-export/Unpacked", + "expected_pages": -1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/notebook-package/cold/scripts/cold.ps1 b/corpus/notebook-package/cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/notebook-package/cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/notebook-package/cold/scripts/read.ps1 b/corpus/notebook-package/cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/notebook-package/cold/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/notebook-package/cold/source.json b/corpus/notebook-package/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..f80f8f65376a287228b6a46976df760c7f438386 --- /dev/null +++ b/corpus/notebook-package/cold/source.json @@ -0,0 +1,26 @@ +[ + { + "path": "Group/Inner.one", + "bytes": 6032, + "sha256": "a5c70b17a6885e7c8852c69520c6be71961546e0fedf6ad0ff380e3db130e1ce", + "mtime_ns": 1790878684326770910 + }, + { + "path": "Group/Open Notebook.onetoc2", + "bytes": 4120, + "sha256": "204a6f736bf18e2304bd15d458e41d2f411b7f25a3be71337c4ed45071d300da", + "mtime_ns": 1790878684326669077 + }, + { + "path": "New Section 1.one", + "bytes": 6024, + "sha256": "842735103d262398916182756bcb46e3eafd602801cb37d695e4dd96afbd9f05", + "mtime_ns": 1790878684326501410 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 6120, + "sha256": "0f79ac377df5e59f49435239ad250b284a461da433eea502a8ec68f02e9d5479", + "mtime_ns": 1790878684326399618 + } +] diff --git a/corpus/notebook-package/cold/teardown.json b/corpus/notebook-package/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/notebook-package/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/notebook-package/native/Lab.onepkg b/corpus/notebook-package/native/Lab.onepkg new file mode 100644 index 0000000000000000000000000000000000000000..6c73d8d38c8fa8ec7def95e805ec56affab4050c GIT binary patch literal 6309 zcmV;W7+U8|Q$t1o0001`7ytkO0000i00000000030RaF5000000001m0000200R=x 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 bJij|tJJHeqd# + diff --git a/corpus/notebook-package/onenote-unpacked/unpack-dialog.png b/corpus/notebook-package/onenote-unpacked/unpack-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..fea56b966e49f443f277a4818a46a0ee5b349762 GIT binary patch literal 71668 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 KxMLO23;AH%5?mTrQj7#?q`OhrsL;^ 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 literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/save-as/candidate/Inner copy.one b/corpus/notebook-package/save-as/candidate/Inner copy.one new file mode 100644 index 0000000000000000000000000000000000000000..84e9e2d27f9adfbbb819319e0710a21f1f8dcde1 GIT binary patch literal 6032 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 literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/save-as/cold/commands.jsonl b/corpus/notebook-package/save-as/cold/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..c33b60ab22518d143d6a2bfda0e055cfed7afdc4 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-113F9C31 -ExpectedPages -1 -KeepOpen", "exit": 0, "stdout": "Read 2 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/notebook-package/save-as/cold/machine.json b/corpus/notebook-package/save-as/cold/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..39cef3cdcba9c4320f42c2a3100c1a64956c7126 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/machine.json @@ -0,0 +1 @@ +{"name": "m6-113f9c31", "hostname": "ONE-M6-113F9C31"} diff --git a/corpus/notebook-package/save-as/cold/notebook/Inner copy.one b/corpus/notebook-package/save-as/cold/notebook/Inner copy.one new file mode 100644 index 0000000000000000000000000000000000000000..97d6e242b0ed0ed8e44825cc3fc41d9c57251c54 GIT binary patch literal 6032 zcmeHLYf#ix6h8}yC#|s1`jE3{=IsC8d+t5= zyzaT@ZsUZhE7n}up1Eu9D@*J8ZmLhJbWXLU&2<)4Ew8_@b^mSgfe}|rtWT`HGp4Gp z$J$%9yRJM1x;LunEdaKI)PVU_<7#-&%xj^C8~2Yd+ca!ww4R-`ab0etqVekrHF_!d zB%AGQW61OC>fvd+8<#)6nlQE{(pg&2@ZJyK9n(9Q((5mvKP(nz>xd(Ozb`&H4E+#SA zBqpLC4jjl-Lt+h9;{#x>A+Vis=($xVW4|m?@RuagCQ`4Sd@}Rk&pGoio!;4(W#$;klXql}%#>N^shf;k z)vd?LP_hkad0mlQU*~H!@xal?Wb;@GNmt1*U7NN%!op#%5f%8u@R5}{iRc*X)>1Qr0Bf#h$@$5cQBYhEk@&R!`Hiy6> z7A|JpQ)?0@qtELujlgcR|U3q|_u%zU#FO;~cLp@ z0DHQG()Tz~vP(*L8p>yCNKLJaY| zQD)erUs{UT>G**w`}`PjDRtzwcSFN7mi52sm9^cgTHhn;F9M#+vu94q>Zs;XyUOo< z)cI7n<_-e&E$uzH{HKNG8JlB64lL-I*2J0K`uf)F zN?+f&Q2G}0Bm+``j7Gl8-1*5=$zPnP{AeTr<1Fp_>V9uqhxoDU&N~|imK+J8T>jo$ zhGslV4W=<`Fw>tG+dE5qTXB7zDS0v0`?E@W>zCEs-C~?6Ed0lJ5#{B(sEN4}kOlO$ zCFl6F6Ymc$V?N^hhv$@G!}tvY(ytt+B1|kyeYktw(LSm&Zv~nG2v{Isf&YmGymJ6W F{u?KXFjW8m literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/save-as/cold/notebook/Inside.one b/corpus/notebook-package/save-as/cold/notebook/Inside.one new file mode 100644 index 0000000000000000000000000000000000000000..0531a88d3b64e20373bbc6a9f2d0ac4eca0b7357 GIT binary patch literal 6032 zcmeHLdr*{B6u%1!s5};36{lTAXALn&R>ES+$0|D$h9F`ZV>O}a2m_)SJEG3mHw-zX zWotPOl5Zh33sJU0Y|?y<`A_)3u^Iy(HDi;uW{%*L^!t6^cb9cptbh6=XV1*p`#6t# z&bjxTd%wMw^YV&!F7C>#-9MwWDRINOWMj^%sG-xJtGfDb-1@P9{viBd;-xC%W9#lr zsc9Ox?#8Lwiz7kzMakX)U_V4o=&hWW(_`md4m)(Me%j^@&cBekZ|U(d_gc#5Db=|d z=civXczsnuMVUpI)}#p2S7u=v0RnOL?rZox{>R-r`#BkhajB*3&-C~m*?rK^Ka3FWwRuR|2Z zI_j&NZ*EGQzrKDNi->^7tv$6tHkv@XdvvpA zx~?Q0a#BCfO*oMI!gp~lVd_108+Vz!pE__)$$Ks7WVGVWJ(l_T^*IZhPwYvIhS(HQEZz_WVxE|fk-W*M zRo;4BFAC#cVmWjp`I71cam_55|J+!i6t1ZL`?#+ zei4+38VWlGcFhN_L&Ib>tc*Xwi!+>?PRI0u5Cg2chS(bB=pK2*tXr-K^Wh z2z7n#5!WrXi1=l|UWlPwTdreZhp|yu(pm4rRM}y)d$6#MN)hq*&B91~$=Y?_7?EC` z_ka>2xJTS88Tqbz0uj7pW~T^qZ>-Y?`sr`Bm?IY8EWCg-Q6h@eQ$erNFkghZx!BJF zjE4b*Vi3#$vdin0DvVlKwK{%s7MB*t?FkPqa}^zoIf(22Zmd89}A z5}R~lDF}>Kq%SdD-(@=pJX}$}#0s5AwTxA?B%W}KiYA@N)Z(!)aD!p6Fw8kuIsV2s zo2>iFtCA8@6Uf}=vkcEcCYkBl=9$HLOB{38+>5(<_TcF)JIS0%7XVz62gl3&!JhF$ z8-5>sU`WXjOPR}%_wU|={izGU_n`m2&;$bCg9&TzJDoR5GS;rHJy)hoyew%NN9V6L z&-Y-uZfFCh0-cEN-h=kf>TdDP=WmVgd(fZ8O=NVn_u#|cZv%8w`5yGwLfega52|~O zzDMT`q>sEjn`(=G5AV0cYZftTa*D8WgIujGF=tzDX4GujSzNRD=N6yps!FO0DE~$M zmU$`vB4A!R*Kgf@#vNlXA9Q}NCBNen+WxS-v_ghF+ZU|*(3IQMyXWI^muxeVUy}K1 zr;7k)0HYs)3<#wF^R+@JGG7@eZ@xbKT!K>x!B40+p1c#NtGn+rF4+0~#o9rjzwf2K z^1b8e7ioKj->QD9wzQ6%zW(~Z*`>e!=R*2h$xH^M0(lzwU8dG2-K9Y1MDBxD1hib5 ze)yw;_6w~UZ;u>t@=AeC&80x!TbgIgrB*$d4OlhME_Rno{I;TelWut>m0|(XAPfRP8lnQCMnD)M3?r|U za3-^Jg3{hN%sVDt2chiz}vRyDW7+ofok!Z#E-PnkAv30h{}ahv3O zi$Q!YsF-QCNHT~o3gxHhc)b8JN5NvI#=*w-qqaMzHJ*^Sko`;hysaY zi)RJBYFu%e&A4X8;w)3|X0>eB3f^!$BqE+Cr~6xUZ6xj-%lNdZZa$Vo + diff --git a/corpus/notebook-package/save-as/cold/read/page-000.navigation.json b/corpus/notebook-package/save-as/cold/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..163d0e2ebf70e671e15b2c4234850d0c72fe963e --- /dev/null +++ b/corpus/notebook-package/save-as/cold/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Inside - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/notebook-package/save-as/cold/read/page-000.png b/corpus/notebook-package/save-as/cold/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..873fa5fc7c6a9b52dba420585867ca8c9cc21587 GIT binary patch literal 40347 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 M07*qoM6N<$f)6Z>BLDyZ literal 0 HcmV?d00001 diff --git a/corpus/notebook-package/save-as/cold/read/page-000.xml b/corpus/notebook-package/save-as/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a157b38a7c8aacf515b384851d42f0635dd3958a --- /dev/null +++ b/corpus/notebook-package/save-as/cold/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/notebook-package/save-as/cold/read/page-001.navigation.json b/corpus/notebook-package/save-as/cold/read/page-001.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..163d0e2ebf70e671e15b2c4234850d0c72fe963e --- /dev/null +++ b/corpus/notebook-package/save-as/cold/read/page-001.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Inside - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/notebook-package/save-as/cold/read/page-001.png b/corpus/notebook-package/save-as/cold/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..d8602ed46099a17c74e2c7c05c54df98ce8c6a9e GIT binary patch literal 40217 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

uf6o4h`_kn%uJVcG{{2ZL}%K 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 RlNbO1002ovPDHLkV1nOI-v + diff --git a/corpus/notebook-package/save-as/cold/read/payloads.json b/corpus/notebook-package/save-as/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/notebook-package/save-as/cold/run.json b/corpus/notebook-package/save-as/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..d59cc4279979747ab86fc64b2afcf1421617b703 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-notebook-features/saveas-export", + "expected_pages": -1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/notebook-package/save-as/cold/scripts/cold.ps1 b/corpus/notebook-package/save-as/cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/notebook-package/save-as/cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/notebook-package/save-as/cold/scripts/read.ps1 b/corpus/notebook-package/save-as/cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/notebook-package/save-as/cold/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/notebook-package/save-as/cold/source.json b/corpus/notebook-package/save-as/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..9ae5036eb0219ce8d6a1e2988cb9135b4851bd85 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Inner copy.one", + "bytes": 6032, + "sha256": "48f848eb6d0c1ec03a137763b8595b7b4cb7ee6e0f5f8bdf96e6cb5f5c23be1e", + "mtime_ns": 1790880013898068009 + }, + { + "path": "Inside.one", + "bytes": 6032, + "sha256": "0a311b978c401a5571be844dfd54cddb551d6820eac0b4d72ad590afb563bcb2", + "mtime_ns": 1790880013898269467 + } +] diff --git a/corpus/notebook-package/save-as/cold/teardown.json b/corpus/notebook-package/save-as/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/notebook-package/save-as/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/protected-edit/README.md b/corpus/protected-edit/README.md index bc7dc43bc32e6c0817ecf781b64e2f6c3445e44a..c8654e8bfb8d0b26819ad27003f92f3813fca0ee 100644 --- a/corpus/protected-edit/README.md +++ b/corpus/protected-edit/README.md @@ -2,8 +2,8 @@ `candidate/notebook` is `native-encrypted/encrypted-01` after a Rust edit of the unlocked page appended text to the first paragraph and added a -paragraph, exported by `an_unlocked_page_is_saved_under_the_section_key` -(`ONESTORE_PROTECTED_EXPORT`). `candidate/read` is OneNote 2010's COM read from a +paragraph, exported by the protected writer that `Section::unlock` has since replaced +(`corpus/protected-sections` gates the current one). `candidate/read` is OneNote 2010's COM read from a fresh clone with an empty cache after unlocking the section in its UI with the fixture password (`../native-encrypted/manifest.json`). diff --git a/corpus/protected-sections/README.md b/corpus/protected-sections/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fa07a838e25e7f73ee01460083fd58f9414a2200 --- /dev/null +++ b/corpus/protected-sections/README.md @@ -0,0 +1,58 @@ +# Password-protected sections + +OneNote 2010 (14.0.4763.1000, Windows 7 lab) setting, changing and removing a section's +password, and Snowbound doing the same to a notebook that a fresh OneNote then cold-opens. +Passwords are fictitious and public ([manifest.json](manifest.json), +`candidate/passwords.json`). + +## What OneNote does + +- **Set, change, remove.** Each writes the section anew: OneNote deletes the file and + creates one at the same path (a new NTFS file index, its creation time tunnelled), which + grows through some 30 transactions. Every identity is new: the header's file GUID, the root + object space, each page space (one fresh GUID for all of them, each its own `n`), and each payload's + file-data GUID. Each space keeps its labelled revisions, each a checkpoint: the current one + under roles 1 and 4, the version history under its context. The TOC gains an entry for + the new identity and keeps the old one (`native/*.one` from `source/synthetic.one`). +- **The crypto.** Office Agile encryption (MS-OFFCRYPTO 2.3.4.10) inside the + `ObjectDataEncryptionKeyV2FNDX` container (MS-ONESTORE 2.5.19): the words + `3, length, 16, length − 16`, version `4.4` with flags `0x40`, then UTF-8 XML with a CRLF + after the declaration and no data-integrity element. Key data and key encryptor are both + AES-128, CBC, SHA-1, 16-byte salts; `spinCount` 100000. H0 = SHA-1(salt ‖ UTF-16LE + password), Hn = SHA-1(LE32(n) ‖ Hn−1); each block key is SHA-1(H ‖ label)[..16] with the + password salt as IV. The verifier hash is padded with zeros to 32 bytes. A change of + password draws a new 16-byte content key. Property objects are their reference streams, a + length, a random IV and CBC of `u16 padding ‖ bytes ‖ random padding`; payloads are CBC, + IV = SHA-1(key-data salt ‖ LE32(0))[..16], of `u64 length ‖ bytes ‖ random padding`. + Read-only declarations hash the clear bytes zero-padded to 8. Every revision OneNote + writes anew names the key; its later dependent revisions do not. +- **Locking.** Locked, the section shows "This section is password protected. Click here or + press ENTER to unlock this section." with no page list; the Protected Section dialog says + "Password is incorrect." Options › Advanced › Passwords: lock after not being worked in for + 1, 5, 10 (default), 15 or 30 minutes, 1, 2, 4, 8 or 12 hours or 1 day (registry + `Options\Save\PasswordTimeout`, minutes; it takes effect after a restart); lock on + navigating away (off); let add-ins reach unlocked sections (on). With a minute set, a + section idle on screen locked between 72 and 132 seconds. Ctrl+Alt+L and Lock All lock + every section. Locking and unlocking write nothing. +- **Search and Tags Summary** leave locked sections out without saying so, and take them in + once unlocked. +- **Other writers.** With the section locked, OneNote wrote nothing while another writer + appended a revision, and showed it once unlocked; unlocked, it showed the next one live. + When the other writer gave the section a new password (a new file, as above), OneNote + showed it locked again, refused the old password and took the new one + (`native/observed/`). Observed on a local folder with one OneNote; two OneNotes on a share + were not tried. + +`native/snowbound-changed-then-onenote-edit.one` is a section Snowbound protected, edited and +gave another password, after OneNote unlocked it and typed into it. + +## Snowbound + +`candidate/notebook` comes from `a_notebook_protected_through_its_sessions` +(`crates/notebook/tests/protected.rs`, `ONESTORE_PROTECTED_EXPORT`): OneNote's pages imported +into five sections, each given a password through `Notebook::set_password`; `Edited` edited +through its session three times, `Changed` given another password and edited, `Removed` +unprotected, `Conflicted` edited offline by two replicas into conflict pages. +`tools/native_protected.py` cold-opened it in a fresh clone, unlocked each section in OneNote's +dialog, typed into `Edited` through COM and read every page (`cold/`, with the notebook +OneNote left). `tools/test_protected_sections.py` checks both directions without a VM. diff --git a/corpus/protected-sections/candidate/notebook/Changed.one b/corpus/protected-sections/candidate/notebook/Changed.one new file mode 100644 index 0000000000000000000000000000000000000000..6d931caba83f4f03b321ba14beb8c1c2909aacf4 GIT binary patch literal 26248 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%0Dv1klmKA)AyiHbatKra;PX)UXHkf!0RUYc{NEuq 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 Z-6*SJSW>+F5LLthQ5VCJ&-?Al} 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%0D>*3+|~fsi?F}gz<7vu=mYi9Z+NZO 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 U-|Ka@*ES{4E@P6)zt`*k15#1OH~;_u literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/candidate/notebook/New Section 1.one b/corpus/protected-sections/candidate/notebook/New Section 1.one new file mode 100644 index 0000000000000000000000000000000000000000..05204c03b5b30e42f3c05b9f40c69a5dcb816c16 GIT binary patch literal 6064 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 D`OeH6 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/candidate/notebook/Protected.one b/corpus/protected-sections/candidate/notebook/Protected.one new file mode 100644 index 0000000000000000000000000000000000000000..ca9c73b53ff410c073f916c23c5006df8e3cf8f3 GIT binary patch literal 22976 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 MHxkgd0qFGq0`S33V*mgE literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/candidate/passwords.json b/corpus/protected-sections/candidate/passwords.json new file mode 100644 index 0000000000000000000000000000000000000000..d7b4248f39fb8e41d90fc6ee1b369a2f4921f020 --- /dev/null +++ b/corpus/protected-sections/candidate/passwords.json @@ -0,0 +1,7 @@ +{ + "Changed.one": "Changed again", + "Conflicted.one": "Conflicted gate password", + "Edited.one": "Edited gate password", + "Protected.one": "Protected gate password", + "Removed.one": null +} \ No newline at end of file diff --git a/corpus/protected-sections/cold/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/protected-sections/cold/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/protected-sections/cold/before-read/environment.json b/corpus/protected-sections/cold/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..551f12798f53d63c8dee8b77bba7346bd4fd285a --- /dev/null +++ b/corpus/protected-sections/cold/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-7DD6464F", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/protected-sections/cold/before-read/hierarchy.xml b/corpus/protected-sections/cold/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..c33dfb411d4c11635d78f15c70e8b25b00401b99 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/before-read/page-000.xml b/corpus/protected-sections/cold/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..4edb2a1e82296acf21afc114a8a06b7f3c1785a6 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/page-000.xml @@ -0,0 +1,10 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/before-read/page-001.xml b/corpus/protected-sections/cold/before-read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..b48c0ea70cc6d5f931a93ebe60e7104cd2fa7028 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/before-read/page-002.xml b/corpus/protected-sections/cold/before-read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..6470dfc5de69c0385d67bb816651d72b0b3d16d6 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/before-read/page-003.xml b/corpus/protected-sections/cold/before-read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d5b215f47b0c8bdb032b7406b1d5f178470ca0f --- /dev/null +++ b/corpus/protected-sections/cold/before-read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/before-read/payloads.json b/corpus/protected-sections/cold/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..70b778b0185ab794547555041fcd026dfd67a078 --- /dev/null +++ b/corpus/protected-sections/cold/before-read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{5E6C34E5-427A-0A35-01B4-729CAEED1AE3}{130}{B0}", + "kind": "InsertedFile", + "page": "{49198084-72D5-0478-36CF-554C2E384795}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/protected-sections/cold/commands.jsonl b/corpus/protected-sections/cold/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..de898046ca903ea553b8d5b10796470e19875d1c --- /dev/null +++ b/corpus/protected-sections/cold/commands.jsonl @@ -0,0 +1,11 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-7DD6464F -ExpectedPages -1 -KeepOpen", "exit": 0, "stdout": "Read 6 sections and 4 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\protected.ps1 -Root C:\\one-tests\\runs\\capture -Section \"Changed.one\"", "exit": 0, "stdout": "{BD36212E-67E1-001A-2596-A965E372BE1D}{1}{B0}\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\protected.ps1 -Root C:\\one-tests\\runs\\capture -Section \"Conflicted.one\"", "exit": 0, "stdout": "{4EC67B14-8B14-0FB4-1BCC-77419636D128}{1}{B0}\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\protected.ps1 -Root C:\\one-tests\\runs\\capture -Section \"Edited.one\"", "exit": 0, "stdout": "{57E01347-A220-0EFA-08F3-0D3CA3CC0379}{1}{B0}\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\protected.ps1 -Root C:\\one-tests\\runs\\capture -Section \"Protected.one\"", "exit": 0, "stdout": "{115F7C93-2767-0F3E-2907-1F325058528A}{1}{B0}\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\protected.ps1 -Root C:\\one-tests\\runs\\capture -Section \"Edited.one\" -Edit", "exit": 0, "stdout": "edited\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-7DD6464F -UseCurrentCache -ExpectedPages -1", "exit": 0, "stdout": "Read 6 sections and 16 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/protected-sections/cold/machine.json b/corpus/protected-sections/cold/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..b8ec87fc4343bda03890e63230b5a8272dfb8be3 --- /dev/null +++ b/corpus/protected-sections/cold/machine.json @@ -0,0 +1 @@ +{"name": "m6-7dd6464f", "hostname": "ONE-M6-7DD6464F"} diff --git a/corpus/protected-sections/cold/notebook/Changed.one b/corpus/protected-sections/cold/notebook/Changed.one new file mode 100644 index 0000000000000000000000000000000000000000..f0916f2240991e0372537c4895f3f2b3e6e5bf14 GIT binary patch literal 29336 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%0DeSa5Y%<2Z2X~8r`*p#alwaMGDlKFG{ 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 M1OGQTfNuQ%7xAoeq5uE@ literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/cold/notebook/Edited.one b/corpus/protected-sections/cold/notebook/Edited.one new file mode 100644 index 0000000000000000000000000000000000000000..b784b2c0116015c0b27c51b592fed0841c31c4c1 GIT binary patch literal 41312 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 D`OeH6 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/cold/notebook/Protected.one b/corpus/protected-sections/cold/notebook/Protected.one new file mode 100644 index 0000000000000000000000000000000000000000..4a21d2ae99c8ea1efd03d14d0e56b4f39d061a67 GIT binary patch literal 26064 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 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/protected-sections/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/protected-sections/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/protected-sections/cold/read/environment.json b/corpus/protected-sections/cold/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..e814f07183d381a6ce561424c1b3c5ea53cf903c --- /dev/null +++ b/corpus/protected-sections/cold/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-7DD6464F", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/protected-sections/cold/read/hierarchy.xml b/corpus/protected-sections/cold/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff4efd05454ff136f37e37b5e7dd7aef80b85aeb --- /dev/null +++ b/corpus/protected-sections/cold/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-000.xml b/corpus/protected-sections/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..33865a2109f8270aa86a1e9bb233753f1c5e3860 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-000.xml @@ -0,0 +1,13 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا Edited first under the key. Edited second under the key. Edited third under the key.]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/read/page-001.xml b/corpus/protected-sections/cold/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..377e978c02254e6814bcdc4567b5caacb49fcaad --- /dev/null +++ b/corpus/protected-sections/cold/read/page-001.xml @@ -0,0 +1,11 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا Ours offline.]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/read/page-002.xml b/corpus/protected-sections/cold/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..0df0abd1a73f2383e458fc6e3f01e5e43cb48a58 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-003.xml b/corpus/protected-sections/cold/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..de17b9702cf9c2d434cded22f90cca6f73aae385 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-004.xml b/corpus/protected-sections/cold/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..4aafdd9692a2124452dc46ecc1a28d6da0b536dc --- /dev/null +++ b/corpus/protected-sections/cold/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-005.xml b/corpus/protected-sections/cold/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..4edb2a1e82296acf21afc114a8a06b7f3c1785a6 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-005.xml @@ -0,0 +1,10 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/read/page-006.xml b/corpus/protected-sections/cold/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..773a662c916bdc25f9a7b10f930ed585b99019a0 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-006.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-007.xml b/corpus/protected-sections/cold/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..c6798d1e5508b5142ace75414442af5c6404aa84 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-007.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-008.xml b/corpus/protected-sections/cold/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..6470dfc5de69c0385d67bb816651d72b0b3d16d6 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-009.xml b/corpus/protected-sections/cold/read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..34aabc0fa1da6d33eaa0f5661644acd4be4d32ae --- /dev/null +++ b/corpus/protected-sections/cold/read/page-009.xml @@ -0,0 +1,10 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/read/page-010.xml b/corpus/protected-sections/cold/read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..50f08e24db102bc667da0d6b0f15fc933c67fff3 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-010.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-011.xml b/corpus/protected-sections/cold/read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ddd7db7dee4b3cf9b721a08d1b25865da7ce0dd --- /dev/null +++ b/corpus/protected-sections/cold/read/page-011.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-012.xml b/corpus/protected-sections/cold/read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..7302a631344e10b0ea24914c986d981f080d1532 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-012.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-013.xml b/corpus/protected-sections/cold/read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1f7ab7de96d187d9dfbbe40c770aed00eece3eb --- /dev/null +++ b/corpus/protected-sections/cold/read/page-013.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-014.xml b/corpus/protected-sections/cold/read/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d5b215f47b0c8bdb032b7406b1d5f178470ca0f --- /dev/null +++ b/corpus/protected-sections/cold/read/page-014.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/protected-sections/cold/read/page-015.xml b/corpus/protected-sections/cold/read/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..8eae34fc39bd93d5623ec87687aeec2d048e1040 --- /dev/null +++ b/corpus/protected-sections/cold/read/page-015.xml @@ -0,0 +1,11 @@ + +Fictitious: café, 東京, مرحبا]]>Fictitious: café, 東京, مرحبا Written under the changed password.]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/protected-sections/cold/read/payloads.json b/corpus/protected-sections/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..fb5e20eb9784d078910f438033c99a5e9be5b2e6 --- /dev/null +++ b/corpus/protected-sections/cold/read/payloads.json @@ -0,0 +1,42 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{494711AC-8C21-0B35-201D-C281CCD3535F}{52}{B0}", + "kind": "InsertedFile", + "page": "{09B82703-E16E-0E2C-0350-7B8F0E453BD8}{1}{B0}", + "bytes": 43 + }, + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{9295EB43-6BB7-01D8-3BCB-B972DFF40F79}{169}{B0}", + "kind": "InsertedFile", + "page": "{0A6963A0-3B14-022B-3322-0716C2D41936}{1}{B0}", + "bytes": 43 + }, + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{5E6C34E5-427A-0A35-01B4-729CAEED1AE3}{130}{B0}", + "kind": "InsertedFile", + "page": "{49198084-72D5-0478-36CF-554C2E384795}{1}{B0}", + "bytes": 43 + }, + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{2258725C-FAAF-0704-1006-EE69B8759811}{13}{B0}", + "kind": "InsertedFile", + "page": "{866584A2-177A-0F98-3D57-EE8DE1960AF4}{1}{B0}", + "bytes": 43 + }, + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{9E1DBD46-BE03-07FB-16F8-D5BB1289206E}{91}{B0}", + "kind": "InsertedFile", + "page": "{FD77E918-CDA0-0CA5-1038-F63ED915C073}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/protected-sections/cold/run.json b/corpus/protected-sections/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..78306f525e67a294a9894525779b08b840d2d0c5 --- /dev/null +++ b/corpus/protected-sections/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-locked/gate/notebook", + "expected_pages": -1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/protected-sections/cold/scripts/cold.ps1 b/corpus/protected-sections/cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/protected-sections/cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/protected-sections/cold/scripts/read.ps1 b/corpus/protected-sections/cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/protected-sections/cold/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/protected-sections/cold/source.json b/corpus/protected-sections/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..e84cdea9f0e652f3a059cf57a036ec8d12f441c3 --- /dev/null +++ b/corpus/protected-sections/cold/source.json @@ -0,0 +1,44 @@ +[ + { + "path": "Changed.one", + "bytes": 26248, + "sha256": "c6dfb825da16bd399d9c08e59b9fce17ce6d31000ac9dcb35fb88348abcc25f6", + "mtime_ns": 1790841675948190811 + }, + { + "path": "Conflicted.one", + "bytes": 44384, + "sha256": "53bf55828c7d7b3e27812bb8a37a58826019d363982b460eb20b99038f077e2e", + "mtime_ns": 1790841676132162946 + }, + { + "path": "Edited.one", + "bytes": 28952, + "sha256": "36fa95d9944b91cc702b2834a8938fdf4db03cb4cc4eea59ad4118cc0045fe1a", + "mtime_ns": 1790841675847211065 + }, + { + "path": "New Section 1.one", + "bytes": 6064, + "sha256": "7c59a07e40a6162d9392b069dfec88822b0ba540e671ed1199582e89c958013b", + "mtime_ns": 1790841674768801766 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 8520, + "sha256": "4308d8a6273eb58cd0089cbc056d4cdb5f5767e8f61a1173bbb17a8fb853e6ed", + "mtime_ns": 1790841675974244740 + }, + { + "path": "Protected.one", + "bytes": 22976, + "sha256": "d1ec539f23bd1b7355c3e9891735fc23a3f27b65d304c6cfd19eed18f0fae857", + "mtime_ns": 1790841675582959551 + }, + { + "path": "Removed.one", + "bytes": 19656, + "sha256": "4db34bfd031431a02909183e75c0f836eb10e43aef0842434b44ec801735a232", + "mtime_ns": 1790841675961507402 + } +] diff --git a/corpus/protected-sections/cold/teardown.json b/corpus/protected-sections/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/protected-sections/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/protected-sections/cold/unlock-Changed.json b/corpus/protected-sections/cold/unlock-Changed.json new file mode 100644 index 0000000000000000000000000000000000000000..6930ab11f870f1a0ba74d202bcebf21a2e8c4544 --- /dev/null +++ b/corpus/protected-sections/cold/unlock-Changed.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "Gate - Microsoft OneNote", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Gate - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/protected-sections/cold/unlock-Changed.png b/corpus/protected-sections/cold/unlock-Changed.png new file mode 100644 index 0000000000000000000000000000000000000000..97ca2c6bee8c0006551b0c7671bc4f74b5cebf4a GIT binary patch literal 40416 zcmY(qcQ~8x8#k<4MYUB`d$qLH5)`#p2i2BRRm5I3gV?cEsXaRES+hpOOc2DTHEYF; z)E=>k5F$_d{XOsT9B=+e?&H3X^S;jYImearih8T1e(eh96)GyKYp-6azN4bLc$*p)gr|*3-H=F4_Z>{G3n1Rgor^)OL_=8va(+GpJKKG&mE3!;x z3^O}F>@~l7x#^^3)pH$TE!t2O>S4_snKEh7N_WBb`y?TdiTchR`Wv^OytIFMiV`ai zeE#yIa}$mskGtdr+Y2O*xX$Khv~+Tw)LcZ+N5ICWK3)y_v7YYk%wk(7^R zV(T-?ovSr-t)(xavSeaf7+>dRi{0s*Lft0H`T#Z~z18G3denlgCj~oC63OM*eU%9? zkq;+*PJnkzKLz<4`1;y-+iDRTuI8rRz(%K8lRCY-3uyMMP6iz`nv~CwMP$}ItIJnc z86emDXJsEr_R5L8Hr8-bEv_h&8?|MiaN*;zv4-+A1o{;pZnk9ED=nY>*df~G1WL1~ z;>kmtfh?9_bMkUX*+Q9kkJYPJhSO=a#0_HhQFd9N!Dp*y0U1G}&B!9rKSm)=PL86& zB4T196(yz4#bC#sP5SCex`%e~QGKQtIuAp2=tB=ommhnqeoS3#p&8aw7`-gj)ec)W zEvug`DZl3jN_QD+B?SWzQ01kVPzq}@rSaQyealfSd9XR0FPU_n0Fw^(X<>Aeee06z^CZ?*2e-HQV@1`7})*%J)0XoPHSwATxB#FL$kE)jCN1u)VD}Q<`uf()IY<&lxQekdBKUXhqqU^5PTsmDZW>Y^dF?mH^`3PfU+k z)ClmvJg-X#nL-P5qKNmmSIRox#m&v(jZIubp(-OisZ0Z)udi=uh}or>phQr2C`T!H zqqBtMPhb!;>t{R28gRA(@z+R5R#TVbu0XAf;jKiAM-l_)q?&~kp96DD`8ih2 z!gRzdr+}m0v43~~^<{K!c5Y()Cul55yyq?8J}Uz1k{a;%gknI+pMxf{!FR;POR7t| zeb)Ylgwm_utd_h8E2Gh;I&78LUHUq}8rxdk!U1yqBU2fmPY8D7_P)favQS(eH_CrI z@t)d+{`j)%eOmB0<%SCW`T^w-+ZE(*(8OmjTdoS*%<3|s`n_O(dXuPied909R4IjA ziGu%6a(}zJ2KWAke3ip&J9!g-6At)PZ~_cD&Aq_NorOs`nr$$wZ5O;ZJ+P^GJtGDVOW*Hcp{WCi~CiIxPFYmk<*v|rNMs)K; zGe;*+H~R0uvKkT2n4%%DlM}0C!aZJLApm`?OR-(0@}vDnAO>#)Oms3!`|Xu3aI-Q<<_WT8E2Awgc5)&pChh z#XQJ|U1{Kbxwp0k$;D2>zyqF!yGY@37%qA}84>TQ^spHg8^_h?Dy9F@_zyK`wLGJ? zwU;k|+#XSLZt1<0z^}r6y!&f2KREMn|4@N^*1ttQpH(?u&d2ewxri{ul%FM(#U`E7 zZgTOTKGO>HYR-Q9!n!c)mE;P0beE{@YWVR2=V+k~3%wh?pmyff>a*P;izz3|R67bp z>H^&W6SN(8GznclXh8#+&reu3NFLcxW$;9=9Im8zLwpTx}eIn&=AI$x+D^w>mUb3!sayLyX>}E zL-0CtMbAVk&pU*wqFv0%AMGRiNCvTT$il+q<$KFKB0S+QtkdkS#Oz0RwkMBAJeJ!7 zQqoq_?5Ep(ml&ZJS|ou8<3~ZpkN&;_=vo;56V}lY7l*t#+7Y-A*�Jx4+qu6ol39 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 Hu0mjfDQA{zFLP6MBlbA;Yk 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 FV1g$^2%P`` literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/cold/unlock-Edited.json b/corpus/protected-sections/cold/unlock-Edited.json new file mode 100644 index 0000000000000000000000000000000000000000..6930ab11f870f1a0ba74d202bcebf21a2e8c4544 --- /dev/null +++ b/corpus/protected-sections/cold/unlock-Edited.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "Gate - Microsoft OneNote", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Gate - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/protected-sections/cold/unlock-Edited.png b/corpus/protected-sections/cold/unlock-Edited.png new file mode 100644 index 0000000000000000000000000000000000000000..72f01c161fef41bc0975a96d60635fba1cee7502 GIT binary patch literal 40619 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%0AL{bI7Um?g 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 N002ovPDHLkV1jgTi+lh8 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/cold/unlock-Protected.json b/corpus/protected-sections/cold/unlock-Protected.json new file mode 100644 index 0000000000000000000000000000000000000000..6930ab11f870f1a0ba74d202bcebf21a2e8c4544 --- /dev/null +++ b/corpus/protected-sections/cold/unlock-Protected.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "Gate - Microsoft OneNote", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Gate - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/protected-sections/cold/unlock-Protected.png b/corpus/protected-sections/cold/unlock-Protected.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee9de93475855341d4d219bfa92d6287da10b25 GIT binary patch literal 40939 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

BDJ(OU>3>!k-xTKrI|1Ns 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 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-change-password.png b/corpus/protected-sections/native/observed/onenote-change-password.png new file mode 100644 index 0000000000000000000000000000000000000000..e67e0ecce606f795b3172d35631a3d3ab0120fd6 GIT binary patch literal 60960 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 m6U1hl-bNX3H^XzO1m+aPEIuq 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 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-locked-page.png b/corpus/protected-sections/native/observed/onenote-locked-page.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9ee07d3b7dc5e9e03c9bfdd1b309e3d7dd30f0 GIT binary patch literal 48538 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%0D`~s7!E~>8k-41hFu|6tn1XjGYK(bLd1DJxLVZ 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

  • +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 VkM?36D7)`FDRH^)m7)gz{|Ec_@^}CM literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-options-lock-after.png b/corpus/protected-sections/native/observed/onenote-options-lock-after.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2b31b3844e116d65ba10430f824079c2a60ea2 GIT binary patch literal 52296 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
    m_^?_a#+;^tQ6hgvAd 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 xMDz z;c#(XzQisnI?pg~sB$SGR+L$A4vPR9_c9mLhiA)bL{jEk0;mgkTI0?;XSTL;$?8(R zcb)m0d5O(>YcAWpiOlnP8*C<_`5Ul67T=tq(uO$!Qo9c{-m<&~o_{ai^-a}2X>}bW zJ(Ozp2gZi*oxpaLlDvT|*Y#EzoNUV=US{O~_270~oEDmbJzm+0DSDOp04(mcG|$>m47tmQ1(a`}9<7{RKn*P`!}VvJWZDWzH=;HB^nK7#09uUUWgX3bJODS z)4{$ZPiG|Ft*dTMul8R|vvsD9b$X>-x;1t8*}}gqFyLbvu%H`92@Wf?(}=hz;&?=- zJ1eH#DJ>z5@x{{fMzJ)@m)9v))GJi9$W=8(Gd0IDxyjZxDp%Jl)-=miH_KPlD>(^T z5Jq7sXG$sfmbrBl6Sa>Bv3WY<@!WT5^!5jc@kdPYGJmSez=3A|UvAgCHl6@#QLL~0BXo8%_@zL2E`{uhrcqfa4QnWZJ6a2MQ8M-Gz{lS zN!IKeL`9xJ+We@r$@1o9=<~({)tc=vcSHXF0QjVOV-aPUtXqGobFq}IHBx-6+)R3k`RA&S_2$XwIyvg`!$X=fv&rgyEwK2rbQOwq7rdA1U&3L|@KH-_&dLT% zkXwa#U!C5ko^}x#qWeGl*e^X7=iQBU;n2Bvk#4;EIN$ix`ux8pky0C20ru!&};m>ryJ_zIyCl zxd<#A^=BB3BM<)3%E*WojUmq8pBNe>Ajco-3@c7fv5h6sOZ_z%hD1t(751A$nKB@< z{7afF>ZoA83vb88%QZ~HMEVq%2zUQrqevjxk z_wL!(wXuMOIZ=zza-nTyENffuU z+RtE=k6Bdy<+N}eJ7@CdW4j_`yF8h;oOmakF+6l5ER4okipJ%ji8kLpZ<4pjl9hsM z26Zv?yA83#Q$x9qkMFq;H`9M=Vx)`=gdr{U4)KU^FCg}}dkXmv=%Tf&zu zE2AH?Ssj^(0)?h7)C~bH)WpO&g<~jm{4k^<)eMh|**H_~>GT1qtX<1L=LpI*dz-rz zrhCDnp~Pg$-3zmOJP{sTJO}$tUDXl^!hK`i|cO+~KUVm>{QHs$LcL ze^mh}v@lhYN;K8KUwu>wT7zq+Hy<+uV2Smw(p=wy|)iYT418iD~&#LI!352^wO zs|yN9>VxaEj7rW7Op|$YzqHl}M%AT}n!0lqn+VT68#0pdex>`cN9^?}ivG%N%g_Bc z9qna?p?~aBqw^#EqVUl?YLQN1J9p(w%8pjkhFAIqyGVb&=nN_h;%X{)XS890tQYluO5z z)Z)IMwrK7ebBGs z;`=v!f5$mu2=MAe8-$Xro>84HyS%HPPgg2SGy82hDY|-M-nSl0TR~qOLQEUr5CA_o z*@QWV+Ny|u7HNN34Z`IJAdN|5TJ>Na+mRjC1?|{HUn|%W#V9dd-mJl1v z@xmEHk@m~K(Hin`hYZgSQKrCcnEcYo?GVr4O%{rxE8Ih_fEAaPiz+`Wr1S+QHFR^> z+1Y@-X?tWp@J#AWN#U43XQ`MCsL6HsjNLtaQGD1Al(V|9ly@tg1=NxusMVK7Fwd35 zbj%NKB*o_`UUAxnJ>^e#05lO;jJ0eU8HMQgZ4cJ{4-}L$2AOj8-ovljcL=OumA{s<6z8CM4CCKx|C$hO; ziweg4=g~#d-WzUHI-Op3swt6s#uut^Z>uT-Ojj=d7J9gQk4#v2y+hS~LN}qY4~Cna zJmDk*eU&*Pjd}(FE55(i9a1}b*cxj31n``p&+CWq^gsqBPOE<8&0P~|UNMzCrMo}P z*tm)*0k2r|mYn<(YM*$eP5-5>nBUWx;u)IYlN&dC-mxH1nbo57oE2Q_-bpkbqGOwm z_g51)W|%-BhlE#;m|zthX>c#_^Y*Nc(fN5oA!Fu`m2H)y#h5u=#_3_o8%QPYND9U* z_U(i4^Fdra)eq zC_KX;Goy0GC>D%i!3Dqc>OcGrR&MWhZRVgb)b}3%#O&Wt5QJD;V)H;F1HNGYh%oTu zW-n|PD?bD09}1G8po;o-&u`AFwEwQ?cwH1hfU-oVl*ajcOs*7#>m~N{e^_R>UM52+ z*+-he`ZDaIP+SVn9HKC$4;`m$nr6AD0c}|TLq1WL^lK~v&h5IYE+~wnFLU`jlD6~5 z)$G5^3{|#X4AZ^lGPs$$yyGtJFQonh2&Sf_721)9<#(uPWq)oyD@hSC_M{9l{A!8O zBm0W>BmMgwhAMCosQwV_v#0L0>U*a?pge74`}o_gT`REG)a`JP=Z zy;E&PPyaPO(7N~8`ak~}>Xm*w0Wtqlb}1;C^_}h?E_$FQ|5LcoQ>c&+na3qkNY~Ib z*WmPS9Sc83r&HjsxEBhdhu$tnC|~`zYJ*o#p%<{{_0#;EZ+g)ZYeb09xro;?RKj@+ zd~b{YOY2J8hskb>M=fxZbctn=)wr>_anq6R_P*^gB8RSj0v))n|3CgVnGFj0;+zEo m-&z4#*@_nLOZR&vPz*jT<4HuN1hTi~lbn>2WR19S@c#$>)%NTF literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-options-passwords.png b/corpus/protected-sections/native/observed/onenote-options-passwords.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea870fa68e12bb33b754b3812f1d2f50e6aa5fa GIT binary patch literal 49725 zcmb5W2Q-}D*ETFl2tlGI5hOZeNJNPqJ$m#}XGDu0y^~3T=$#NH!4M3_XwfHn?`_oR z(W7_18TtLo`#j&fzV)re!ae7{&)NIzeVx7cwQnJ>)D%dG9}wf<;E*c5l-0z+!Fz;* zg9{?U#ayALqGrdzX~b8QmD2W1-Kg`4XKgcH(ZAYGPYZZnI#X)m{%fNbX%$quQ8L%9 z@(gv)GJ;?Mjnn%L~VIYve2`Iv>30w<(}H3Jz>f6-Q|ez;}%|~XZ1pS0JCM% zkV@>@UMS9-FAFuSsyfCBjHs{`&Ky=$+E0|N9`7vJVm`*X6CSNe*q3^-9dH@Sc-nUL zoE9W)JpHzblwB?L$L6K+y&zM}7l^=TZls~XXXj;R2@~|7qOwl)djaos16|XT+nBEc zyQqwY{pG8(G0cafmGy2zIjZ2(EeGspO;7Az)@*mT2-U5s#-K#}&ySNBJ#YNIk8W^F z*k!fH(cgsyae29YRe$u0;a~Tho#ur}8_D6?+S_j)2A}?2$9VK%LR>8BbY0c&-{T6B zSfK|(dtv_?;l3WCT!lLAT&8_`J?25_mo2Zg2H$h#?aMmJf-%{2rj_hZRmGC$TLBl_ z{+Gf2WhRtfp{d3P)hFX}_%zo7FO(D%*EtQv)sSV>zbXz9lj~Kydv%#{xpY$0v-Z10&OheNz{D2Py4ZiyQf4 zE0IdL>%D;&f0rA9cJ%*KDt%jgKysNumQL&bMLmlm_6IHr%cs}T!TTHvd} z)tc95r>I!*+}H@$v$EGhc zd&FKn?R<^axrVvI^K3NgTq9?)xxy{Vnm6EpwME1q8kPo>xUMxW_^A1) z5TyytcrsIpJ2rnJ?R$)QzKiC^XsKecqvMc<`km&@7ukO-QkpeX9>DysDDOhW}oFZ)9=TYz6(w$q(`&_9axG34HFQ}^6Xs4)n ze^GpPC&$Cz5M6?@yEYEG!nzgmBCtr^>3F&p!`Xhs!0p6iA@s3H`1qfPNLL%3#Z;=t z=KWQ<48rb{;D;BQc9q5%4zgGNrWbBZ1&rBmCg&&3oaPs2$BWb}FsDnB@UTy`L@20=x%BA8 z6>ApxwI>=P%)s;y@6qO4tUIA}cw?#(ueS@q#b)0BO{*YkOW62Lz=MKWtk9U0dvoS9Z$lKkJ@Q714<*9D}9#}C5?Fb&IzeY6gC)HYFH)L-g;{@A&d@A zKYS>tLRBB-HA&Q5MS|;hBPSEmCa;b=lV_`B?7FWaqv^(a6hya=ySuxs96Y(uCo_`u zS8tJfNsd!In4g*g1$S=+%kH*=rrg=l``m#USm$U_Z`s*TuWG`{o z9Wx~6O9{8mmy#uGq|j9hS$g$HS>&H0PG-{-1+zCf>YCm5l#rrVD(Ear|0cI*4L-Rk zg{+mxNHmhv<3-^Z@9dAPM@H9PMx7ijWe65S*92I7yEWhMHikuDq80z)6Q<9NDcIv-j*B{b##93MN4(xh2Yrt+53r8og#^> zfWy)GcSt|it(+s`WsJ=uwr0sP&?#H}Bjd9y#}J7$krP1TLv z0>^t*77t%5?H>k%FZw3ZbCEJdp{l;&> z^~MTsq}V!+`yEe-s{^T1`b7v|H_My8j>&Bo=9F&#%6!yo?=_oXICBKZGfwue-7VEK zPN>6?whK#ZO$Weail%mJKKT9x5r0)0&@B3Jw;A1dCF;_{zS6dJ^ZFp5IZGp-{&6%8 zn4NKk_e*$R%(7%EVD@H<(MRqtIE0*SPnTR)+9C_$NHJ5Rb&9Ws8=^_z5q%k{&waFs z;F4aR8x9ccf-Os~R+@zBj&}pkG9>kjF~8XU)ufu_?li5$p%1U`{?VcD2IiZ8;@)_h z#GTEk`cqW;&qG3{vp3Zj15gVEi+=$BYK%bYB*}*)OC|(11mSvz!e0M=AD;&E<3-P- z>#H_5p#+#eUp*t@#{77fk|zc6+kGbVx{z;z2s=+onZ_-+z#Gz0%bW|M4kYPoA zA)o?H_+G$xImdX}k#XJuJ}U=z@zdbiuDyWVz`@a$p#+6gpT;nr#CX&$&@*2C2`+B9 zJXH@k9SUi+fuRia#}Pbc4o*~eA0VDrIy5zQ5|O-ljMdgVn>V=1Z}L3q){V!EJ*GD+ zXZ>gWj>M0DeTb4c{f$R1_UN!u9dfJZnSln3ItV3=oekeK?I)l0-0jiM#+ym=A@NE4 zFlyVZz@HMU_mq)URisX#zLwmoQGW-297K=t|2Rm9mM$^x)NGdK($E;pP7+9tu}C3? z24eLzQS#*41o8*IqP$J@E9MxTqu7d^d*W_Aa;x0cdCPaw`UsZd(qbNd^Hv40mWBv2GkHV7+UF&VXHqDz~aMNubMfkc(Xe8$JBMst0 zKW`pbTJ4IJn|}~53D958Y3~wzJ@=h9jXH*<%hn-v+48lalstS;^I+}%*%GnAG@@DT zpv^=8V{BuYZy3H)vyAbGb~1P=o9Sn2KYZE&P1hi4Xc8~?sG8tE0na9mhrcVnOJ8VR z2nQk(t3?a+^O*HZcT@HKi}M9i=cAkj*XX;Ga);4VbCpK{wv_wv&YQFaYQy6DBAjV> zmh|*vn$xgflnNyEr3%Txi^=4|z|mCH#CapqjtG7@^c@v@^O2dJWWy1A1Y$M&ZBF+t zRJkse$_|a}{M7j@=UbBMU0Se_41Qv&iwWyyXzIw++xFOTj`nb!hTl91;$+Tv-#z#i zKN|+Wa0&0b5c)E>uW-RP#Gw?2W^$zK--y_X`pm{Dz7X1GYB5QaQ|`#o^5EMcc(WY8 z*Y3cy5B<=xms&KI8Q}Kv_CdZ(%03N#dI$y9I#&1>6=5GpdeXp5|de>lMaz#QGF45aN!8;I0J4Kx~#_9kC}n@ZCI8O8a@gi1?x~%ZYlp6V{iBcvy+=7eni^m==zjcEF zD>`E6bOAT0U-y$z~~z9`FK9C&eX{lG3szJ<|B%6nd5^5TJg z11nifLlxc3XIgEbvSV4s(u=~cQWBc(qwRnebc%@B>(TS2ulT}tB1{BB0S6ujih9f` zx8Mn+yFLx#Zk0l#!?6 zu4q;1EYqZ02Gp-m@XzN5^z7cTJx$v?(G{lLyDhYSFV;}^`^g5hdKUh5If!@pGJlCj zj=YJ>-jw0{NsiH0!r8<6dF}{?hffu{)|~dll~QRoY_ygP92D(tm6w)I8V+gd>p_eo zEL!so6u36%V6|McZ}TOU0yN$6S60Ist~6hbyV+k<;JF={upcnIE--TfalamRo(J*q z-T}!4Yv-CkS;M{ui{q}F;_K4>lFOR&Wcz6lJD1Iu23?~S-yzF-v~H($@2Yi8LeYvJ zmn8KOf;c8;%BGg(JNdWw5d*UI0F}983AONELAf1A_!gy?ybwEr0sVJh|6;Aiwe52u zP65crhzW8mK7W01t-;5LYSO=d_S}L8UWQ^F{n_#nBtcEAyXi)e+4_kgg=1CuB3O`d zFRE;;de2<3AeAwP;G&HTEhInTX4@@RJ7?qIAV9LP?UJRQC2=vS5?C$dMdrTnTIU~+ z>+K9e*+?2wg0di*1iG7K;emqBqfj>C)g%dRzx~zyiX*BC5}7io zpa;KaN*if3vA%kfK=<$g#R37}nkLCkjiI;vJU8X49Oq@r>w|+J<87B%66gB(meNk^ z)7+=&Ix{MI^aZUq;hXvOE{YQ>V9zWbs%Z~x#MkGO$YKH~BJaDAtN{h={wsyaXEn0& z2ko@wd8;~786K{~@B7gvi$g+s;J9koDPK3-kqTb8WtTMHQn6W>SBuAMoU3R%Tm8k* z+tkK2wA+etWGNgsDY=r?DrjsLWYE;H!#^?M#RVhmeYp}+td$HSbW>}p6k}|2>#N1r z&$rut9Omxw2?xr!*kI*{N+Yd*Bj!LE5hd@fe7%jdrnw8VsbZT!pi z3~S=UYH32>%XD{6imF2-(z^>CjrFQ6My;}~>3piHjVj8NO?{5l#D|2kfNS;+CnI|y zqh+p!wj9z1op)y%(;*EN?Q^ zawDeq-;E*SYZRcUO>w|AjHp8_Bzbokr6LKG3Wa}Y$CN+XytC&FJ_ihKy3b8GMV{}a zp7XVjCpV-E8y@yLo08uFK}C(J2j=fkj1Y^iJDU_Ll(&n@+)a;Se?wg$W()tyUl>Q=G?EPS8f02{oMhnm)@u>Xh!Xw_;Bkhg8CF7jzQiZ->O zy2r1#ng18{xezpc*G6bY4U)e~^oNvzAo^;`#qCJ?^zDMTcNL2kI_}(!qU#!kr6>Rq zVzZ;a6{nfEUd0p_xC_WD8a_6ZGInb(&-N(AEhrYF5|A~-Cr`8Ut%UMELlM}) z8};R_37)RLhtvmg(FdOsGT$3Y&Af8-BPf^4d*3}P+_9P|vF@Pdwe{*beOy;Gt%HY~ z|8}`tFZ_@8E(v$(1L`8X$Mb!)TM5;vWXuTS(eFk6AsmWzxa&^WfVz`HFgiaa5>h2+ z9dP;hQ5-1=0LCOJ$A8WM_gD9>MnIsN0#4~tUs1>+A#O*2)|^-MKHW-6xem?mauZQ8 z*vrW+SkBT4xK6TdiI|1}0l6?!e;EF1@mm@FNViS#;qpDE-Fm@tJ@n8DJ^jdC5pY6J z9)2OPOzL}kz*2ZwrE-XF^hZc!txV{jS3UN$Aetr6Ig#bh*p=3Cc+^e>4R>t?{C=oFBXhO8k zp~?#@X)wRRWQW$bU*74d4~4Q!BFd9TOxSaTgREi`$Lt^56K{_f`7gY#{aLIBv1ZDD z3S|xGK59b(zD$Q6@pk7?n&{8-Z&ok5>^ntUh6>!nE!c9d5&s(HEih`S=d!h zi;AxZ^f18JRZfg_P=kn{%nPH}Xh6vQP` zkigH=(~)2beG_Ox0OxusDM{E6y!bjdq0Ym~pmZ0czAedaScnTq@r$+0EK4p_QC8G4 zOiAr@U{?|jF?Vrs(SjFGRME`6yc{*V{W5@Gr=F~nk&ve4TQW!aTue@h>*FrQJoIIA zIkGb0;+Be0)kqMr8R(Ni@KIFKSgVuVppr+O2$=MpzO;NBF)tYKSsz0?l5g4NuJ44Cz(7(--M3bYy}{KoU-H}*lw9N zjt@wz1_(g`QhPijvG;7gIzVBcurilk)!IcgyeZoU<0(-ZYjxhkPpl`-v-&yaW$h!} zBPH?NZ$bGyswDbL?ki5fYQhsu&cU2Rt_O8*){Yyqi5 zonvI1Cd&xzX7^2A{&kbb<2AZP2S8D?Rq2y6&)stv@l9{rLb#C9GLkRQ@sDPtP8x5? z>!Q(O+_OS|yNchPMESZ#d7fTYdMFFY1Fa7CZydCQW#(Fxl1?5g>MEPg{WNYFpN zwBObq@OEx^lwi*hjnp(V)iX|K)mt*RnO5fJx3$$^-rafw5V)s6%U2`w5(S(&70q|@ zXsaOBOz$^Q6?mdl;H8G&wmY*%WIW}V);6jmP&YMNFxa2s0kA+ zA>mfv6gy$JB|GK)ddZFb zojtgLRM`D{Wv$78 zaJKsHnjR}t@#c=>XB|x>(wqKdKCEJ+2~-`e07=-d_(5fxJ_@rh3|mbBY+)Y0Jx%y*<%h0!5nq?az~}zwJ080)>II)pW&`e$`FSV{tr^tMAowXeHKL1 zwA&$lwwO4AfF5>zH@tn5VGpSACmeqp~0 zqV0T#datH+9se>ROrD?qd&PwfA-bn!NxYrXyF-r|HCP=d67ZTdl!aWvK- zTOT2iOAVp3#c<%6&T->D7q5;UO+LWs)z5hgnfTwJKSf5j62Lr+px>|VzFkT5G08Kg z8h&bMXu!wh-{FzhxjTA^O98bo(G+`x`1+6Hh~W#g*B%x`pevT0*OhU46Ml2lI8V3v z$!_M8i$A!w_b`CmSv}XpgovM^ssE(pF?MC0A`7Y0yonJ#<+?mW1uZ{nCO`+#fWlnX z`2@M)+T>EP8mWQfsfO_Mq3i)nX+$PPeD3gU-xn|qXhIjKOOh)g`$W8UlEu9) z3+;F{E$fpXg;S29mA3oK{470Mb8o`SP>H8_yS4=aP zGQR#eEd0SjTZ|mCTzZ$Pv~xzRfEfPraFOqchLo3)z?hx!*H@4#@8z;+A~h`GwpruA1!g| zuxp`Dg0K5C{+*B2ukW>NeLwEG5c7Qd)u2x6Jp6~%dm;MfGYaAhmQc$lO<4wu>4Nqv z1%bLwtCJQz>ZPx)HjJw{AAdn9`2@a|%2;!$p&w_Gqj!FQQI-_7s@>1KUu5X3*t)_gi@mN&Tn|mYhKZx-?umas-r#w>Y5_|tlW^4DhqCa!T4`nS)i1ktQ;(Pvm zMc&DaZ^XC-i4-JLA;U`EE>ARXi?1H)LHXjGONmIBjltDVL66>bhXM|CF8GH);zGL{ zdi8Rjg9>xyhFm8fu(H&{u`GYz?6)QPWSIybU>{`+tQ0GOu?~AgT*MmW*jsEwmlwZtj<{u~xJ6E)*_s#{&gyDgf{jB{gBJkIVuND zP=%;AUHlZlr%~YvNB6`L!I2o(tGR|f0c%{_i5LF>X#<%00f~r`3+{UVYS=&32{!7d zmS*%wrz6^TT-SF5qSgfe*1jJhP`CcpD^!W$$|c4sf|&Dw@VZ=#sT_>5qCMN|Fo!)R zn9d)VlGzGl*R{Zu5E%bfP$V*p#%m#@QBrql>UrOeieT}eCq zkLyHmhY#1~|C`s<7wog4*X#kd82_II{hKBDKZiAu!1Z{I8Zo>ALJ|2tS%`59XgQ|5 zj|vJ*plA~Y>5u>F1M;drsl2yk0o;nX@wZ>Wn&vsKyDmh|`Md5M^0`nu&*T#=b5?m6 zp%VAs0jiN0IwXw-l+xUh^OZu58P+bRCPHG7&m1E*!>QSPr7pSh9oO~`O!rM9AAnVq zYa%%@8kW#7jX?a`ci{dHLxL#91tbUx0{Qx1CO5|FsBooomnwyDD>Xb}M=lzEv@Efn ziH%i~3<+PPFvbOlD~bDu|JTh;xB#|MR;1CuGA38Cns42^qr+o!6KQ8*s+I(aH2ip) z1(^{4`Fr7}MMaPJ2MZ0zf;ooPX)9dkFPio=Ker;mGCKqYzlg@&pyi2S^h**DB(-uu zi`{NJ&}i5(8_lA}r2Z`j6-t$uaxqK{Z;o^{YH*l7B}{Dfi^Vc7?;HS!}(bdkzxpmFMZYa3bB@}m$pmR zMTV6yg%)_j)$zFcH4P*Je2c#UM|CptfY}QYju(u0ELlom3^4Uqt0#Hn=A0)0@Hla~ zQ#;Ykbm1%K+`7hnYuTY^()u7cPJ8_EPOn9>}mi>c4kX^^}v@hEH+TsEQnKCFgKsZMU8vXER=2zTK&u;4`I|% z*TPMwFKxY4O%GsS?Zf~97C)>AMj@Rq@7|MkZDxG7$~^rcOwhtOPU*q+?ZjA3RH{CCOqbXm}^?}yL>Q#t_rsWOI7?gMH=hLYOUV>)54fR9)y^j=agY8 z9TD(qZuxxl%?jcl393;BS}PIK!1 z6jPb_B9Hi^CE(bc$sx*T0NCiA{)abv;6Ath$i7eMdsiZZboC0+r`$R;pagQKN13D5 zZyzHb@DSm&Dq3NZS^PxzIPTfiWX0InRq`tG!9elFBA;&(-CMx1`ShGa?j^3sRsD#M z@&vkES)&w%0vUeY^`C-aC+Sbw|!_aL3sc1?rkvqyNz8yQGTR;0Gm3-F!otMh$x6 zoq`E5C^cWp7=hygEas@efu+g_*F3!;bR6tQ5R-5+UzwqD_d|i!`g#dFD$xxQqnTCC z3E_vV3ttvm3pCr_0MzJNdlQmZ07I4hCGnl#zcsjz>b{lhm~B4su$V7i|5-bWcCFU7 zGdapUR~28}CZB*7iQB(HN7IyKh5bqRWm(cqy9` zz-f}zqv4Pn2d2C$o{ti~ul(YiUO+7TslT9!$a>R9%68HksehE;gxLC06z5%+J{R5K zeyEEeZK(J}^@EBc0LD>VJHR)<@+qYj^|Vs5_fB$&jZ9Zi*{5>68s?k*PT09mjv&c+ zdINrUPBaYqioHVoy%nTyQ=Po}Iz6z{%WuxQEc_d7D>+w3W~{6RFYB)u%kz5 zdea#QBIF*fMABf6ZWUq-KsAQRUxe?d650FS`q2DodLd_U{B4=tDvh-l;mz*^_%zR@ zAo?-OK`9JOtsvJYAyLe3J5L(8xd}uRcHeQzS)AMioN^4~)3^ z&6Sl3GL#^3OMA^LQXlIHD-N1yeq7h921E`DACgeuEI;?G%`wTwAZR+?TP&+|YOI zj}lk2(YyigY~qZ;cNZ()@bQ(xR~=7m7#_f=X1e0m9n`J&v~JmzB^0s(D+~4tkOMgH zRtYdoEh3K*g1llo^H3PGLKKO0g8P&nIfDpG#no=2Vd(Csk#`og+jNu+gYF_z#C`&^ z>aA$s9|_K6U4@X`gUM*Z_F?h*{lN6a=849+K?L=fQpa#a-9UEr56zo5D>mfw-r%72 z2c4khNQCJ$CQki>N3(KswWW3H_1pVT58v;H-(&^t^(k%N1k!>${1)hxm6b(3w$U{| zcs2BBc};3vR|ik_R@5^jfb|r&aFHFB?2QRhOu0;cnApx_c36*@8kDH`sJNf=C1d@N zR(Um-Lsn<~dFNxyiKxAm7qNlo&GLQl%ZHf8wF9`vLak6s z{G`*2sJE^{U#?0`&8u^8W^mhW_^CURlF8(2PLO5aMkJir2f06MFru#cvM6=1PZ*igS#bgD5~YRt`f6G93^_v+>T;x9 zd(GOS6v!b!-VDjB&b2k09oq-H3NT>QE#WPbRgbCNg^eR*Hy*v5dGGV|7WbKo((JJ? zb?W3DstQpj8hmA|5CM zL03>w%*FYeCAW9dzp4;}bvXlvBbKeJPzGU`#O>oSMo)y~47K-Me)m7#(b(9S50f_@ zdfr1TLZgm@!xlnD!rcJZV65ETa8>oT@VV)w5cN8wFdpYumJUhK$KXw0A6y3tN z3tU@ZdfNm>^WsM{XD4(HcifMrJ;I`xjk&B^Rm*R~&}GZA5#{|Qp13$qVqEngoDVG0 zE?TGhah0d<(pvj9awUI4&cL}{JGgIQgRg#j5ddN%Dv>-V`DV>cKDkq^CS)biNP}iL zL89@gEU|6VO`UKrrONXI=1L+=KNDL}5ixgH*IlGA_g={EhAPPtqjMh_y^0AYD$iS8 ztP7hNT=HEaT=Z(E$H9S6{LV+czxlWA3h%lJ4BNK#0s_SZsyLWNEzB{2f1N>+V(@tN zBg%UrLdbn%qUB4>YCswojVb(A6N=EW%UGltC&%w*T28*i^yS6R@&2{x`yeS6^12$1mF1-CtrFttYtbVqvwT*#9UJ#(1{2b#++USHB8u@N5G68T+zQ{D>MQ(DgP{yIr00=2LwK zRiYR|luSe5b9SqWV!VAzRvjl|a7T24e?wcb8mU1)soOCT=p(%os-7 z`1xu@3@3dk?Y2rurI>N`?}cFY_H;2K;2@{6_CmqYb2($G{!F!U^U_h`Ap8!fa%QJ8 z^Xzg7SotH$z4x@6L#9lGlIj9XbEEZfV)sZ$qO)k>YzpNIIoz(K`hLp7NV24$!XLUy zaPy75_td+^G#%c|csN>w|Lnp+gd;Z)D1Nw~$askcTn+TqpD|u^lwOUnXIvCt9n@U4 zWn3g&1e;J`PKd26aXdtYOnSrTv~5E+?%L!rAc8y6D^N}9RFkhI0bUde7?;&8#4Q+T z$3YEaV*-qYiMnrmo~=FEK)Zme7iO;JtcrYx)J=9~>kdL0FOvb=KEE{vv|99-pl5IF ziNfVw)`2o7?&@X5W6E*&gF!Bpvs79RBKMCHLh%!~KryJnAwv@2g!Ro%XXb7mzR=9M z&}^@59Y2a*_IG7s0NKG=d5ixN&!X7+PMXWn3~j^ZrmDy6)t_%oZMu4TO(sKMXJ)!G zJQEq(1{gr2H`Olg*j|q6lUj>*vG8(iEXT9fnfT^2hlhfQF_Vb}Z27iNn}C52kiqG{ zY8GsY>kIog9v?Z!>{n`_|4UZeoiO>p=oE~&zkYt8H6x=JVUY+;OY<4{?kEjMOSjD{ zvOnU(xpN(7fFXq~dsyxKSefyW3}_;4+^Row*eQ9NmwG?J(x^PP?*spHS3?r|F!r=} z?Km$8uwf$Qbx|qs|0M^N_qa|jF*G1>176V$cD$yt<_Sjk^r>~V~kT9iS@JKeQ8ibEsr$}=)5&T?>0BA9( z&)TGzWs2!oZ&gk4TfaOx6B0*y%{gI#%{A;61?XfN^`5=Jd5&eXdmGmhSGlj>Ya^Qr zzDzKR380=$mRrqYBPbqv|MQMqOclAl=⩔eM)pv$+NMJf;y_cbjwcqgA%BzYoXvh z=dUXCPlrV($2sYu6Mv9CIl*Mi9UjY=7eH2s9nLMti&r>d-SJHk=A&kNxpV9rWOL*A zqleRByc^<(?O)2u!BGsN{`1LJ8GE<5yH4Md62W8m#BmFxm#K;K`zi%_uxA%8l{WCzx+rTZ7{M(mSlMGl# z^(WfLce?WS;o8HHif8oYAL~=L*=0TmOCP%w)W%Rosa)1T))@R6Ieyg3Bp7}!eX5w4 z6q|RebVSVSbo$SjZTs)4hlxm{H9Ktb2@Kv>e@0lyq%p5A(|_{*;RIT2hw!r|*1t@l z2Y<5EA4=}*CO@;11ydQTZdAFh#vUL2E-^C=ko$bmPM$>2@s@hE!1MRo0k8q3z=FUP z_*l}$XRWPzGl9EO$w_|i*zqnID?*HtojP;H8I-5`!U|BT@yl>Z;B4m7x3rlcfr_H=JH4ZTdNogL@SjyU%9JD|e>_6OyIJ8YVuy7Z^7UXlwQ z6;=`f>^_q#8!C6aBGj1NWL_B0Ota_$e#&MefG-qU9a_AEE(ILdO79zyb%B@STu%Iu zj|md7d8ysS5LmR3=|i)ilzG@os510FBA2^O?p<8YVDc+^VekFLJgqJO0ASS@dexh% z&*R;0Tq8VpKWejYSqU%OzLN>ixD)MjLW;Iu@Os_Vw2U`4 z;2&Jgj1VPE0!2BqI3o;yc1wj9e{lCj#JIS_-i_hgn8V8THL&sihly!h$-(B(!^Mbt zN|ow6-<#WFs)JFOB0u&3SHT89D))fYptGyP1$CpdK19i9BL6{5hKsF%muWyYua?^~ zer#nFN;r+cto+XgUB-<3w>%IxRX!Tv8+|m!2lGPV0Dh6B{B?Xbs02MwxSE{ZK7Ns1L>91iC3<)t{*>|tttstKTGd}R zme&#A<3cJB<3-5!=IJl;LClTNRGRi|$sspU5>}mbJh?8W{e`bH%!FQ6F zc{rf2JBA5}0(N-sUccXAX@DsRuZ*4$B%V(tFn!6S6}m^B4!~{q<(n3ug-ML0FQrOk zTksYvU}_3|g)$IqUHh}OF%3xQoS*jreJQGXF89Bl)Fb%;^#F76#Om+sBiD}yN(NtF zTw0N5L%2_IUHLWIi?({ka!&_rR=bTki1A$xQDdZB4|UUr`0dPITS@(~Bj$Am3ghxZ zc0tE!!HPJ1D7L7cP>zvtawh2dft&WKL~v$uIJnZ`;-W2%)J<*uxYboJ{>8LvM5R7W!X`>d(`-#a88%K~VJOe==Xxx?5DIU?wY`cHl5je^a`I~1uB$()4)EMz2AQ$p z@-*_i=S_i>;VS!8hz|%&oNM{dzN*gn?61PNI?c5>Pyw=I6^KQj_L7paTB?{n%s-q=KVb9pji{fmQuXGWIynx>C~C)* zN+SA}>-~0^rU7lu-M1~8?{}L_#VbA{e%SjmCu%y8a7yI0`^1r-c5G@uzhcGi@n!qu?{TB`CY6JoHS`_r! zgFv?=*q#?IjaRh{1}|n4TAhH>?zc9H{L=-~g$sz~u~_OgSlE^0>YaarMFa@$Y7sV! z{guRaQt>jSmvL!N5xJ(3i^{}XSr%lexd|qB9eC8oFS7}-i0zz<6?CF@(PCE*!zf|HwIJVPQE7WB(xAV;ElMCV#ri%vpS|Y-=faTd5a}R zCk~~#+#)tFKj77=icu*J4(j8eF_d-IN$XItPqqVWrDgKCl1L^#QB1>PuZ82Md%@Eq z%{u6tt^Jz(u>zWZR*OIx7-}&HCS@pvZnyPt_6g_pMbk7`aBvNt(B%$V$> zrP57zU(_9N`sgrw8;y|UV@kHzl0h{P0m=T)9{f+{#Xi??CNZ-pKcSOdZ0FBbhwyj$ zQtu!|wyZ7ca?ka?04mjG6<+sSt=>$5!Te?Q6-pyBOW8(=D^_ikKVuFP9k4Zoh+asC zUV^`)yI=!b_E@k(8gzQMf=Y`Ou?AbO%QS_K6uu?!wpA5;pOT|DT(XL3mcS(uuwY#D%iRo%($3501;!Tgozk{5_e(7{Bkwzbw4%7We=?HxcnJfl^za3Z7nN-e>2IQa6zSa%3 zFjv96)r}4$CXMhqY)xFRkb4o*2_2QGT__R87Xh%s#>liKmh~Q4zkfxq*7JNE*K}u^ z`bOJa;&VfP#{z1g+J>8Y2q+nO9(ji8l4-5t!oWJr7NH1FIA`;2*yu@IhWXksGlVtKOIp`{S{aJqaw z(9wVI3#P`CITt)d$S$7`zsVl=3hxlycgowiAHHY8x69Xkqfdl5g*FXEQP?m84+iZW zhVxIbDyd}{hm=kzF%AJ4)Z@sQ8hP-}g<`X@;PK03(6J3reX9BfY;-wsK$lpaX};b~4s~9$!@66#VnYrVeIa zby{9WO$2pYFRZj2#PqF?=z)DU6ZA~P{m++}6(WIku8SxrY?^mJ!*>lW?sMor7Y2R- zQN62rMQ!S9v%g}sH2dbl#_H%7O!BeQtb0sg47bRwxBC!ZmfLT&SzkZJE796=U@an=V92X!fKkQ9* zdiv!GyGpyN3Ct>4Z~@8X2FAvI2P0#>839X}!ilo7!r``L+420PxDQRn3+6Zec_0lilIl zO_tm#q_6*~SEKguS-7UW1znLgZ7dm=8v_AYhB)7D-SeA75)DW8`=X10%KJ= zflA>?2_R4O>ZO*r&n$k!x>x;qQ9~;)`-OvaMc?T!8&HTM!(dCZ+o!pZ1lENqsgP{-6+sBel-4sIjl|I(>30;X+eCYNe=mGy z?oDjV?$z%s`jpaDCVHp;c#W4Av41Z&kzlH-T(4$xbjz?dHC$h#e z)MzV;{X7+=S=p9KA1O1;(vD6WG? za_C&1pa3PAGm@lH$rv+Z<)&RBS3XmXK}M1C%cm(M!m2eU3`970aIa5Yu7MIlYZub* z_0-JMI>wOu#jreXMD;iA8#w0JG*=(Gl!VU&F8se|G)zwT{!tBvT$6!#xzjN49Y3E6EhXip z7TXW4t(Qw96{7_8N+)cd2M)Gwq}JwSPulB|8EAXmCczQ;r)eS{Q`nMIT%p-Ks|zmT zw&Upb0cG2K)RvPJR0M0sD5->^9yqt4KLsTbGdReZ^kw$mJUmDzVb*&70oMNND4+N8 zA?85sH?8JEFfIK*tbJuv96_5knji@Y!GZ(=1h?QW!QEvT+}+*XEfCz@-QC^YHCXTj zcfKacE4ydU?w;>#{~GA-n(3~msvf!b);AO43pscM+n|02b93`)1d8r&nOVd7v_OR6*{b|1rzhGq9TmgO!gkpq5pJuHw-C93;Ruu&uJWA7 zBE|e#1F~I(+>@ADqz%dK@`jPEU{nncL-is8ZZ!IDFhU{)YB3S}%Vk z(RQU^dRcKLrYEvh4mq%)b6RX*Fsv0ZZO{0?1S?&#F+;U+g9w6W^b`94{Il!+-)$B&Z>`wNc!8L>1%ilBzNtGR}Ie(W15(dxi7!WH#3!eHzf%t&1 z+tbITt-;Ee>N7ve$MV_A0xVm_7Qm?9qEjEc4YB|~tE}L+hj;F40*<5*Tr2)^2 z$0h!imtDpyILiF6KPgNU7x%gE4QFL)H?2z^8%h?d=RZn^;%ESFg`a?YW96}^ntSXY zC(Otq0B_^29;Ymu#;VwP{C$)3kwDzYcq5L1@KOxuRXQppBJ}j3xJ=NhLI$sx;oZUB zThMbpc%c4w5>qHV<$jir{pqM|)%C(ogWYbw`U)K%s%X`f(4ubAb7fxg=N3EMHN z`r7)9(8FNsX0Uca_w9OyUyiskFNbn4`N zvzpGY`e%h_o0FD}qvLTQW0EhYTHK`~jHB3!tQQuV$a$HNK|Akv0o;1cM0vZj^Ux&~ zd)#sTNrTPq*cf-~)rYoUJ!`F(CYe6RD@`C#O){MXj$m>=zw6FMh!ESIqxkFHhK79L)C9b6WHshij~Tc;*L+*Me*Mm6rK;o9KND%&UVIv~9W0LlDvSQd zqwV!iym38Dt$VtqV!!Ki-{o_7n6y~EUC(l%(P(uw+{>YZ8e)qEPYz?v8C`Ak(yZP) zr=`1#(@=e{WL=Y@9zFGxxu&0^hV3-Qi25k>;h}`p@mKDj~gE)A*sar;kQEOHtA7P{Wxl4-Iv zQvcDfoRNN(YuEUwIfoah0yGjm1vAqIC&P^g1}>}ix14Z2Vf>mY6kYuAzX7ROOstPU zcJzqdq0RPun5Oj(@uYq~gjelh7H|2cW$x+AA-D74JRHod_~o~Wl%!uevLk&|l~F~y zwj&_PS=m|%m{2KAr_Dm<&RFEGlGg-MPW9*uWN#$3?gZy@cJ$R9xZ(~7{bUykib<~E%t$MiAr|gu-Ac}YN zOj|H0MCIWrEPjlp*7w-xpfQd*yPLxzk6$?>N~(4TG*7c;Ypd1lPVlopS~s9oAb&*m zO>4PY!Y!v$lqfsr-D1g$qt!2uw2Pub#XmY14wR{x>{o~z3Ndyq$Li~SciQwfL;}QY{N(XNkSE{$TFRlH5*rD^g8k;kL9AmBAZH&mTuG6;OGk9@l=#Ae7#Y z5CMWUAdd#Ehd0e2#3*kVu~-8Hh&@aclOat7tV+2g=V~cC5~zdp;M~$`3ldSy4o4%9 zrrFBny%+S$H+bwe4{~)pam%|C$&lQbL1DCC;Mj8n$iaD~)f{YHn z8u}f~B<|Iv6J;^^w4>Oz>J<+wRnJNTz7J9;OUqR=@*kj2$8NIbFNG!$-(l3}>8oZ^ z9uQ4>v@iuvh5T43ZF@ujzu0t_y2zQwBcofqHh>Q#>GGVFZz-PMHqGPPvwwpOO5KUg zNvUDwg;o4@qp*^IK!nba(=-#zyKfTiPueIz+H?e`$!3OO$zIK~J`$ z^gIh!G!Lkq_snT{sGSdG%jq**WXjwPEMS3;aUmFj0Vw*kBdj7NM%5nS!P+nq!^5HJ z7~|3IJ?2LdS^6A`Pq*?8&nSDi3GJ1LcJIab!5TP~QqA8tf8lCiYDM&ZRPx1yzWF9q zi8;nCGFQ>MTbi$K>O3z@jXk=}hUb3IfOG&C4rDg; z=m2`ofBf?|Tpc+3f(X~E@}VH^QuxclHsD1qb^<)zXOKEBaBc%?C^1TC8d8%t9>Plj zzy(b62*JcQyt8?%%vTHU{;B_d?qz^I|zp7d>>yF6FnO8QmM z`|OcPfhpZz9U%%?%Q9?)<;fIx;OJnpBFiH`s2=)rD&9H&iXG@@xCI+8kP6H!(^if) zN^_+npOnAJZII(d2Ni?|GgXxod{cy9c?-JHS>G9KE!`vCl(8FHM7&hMGNsWd-`R`S zo()(|Sv5A{dQO+H@dAKXYS(Bgr&-a&xJd_NRwvnB6p$QQ1@NMPj22kP0jU1ZS@19| zp%Rx*F1i1*>X9{N6ZkDD^E(T)AJ%mK?Oe(4W`*ZKlB%q;fjV+vniDSKIT4*Ns017P zs40KRnwA)qYEX9^jUk8(>=onIveIfV# zX4y_oHS*9|m2>!B>6dpmSzBKlS%pm+F^CQ>^rt=~6mhD|h+p9Zh}i+^DkgnJM6sg9 z5xQW|V02DcWb9kLKkkN=XkFLrsN9y6)63$Pxnbp@&$sbcxrT8>&Q{a|l1D$kQfrk3 z)>&Y%6~NNp%&xiQ!2Bxhm;2gDx%v5xr_Kb*?L20x*;?lC&S9BMMUM?w#h}B2(w&=U&aE-GJ8er1k+;y zB4u|^iYCtEhBwU6k#~toYv?!{+GQ@c;~1)cdUzk*jY94X(;pO}mRo z#cIOdIC`PA7#kv{jd^}KrpkJJ*=Tva19R%Q0Rg}AyrI1$Om*uI_m#Xp%&!d|2VdXX zXM7W|qlBwDutgf~o3qHd8Ll|t z@T!iTdF+tKS4EeIP?X_CPnKAjMG^#7TKnmi@(3g>8Pd!kxe{!MHM~g~K|sJ;5D^Ys zNI6kgz1YQwJDQ`T6+0XG_v57=N#_F)&J$4eJa`L(9*Xc>7X$%?ylMKN#&4$wH)EtvO!w#o3o}dAF02H^a!n$g~SNsZAslewZQWyQo8t#b6jvi z8u^rHCuOM};sVAIjoEfsCWJF(PWN6Ms$2tWig<{!zNIV=eU;_r)E31UHo+6y^-ywH z6j)`!{%$B`O{wp@^c%wRVPNji+(DL0K*PmNr1zxX$g?Ntvj9|JL6XaUej_PI3_uMz)Bk@h5-{Dr!axwm`7W=!h@O#b^`mNWH z0L1Zn6x7z1I7HiO#2OC%DZprY4!yz=ihZ>h!ZzoH)kdghoVUw6`ubzt(viFLbQmzl2dXO1?KPi)zwvT zk5Z!S$DB_~y@B91urukGJU~Y*)(XBDzywF&u-}vf*gr05wA}0;wA$}a?`8I+7O8#g zr7kD-6e&?s6OU;(egUHx7DSO9@b1}&0ga}U$DFP{_0^`6ale_6wqG4(%@1=HPS*oH zJ^@HEsGwh|H>r)dDy{q~jY1-^kLRd-_w3 zrxQLYzdD@0?8#hu@~`!}ym*S*Q;&D*J*0$0!H>_4wRZWiPnbu>?FC7EAToF~X^fSTeB$thOCMoMc zQnrcQ+=$=e{^-c$fa=jaT{JfH6@A=t9P}oKHOx46s&o|&B6lrB|Bc@L7e;9>`S~Amz&dVJ~0}Fgbuphr;8wnD;i8^S5o)OC!RIShsaA*#p3H$-ZaVplt{NO{_>X(tARrhc`!GA726 zzxXH9{$}h4{re{Z6~1c}CgMXX(W}lbOVgjJy;hBjM94s7DcFptsGPMLy6;`auZHo=8Jtq1x0d`-x z0Q1@&{6LBGiUW|wKBY3*D{QZX=`N#tsAE;7BmQV;;)kck1yZ9!D34bEs!|;jE;|9Y zcAyOISJ(1rQZkVcdb|X|lGHkgu_EORp0XeBZN(blJKUGt#JeMrl~b-r9lUUo96jq# zjldDv(|7vnOU^QtLz5j^cmbIYsjR8iO#0YT-PlMTJzF4WAeqeKbT}W>6%cW>Pz9vu z1OY!qrH<2My}hHWZ&dXu=LXxtW2cu~otI zj7(Lp;Y7{RC6barJCZ+zM+K>K$9yz=*CVS(_HwRn_O;5VNt*1AG0QF#22PcWEL;zZ z@82yGVlH-OPmDAcj~iGLyXKD3ROEuHatz2HF+NdSN{!U>E7z_nr0XO<41VzF8_?dP zO0^l>ti3yTcoe5=iY=k9m&DzzC_V65WuE>_jx}LLj;5ZNj;rfscXPT{cBk~T-*VzK z7EszmU6Ewo{A+3LcDBQZ1`x80{P*Zi{^CvicZ@Kwe}Jr`JHHe`m%m9jus~VT>Fpv< zdlHwIHr(!)4Uasi4H8ChRN5UV!puf@f_;zDzkf}BGEOPg%GgH8-9Gk;+0xD2NXJ%g;SX4-u>iEk!Y*y(b?z~N*S zC~N@mGGHm0`PWrGIoAK+2>)}D{Ew8}|JLjOFM@-CpHK%gh;h$l{C`S={x=-Q|9$;G zR9Mrj#Z0ZYWXb>dKnNG~OlQ4|hdacU;=#j*&(}`$d^n6zacS_f2o^U zZ$V;L8YT(#!3s*^76*P_`dF4rNc3N#2G*DOHA~tQMIxTT23Zw<&;x>WJ~1JAAThPC zyVdr~g=E=>MUFb3C5S8xFiSl&jV#Z8Ertp8dfYzW^Ue4VKp_+W<8EThMG|$(aeat+ zE0*ImFKQ1*MYIA6Rgfnir6#R|JDPfiM!Z){`vZ5NTWli`*H1NH(voB+Vk4VU_${(p z%=w40I$)UEvH!X{nmqMI-Tn8zReJawvJx-r$`u0s-zc0B&>v;iESG*Ymyc?zm;+ho ztR-6$c50f+c-BI{uL=8mO|v2D|2gR5e^P`6L}H%-2e$u000VQ|Uqbr-k+J<(tuc_6 z-?m^TEZpc-2;HmD1*mJR)^KpM)A#ec7P%`?1YKE)px4b*&cOIcZ5+qE78CY=N93*R zOjm8uKvOea(F>Zvy|mXZ*)beT*+9VhLQ*VisM(N14$2_dENo&gvF0-9Yy7@Gp!!%S zMnd=;QE>S%4l73|kDNMT9~2Qw_7K!yX=vkbKEUW{w>#0-;Z0*y$4lUL4B>d3Oh zY+QFEpLUbCKeLcO(A|y17<}um##AOCGdfK(YH8JZAs8hSIh**5V>n0ScB?s7CMR&B zi6O*Ts8i?;Z6J}>C)G_Wv19frn3l9?Cv}ipHsZ>rCe4`#e>PK9`8*OEGbmX^{lzKrb=8AJu&#UxS_bNz-*k%N8N3C<6sgXEaWzilzu( zgDt%HjQ2&HNp|66h_7oJ?U*vBLzYymhTveVbt~KCwTGJCYH*k?%N%)zs&a8nY_mgb z+7OIUD&>Q0Ss>Mpi7_rXzXm4?dfQ*R(i&z^mObYXv*ne8%`PTciXgUsN)Or0Kw(O( zZb|V_(R6_6i*aJ~kuP0XctTu|AG)x0i^c@$Oip6h^NJA3B-ZzrWjldl1QVZunDVF$ znGuh8=$1eRMWdjTwWWPSCD%NX)y!h5Q;rRJ4;MY2HRCKb*{osozn({#rh|2VfK!;B zW#k1`uk+ER_zcGtYn$CWgtK#uJVk>AJnGHcQb&dP5hyprh5Y8J?W#31Cj()O zLTPC&JwCegm$NZ+l)LHFO5d>*9%bcbUt-cPO{4&?{R`Ak)J?G&u1kG}7Jz?h7oh+` z(Yc^cbk1%f1Fy)+39`lH6;|GASlvRGy+9~Rd#Wxr!I7Xg4YCx2#&6KU##ac4Awy}B zjrQOe9Q!u&seD#GGB0<)!FLPulk3!eHkIxhrSLF11g6M4wR3^^KGhc_&R$c4qT7Nsn&8g)`?2_LvzWqk}>I z#cpr$rYE~}&+CHKGC8@6k)-$58L7P&HDZ-(*wj*FCbc{CAyW~j_MZ;?iEKMsCN_b$ zXOq{4m;kHnQg%C@MC0s*x!7WtHqk*_;lO&3faxA~dM>UKNAcqlpMWnRvE(j!Kj|vm zOa`t6YpIZSc>FW4%C2X-L5aB&Og+#yUeBt;dTo$hUzw(HoY6=`DI1L4jTYE(PJ@vKb0k_zNMYCB zYc|A&lo2#}P{}byFGGNhW%Mi!*Ig_38(qWZBnjtCD7hjh7@P3RCLE@pUUZ@Fqmoc2 z<6|T^mLx?+MRAFvU(B3l9Mt%_uzkPMT7DzwCaDZFo9N7&R|D6KrLrS3V;GHa2Y3fw zDC!IdHQ#UiINiawD2_Zud>F&J(@-B#e?#uRlvLZhs+sS{7{wTw{Sc+atbu@g&Ncn< z8~}IzzaoMeDQfz0r)@kPl*^#9-B%ILSm$3Q#AsPpJ))(agegNn$UU=7K9&#ODOw9#G?XS6H=xRsRdmZA5IT)q$o#iKGUdd|RjZMjt(+*;8z_no0`! z+!=Q$$!IXvq@<<{y_Qi!Eww%oIuaJ*>oY?)43YBbH0N>dya2D-;p7J0^0g}FT&z{| zwwkswb^l2oRl)iGP}DX$%+vu->Fbiz_vUmyun?L+E?KhIA*B3gOrO9>36iwVDxWou z307%>XkTr2Wm~!|bqx7jT2L3H8x#4s6cDF-K9i6Wv;m_ht~~N4itV~De*03YVH-A9 zPxcvyEdAj*>F|iIMT|3vztl!rT&w2zX1MU(p|@PFj+{p&KoOON1qoUS|e z_?fhJL(L?JBJmMRn_uD;#AnXuDdZc}f!B=?uFGk{9JQ(=bZ@XB)Wq9NR>6ru0A~qg zJd%N8_3_emyB}iF+SB6|O(zH$Xn>cYj}(jvFhZXrL1Nfh=C-pHV3QM_<$Wjue!jq+ z_W~5q5aMrsI|PZpt*q<0O952TGtcld$A3OSg$%l5S~&+oh}-+Qy3|)uFYoXgf0a_@ zA+*hWn*oa^@LgI24~7++`rEPQK1<1GHT`d20 zKCL~NxfUtc^>~?W9GRqU742l9nnu*}+xbxel}4M01P(#DF}c9N7xqs???426RjpRv zCGNiQ&)(xL+A6WF5$DyhKd03V-#>p@PP?d{kgWk#B(Zj0u}rZXi*h257o#iLEDoiO zSdh7kp+~F1TJBcXxI%7#(_?~TFn|DAq{*QTp#}(X5Sot9vrG&i#fh_E&(V=Z`bs43 zhZGC!nC6UJa2tQakEHXx{P`E16r>(!Iz3B%fQRn6@yz-ThbsH{&J=?>XVFLx}QBXD@5LO_Wv|8lnIwLQcPWpj|F0kC$&cYt7hG z-Svk$v!npHU^o&y<(_{cx!Y-y9wS`w>2qrXKqf4MgI(ckTkNVrwSAUc(`Lc5JjZ)L zLMbT3II|R>YjD}^4-e6#Emj$nNy{&#uKhZ!Qb}_>O%OuI71EUW0QBG_BC6{C7xz!D zU)7zeU8iz8F^eanGfl+;bSsSyQWjo!96su_$~k8aCA95e1Fs|*_71nZOB(9qgDZ?W(}l~LGPl=Wi~`mCnqRt}gA{)u zxMG7eH$}r@8rNTl?kM}lz;02`FhMh@gR{x0wFJg2)?6S>3(@`)0O;Lc|B}m-OksC8 zMuVq~B7V|uzFaiHpjLebP^Fy`|R09bohIGd+s<+>a{EFn}x_N7NV7^3KI%NcC4f&NFoN!aS5FFtUcVR_*u!;WnaBtz2VlnhA zce#8fU*BLc+GGZ2s_hUnK!t$+8^|T10P;e6zKTG|C#GT%Qft0qzc&Lg1|oKho$E?9 zNC5Tk91n2==UKf(LaDa~r8xtaeSW1H7Oa=EW)-{2WIiczhY2cYGARz|aS3CXCE;)C zT|=h2>HT1lhfI{rj9&v`F4jNvg8+qk*h=_#N1X>~Y>S~@_oZcV*L5C*_=Nto!XUeN7ee~BSLno%Br!ZA8E5dL|}3XNs6l(M5HyG3q})NvJXJKM*p{A zeVACL0EYQA$Rzd`;$i>a@0cr^M zQnz#X6(bO&#scb6&vHc)s|3Rg-M!-7uW(zU0MP$f4|W6(SweJ^0E^>2sl2Ahlg%iK+M#Svop z=Bvx;kD0~}pDlAO-G&DA%daj}P!v7lxid21Q8~t|fg*TL?*P8Qu#wkqwI%VH5J5uL z$xb6|W%uXUo2vXzyiTm4IdH~DC9j0>n|4z2cMB8X-_KWpME1lx-@jAEkGQy!9b>)T2u1+Ye>Cd#2mHFOY|0dMD9BENRyS(E+hj~Gh z%H$`7TaT!vTqEO*YFir4wg;|-k&%X7j@{0Y2kX%R8!c|AVg(WyknryV&_N~yDV3^f z>F9imj<&V33JM9~BLo%6! zEG)QF*24t}BG+STU;aSQM1-6rpG15?xt0$1;tp2mg-|zt5Anx#-sj_X4QL!_`91Fl zA(R4KxniU`ho;_k%y_bfyt=Hqg0foD*JwH#O*EB?@qxm4^QY+~Cs-ms0`~ZYhCsRy zie{Y5l()CS@!Vo(^7X!brPs>Ot%9+%JYla!5?BO$$er=q!2)2i_CYdID$0%+rCIs8 zS!M>NoZK857*Mr}wNUokp{liWC3ww=^OGRm+{cj$eBj{p`P`m3AZsbqrH<(fVS={T z1Fb0eMcLg-z)D$iO z;|A~3J@==7+$A6&z|O|z9}u9#wnc;jd=<F{V0(Yc#Lld8}Uvn6Ssl{KC57iLY~s`HeC_FX|D3ncy8XmPUgzuJNfyjS2U zR=3t;wJgu~A8Vyhjq!ut`dV{7qV0`K3lIAA&WQFkkJ1hz9$VnW2PV)DCK5@w6=F9d za8C4D)sJt`oVyt~d>f@7BCzFV!sGcDIEy}sc4x9^R%{UFiJ_s|MoMSuNLM+p5@jMa8O3llb0 zatsC(VysoWo_9G>`y*te(Pp+V^OKL8|@14I=*%0ho+H9bJ|~^s01rKFdN!LF(vyujmWOGB_70jnf3b ze?AH9M<|Dd?{Q+|gv5|0nwpw_tni;UQ~tS~+_m9c{6Cu#1i$;(9*tuI45#+HayXby z(U(o#-njqlG%dBsuxrkO2YpGQ)ggj^8yVPGSdER1ivRVD+@zxw2ucq2_81u%k=6eULmDt1WHLl^x!FI41C6Ajj2}jI*P8*@W*q-ko{0Fv zrozI){QUg(-`^hC>Qhou;_mJ~&jdyJdo2Q1BO>&FeeMZiq7Tf4i~O^oeT@~YPWZwg z5cqfIsSf>z1^N1(4=1wz`=zO3)$kqu{x77Y#<>3Nj^cmaQQZxOC|}pn{d;Wfo*y?8 z!+`q#9%4rS_Sy7*@%fOf-J9y4tr5{8{+=tIr;Evh{sfc$ewv~;Y0Z_JMGq>g3$<2f z>>)pMsp8jQE!?r2?atU$>ZF^^hMJaE-LE)<>mGMM{H(p|IBC7=XgYDLzu;bvsBL-k zc-``b3li9fPwMGxBJafGeBlny;tAq@U>DE55&C{2Ps83x1+lTb)x7Pn{$-RDJ0m}i&2yppEh~7_r9f% z6gTIrpL9egKEMb!;dI;51@qbHy_6j{ zG6&2tc6vRA`1^hQSF)jahq;YKc;d$}SCQ=b<|l+TSF+15jx*|G_G8VpCB(}7vgX9z z{&|vFS{q=wPdR>PspxK{Z!QD2|01fdF6%6*4X$m@g%9zr*!7NOKGmGh(%skl@m_lu z#bgtk#Q29DZ~yg>NicgUd9$53>MQJ@==PmL(h$L4v{-x-YIiC#gW@s^>Y@@N=;oJ| zdOD?M=y*oRrB{fByNE$k)bc}I;!F6veYCuDWTIn4f@_Skz_ z{e#M5!(aNkC5Pq(yT-v1YqBCs;$NotCA<1(*st%Y%yS{cwAgeYsTyF2gRvZs+j8y) z^lrouMjIdZ@L6Zzi6jc@nLeAgt9)py4zZTR(}-R2P{Bm#!na)Km>IPI27JiR-KNWk zh={8(e>s~_cKQNkfe>6#wCJ#z6n!kVfV3Eo%1uD5v*;!#s&0JbhEi(sqi8<7)^&QP{x~v)s4JEZM{MbExQ)gs9k?j+`Q~$pqXuxDQ4k$F>~Mk1-m7&`(8mLdkP~t*go)%=ta#Y$_OP4} zu(f_xs>og*jV^~Z7xOv?rwOq0H*$!(Qo|`+wU+n&!yA0`0dIy6SDCBsA_|UNh?$ne zOX?EAZ6>A{;X&I=z33{TR7}`OW_08Q{zd5lUPXrd3KAbuJJh{C!DVllBokEk<8!=X z$70I`g{@ZqN=^8o$cKHG0fjIQ|AJHxkcCUnWluvOZBRJx;y!wx4w0hS#Vya1fOQ8+ zf?D$lwYFOd%h&~;KuCQ=(9>@?RQUuRO4A5yAs-u5u&*rbUtBG|H65la|2jMRf(X^F zd#gr3m$4+Jc~o`N^+o$+^`*nl5N>>3+plU=1lURo(~y*CX)4GG3h1%w@1nps$zarE zUOQvtX1|o5$f%y$^}XTc#Rx2Kkpe{1$%`dJOCM`I0c;sg8nS9y?-cTbkW2fqcAbWp zn)|@7#!bv`HQzN}_7A^@E>56#dv)9^)i9mMaVn_k@5t){9@2bsvo}8_P_{<5Vu%_O zudF)L$@Att7*b}UDGC9^j2k>f5a3yn_4zTsPn>zOE0DNEZroo%81v33F;O||^%JUg z7x#>slY(s*H(F?Dlq{Q>zL_EqWFJ~Jj~UIEt^T3~z-dhQwcT_dX+<{3wi67_Jx%PL zlrN2vpF~p{M~|6$7o~{tRd(~6JZ+5?XODA)a{FWrV&!EJr=^NOe|K4ZE-P6Z0clP< z3H}@*aUUc35G&mj89^5k*+#CkqLsAIN9MA7drPce9T2Gj4do)#1H3&bTTBI z>C;k>2uzpsV~shmkg)Z>`#bX@d@29--iVl1%i}*O4}L|{W0F?=A|$Ua22zxJJH8); zRpxt2NK0gn3=56e_f6@T4i-gitgpG810}GZQsq7wZ_j18A&ItC@1_(Cwzj24g%IM1Pfm}mA!Zq zAbArWy)oUr_gbOIxb6qI?vcOjP&{6opPYx6wZ0gKv`&N|V~fo!$=y%BpHL2RaGKus zyZhAsJi;1z59ecvnDnCzYbQh{+oUZ}%lq}%?yTd0OMT6?^7z?tu) zJwJJ}(FmGeKDJZ8^?fJ_Qq|eOB*9C9ZUmjJj?do(Y%F!7yen^`mKI0|n9A^5%M+kT zQEcf3h;HPROZRM4f!^nzYcMrfjdO`qn8FLJVaa3%w>y z#ym^AUAXcW^F+K;M6!KU2uNPg83z~uVyA^b*O%9Lr@agJR#y_l9X|8xnvev z9POj0;^JaRqdFULTxKPDt~KCtqsrS zvQ5)ip#=_q5>t16tL*{5#H?<$&uokBi^dm&Z%Qn&k(Yh#6K^d{#=3XN~Z>3)CWeqiE0X|M@t z>PM>U{%b0}E6>2tOsvrN=(gNe@q9d9=&YIug4pthn%T6=TSbZficS(@UzE+hD34@5 zNKblhpuHbrF8xSQM9o%a^ac8slEC^QCw4Y47LD zO0IR@khJ`mL5sqtC~F+i6XV2>#(JGyYK2g>iju9YFm`$^KnyXo%6we!>D6fC$m1Ft zDU_Wn7Z_#sHCZCvH?k=`Dl##!e5QpW9OKEF!>#{v(W<6T)%&!Ozk zIZ@Ij6^M0UBT_&xTzYVgj1ya3q%916lsyjr)b!GoYt?8o0x)caUrx-x@!C><*`& z-*HdBXn|M~O7(iASuYY@<%}6)0=IL)4_m}_8^raSB>n6sPVHk$9U}K1qPuMsIOnVq zwx5Dyn)t)bC7epsR17zpbk;mmC@MEj8h_J}I>4_S^V((cU40 zX5ev8vXDTWr3eWqZz+*&bvno3o6N@_0xcVeY(Bd+BD*y&MvcCY8K0-foN#3=I)QT@ zqOA|ea`e;lQBE(~wRq(Fbjc$`lyG9m?}RG1@Pab4WVZ*^&Bm};PmP(NiqU9cgUAkb-S}VwMff-cu>BrI5HCA4r{dJQ3|}vNG$R6%1e)|`${__xY{Wg{l_f55i-E} zuKLIR$}PU0M8*1N3#nCJ4~0V~c9)P}j+obp?-yHniQg z5$?taEzrT3>qsH1IMw>4+wCwd7;&q|(52Z{D#kaE4 z$0?%1|i!-30TVYKWCe>q$lD$%kvY!%13$^ir|My(SS+v z{m?5G^DI^R23)x2`j=CExZ7Eca`n|RbF?#um_)L3^n#tI=2-%r&qPGKGd_H_Wx;x@z ztSl?%u<7KJ<8TnMB^ug1vQE0@Q{JOR$6)>~2EK&xVPc*fBikHy(jP3sSw&U*oCed4 zl0~-3istM&)4UlJewelwzPw5vAsFqoxgK{_g1`NBlkH?ipRfAIzq&08nNk~%!VXff zx)W1EY=jjO!pRG@3MGZ)o4-z&OWapP+cK*K|z;CLI=SrYzs_yk{vvZ}H_ko7#m~!PdiK-OW6H*s zB3~Vcy@!<^Q+6HP)Ow-} z5(>7nM$J(@M!MWfaSX1dIT@nKda4Bvls21NjWJfzwb5r@3~lNTYNtjEa+3u`QHDoR z21k>IzNLY~7<+@#m19(+v@frEkMx85VH|^@df#|>6aiJ@3Pt=ET6=HBI}XRqWxT#d zu3-C(AY1qM8~te7eS4U=ZOa-8s*gQP6+Ia@Vbpsy#J^bDyqQjxi4XXbwJaNrgcFqw z8wCs-_2g6Kz%?%VYSKg#ctSsm+V5gEA1L4;)G|$v~<0*p{Q7Er80DG_wH}{ z<#RKmhEkgGey9kZI(fJPUU6m|5*KU@t+{Ybd`%J~u*E=a=q#?qWu2JeDIiVs5f!%l zyzg^k;a>W^JAJO9V{oawk?oAFY{rJK>jy$L5!oNXY-6C!cWd{>f7~N5E0BbT;EDc~ zr|e}k+qFyPW7bX)Hs-lh&M6K#OE&8wnd+77U3qn_XKo`l3=4`HbVh`T&Cm%fPwi9F zb5YCV;d;H~5*%B%O=&);vKn2-MU%a4bt%2Cv1CJYLfO!S-PcqnYN`=-{)m;}W+&^S z0Mh_#+illHeYS_7jxNVWQS7D;+D%UHRpx4-Z;qfAR&Ajm8OSn4n&I6ZhoScYi9vx* ziMdYPYfth_n)^~gk4pVJ6$#e%4a0_HSC0Fwqr-gnOiX#Nv&yiXSLm#pGIm`T=C8aZ z&W-w_buJ5@Kt1l(n*(DQ>fJxzyss}T8ZD}tZLFG&>iEE@Zx*vim2*1MBb69JR1j-O zjc!4WIt2f2-=wl7hT~DE|5}jQ->L-PItjmECY@S}bzEJuVbfz>Ll;E_OA(+*D_Eo{ zZhl)LH97un@liFyrCMy0B5JbMJZy#KL8l@%3XIh1zv1UjwBi->2}@J0I{Xb}du8~W zqP-Tw2i3M&j-Orl^a`lXUoArvc1c3t7u_}*D2dCe+EFunG=OZeXe^h^a$ziUPAGNIp2k~dHWDLe!O268 zJl)B?mWH@C(#=IVqSi7=Cl8;|ISD}xX3P_dsXPCR$oj@SPl@lW4}m%e>Ul83W#uO7 zdJ3E#@_YTv2yH1$99H|0?Tl7x`RL>U#OWEZE*JNndRsBoC%aiH9xT6ZKFo|Q%=DPD z44F6yg*c@W;~9$F?Kwz}`rv?f{c4c7WgphVm!FIrpXTT`UM5wa6wAEv-%xw@ZW0I&P_WQoCn^5?v+*U7>f%;1!!J~*%vaWJ5zfmZ^Rkfo` zHpr;hP$t^ataMbkZRpa|3ccwIdW^S`>xFILbfJ*xEHQ&240uiD_?nCm^h<9;pk$Tx zf_S25M{qH$kvqb$joYw3P8U!*JQT|Ob;ZB(KxmxCVCagcU6zL&zoD{>CNBWCZol2x zEn6m`1m&FLaLC7yQs71CW735jl#%{5RY^- zAVn%w?faE|@MTmDL&x%>(tY^*~9zo$9( zC1qf9RYbD#M5KVzcaolkdP!%Uwrps?(qthK-|kn2UZE+|C_0T51>?@iFP9ZHtW8_D z6l_{AweN*T5~3QK8DSEj>?U&RLQtBdIj;FmmKXc~u|7#!#u+G6RmJ|ii5b`rr%qk4hHAeOPD7^piZPMdY$Wtuoy$a=1py9Cwf$|$FwgmVjeCw^5!#MbI zbFOF>*HeUMY6U;pMoEX8?F~CU2ouQs#Fyo{vDEZY3ouF(!Xe7-Z0E+@IlC9&>*c`ic^j(ljW1sy|8J_YXW;|DwJ0vBJ(WUGM8Shp^!%6s&&VMz7=hPQ!&` zwzCcOz6{*E4D+N8>Y@%w8|whFh7rI(rHm(tm`q+X6ue=`hXGkpI^08m?BTa3h|E?K zYIeY;IN^%uqy74zX_t1Ut`7}~?8^axBH$MJm=#1tBv5@#q zDT;bt9756X;tXmQs5E?VxkVL2;1TPW7fSnoO}zzMTul=#iUbK7Ah-p02p-%mxH}B) z?he6%2ZFo1yAAFRfx%tF;O?Ax^WAfv`xknzUDdUu`ressw+QS`4;WNs*B_ie4k)p_ z2~HSA|1P=7(Ax~+MjAudH|g^p1Ns>h*j700r!Wm{xVB>sAJISm)XGlKq+vG-C+`u>z8Qzs!qW-b zPUz*zCT$3;$i>v9iKC)ymVn0LN|9RkKj742_fWBk%IRS|fJUwzT^hnZI)3WJNd%>y zYleiylA&{Edb(xun8qkvmJ|DzUJ=F(kr}Lu{TLE*EF;tx&~UWTOuE?MZF-$N_}qAm z^wQ4v0^UgVE1u(Kj{Gi;GakP8(Z|A>m$HFCBInn&z|gK^^upeVGO#-~vi5y|85LW! zNr@+?nw_I@i*efpCb>>??#(c+-uLGD+2ZkLeR^-#9wSmBoZ>zv*>8I6GOpN;QY>Ft zeRYJ1{4V1*VFMKDEyZwUw=gqV-<3gw%U(F46?LAysqdh-=*o_i%8s1EhPcY6 zl+yMJO|z1wx@s9U5ov4;C~(4U0yJnkAe)HLC(XtQ%%ZUP?b zbF|(ZvGQlAxvkd$t&%C~cYz#SXK@-76f#5&9W_lG zGEJGf$tXR;COyL|yfkGv(5pDVtU0kD)z^;=H5x#y%9aP69O{v& z>1*X^{`#XBFxDUyYu8`lX1PFDbO4z}mIE|^_t82Yu4HNM-fpiQxP=wnA?%Q$H#MY* z4U0?cKc1Hb0bpcF#loWKv;MYk5Z!2=jt|J6#g?>XfYriM4Pg(Ec;F8V-S@!D(L0^u z0O+??S)6?n(hqvfE}cw47@wm!{?yXkTDMANR3$`8|L$w}Hyq)3(+TX~Z*p;J_g4$# zAj{*iNPptMDloI{luL6Z>@c?oEPFA|*QRb>#ABwF60sObt0Him*dWY-X(^JQh+*rW2yp4()h=6=6H%11qx(*~J7JJ=SU@s>q@zIVqqQdO;_FMM*x z>4a6H*$KhJ(m^KT@2vUfM}haWy)KD(LR?yGyjon}nMtVj<371a!n1{a9PNJy$?H1G z+qmdG%k5?Eo}y<}i2qRrAfob+ zTG*9QSQlQ{6`=G4^zN6XKby5*mJeDeM3zO+3V-9_=Dll-PWT;>?o;L!*;uYilMrDt z1cf|Kp@XkX_1x6>0*xOETc5~KTcmkxV^s%C_~AoI;zw2OHy-_pyq%GQJoSN5uD@{m zsd32mnZH9Q({@cPpPivLtsV|FaFDE2II6QK<7W}YaCR|5jhf=#Tp{&BVJ93W!IyZ} zo`l*6Ph;G-0W!H29<`CFoXx4I)uG$$B;xR7%GDV4YZ{1#{707gegC!aV6QNGUpSzv<(nHn(IGDFeQL%0^Yp7gQc!HeXsuh)SRJifg~ zwc1d!f0pjxQhEJ#{bXh4mu^wIhw>1R8)CT-e(ZA+i}gk+^MMzm;R16#wB8AI`Vmq1J%LE=y&i0`twrD{FC` zUAMn{>gqL%c$1_BWkMSy>u2ACR7BcJKzxBu{k|2%i&ifQDBRRC+|51p zN|^Vde4Li1?}!-l2{&t5PP4RmD2CsXKCFU_wzQUz3ozU!B1M6TmS}N(Sj2n^o|SS! z^dHFjlD7}AjAJifAe5eKP2qze-B+C2RVTCELem!D6=VC3#`HeZV~?`9k&r^%0g)V$qT(<>&Lz z+2MRuYz0BiJO_W3iKC?9d1m|+oNAR!4?)jRHGG|By9i@$MF#T~M-SV5^mQ~7>h~JM znMY3jsGpg4chwru$ye6Y`bKm$NMLv?3-#3&JGOmw*5t$>QO$fTS2wM%x9tW9?5xw# zL|&ZFW^k1axY|`&e&*i(fP8t*xg+Z|C~&|Oloq{rGI#61A@?R$6IRNhzgny;V5j+d z&LgR68rkOkPU+Uhy@phZuesjGA5rrgGlH>iYw3ilQJvXYc)FvT<#%hzL@vy_vZ))xND0(ql>kyoUJrjj{pM<$as;e!Ejr&BHwPoVX#fvqSG`}#} zLNTtG=zh5xnu1=TxZWv^E%C`EIgJ>+38be6 z+-_P1@tB3QN!A8dw~9Sl2AUn)PF{ z1#n6X=#rHZ?;3i$#i@^w3cq5`kk;A=uocy*Ro~P_l%;8xrLhVIIkz2GjBGS=UJGZyQMwtSUWaT zV^us9z{kidF2Uhb?=%bG@dJfUWBt=)>+&uwNP6(x;{wbK$sNCo%drP2)O z@+FQZ=~3%#2JjevnnZ{L{w!hs;=;#Z8Y0N`tRIvSM}{@;cxbF2{Y~OivP5os3DY2sUAB z-=g%rrtFPoBqjlhZ*oB7FTUIXfuefR(|Og~X#|u2%25aWNVN=Xks(ClUZN zT|J?R&d-bK)1puH8?gRq4hlj19q1-Eo5tR>9A#$?hRKOU;;PX-X30Za>-C zQ1V9|l+%YFfK*J3BmJh!Z#Y>Km6mGpAN%`S1H-sg&KH-sRm0mUh-G2~5U(*rBgKyY zQ>-nm5v8jZaauRO10@Ub6p4yb0EVX~HUq*@Jv(*=u7CKwkY_}*U@WEXKimOMv?yl<+7Rj3*40sBfH8>vSi~3>+1~VGRxWLK4 zDnsave8Vo85?7$kMh4r*nvd|+Z8pQs%2E42Ka6jTGlGTct`rSHvOsbT@1OHr5}JEk ztj=2_j&OE^3y2$bsd^JHJ?a5To}>zeHKLykE4IzXnjr)){~MKkS*yaM!;rclg*6GK zj4d8g5^0XEsbVj5kjKaRXSG*0y(_-tPqhmAK<;n+-(_8Skj<43QKPIoh|2;YOO|uY zvNP-w#+$`bUy&oNL@+P+d=QF`{#yI@IM3b++>R1=MbQU2d5ucQ|1~>BCV)b&mebjD zI}MR;4{sNrx+_enJ%L98V9-E;LkQe-lr-NfgEn|fvXISnaG5xmbt~#t%Jf{6(jTzN ztfmYxm&i8Xj`S$|~fx&coA2icSoj)8%_u7lMS>8X0VOfYb7U zE4&G@N9CzIXDnce|K;>8@7Xq3a|+GQpWXYJM)2f?0ZoAAb1ie7fHG_6AO%l1Tp{Nn zEMrQ~z->v z5FiNRmB33sPD<`QJ#dOib@ZitxIGKGzjxNHC1N+{p>GJ|ySYZ*X~DL0VBlHPaBnX- z9;iNW)|`B-P9GO=OL;z?A}WtPiFCKE*YL{eh4$e%IZYhpts+t63bzI8aY zDgLB?ju3S~3!|OrC;!ml^I^jSQN;(UHq&Jl0-~vPPsG3^?lcwOA9Y7xku&v|(=!OVp50K_P&^DMTjD<`vbxck^{4!Gd>xYKROj2yXB9vFOy9R`8 z3JBQp)%t3t(f$<7vK_6%%?|xf;k@hqQ2Vvr`s}FWz9H5Gk~SxVf~@HYa5q#s%MLuz zH?ShmoPC)HTv$VK<;+gw$a+(vjNP-L7uH#|gj!?7C=gg|xsM3;gnB~swbz)dVuxgp|2P2w7j}?WN zijEDm&AD-gk7Y-jU*r2-<*v1Kz%NY-KE2XRV^i9SU&lk$V;z;a6p20rBEnn35a@JC zoGFlPKVo|?OR%->tx`^V4F5KapF04w5lvpTtTD9c8)`B?C#&0n3^Dp{5Af6vK4=mg z&_>evZSw(4x2$g}{DMq=-mFp7 zU+!-u%O~M^Ic0J+W68|v^X+agxh$_zXADb+ZH#7X=nWPLKy_5&ITq3?4L?Ox;Qe%C zxAClD2V1g1vrmON~e;q-& zu$Nu3G*svwgtE_nU~%jOo+Xec$2E>Co69wc6KnYB)?DK|PMI43B#e?h&T%eL%)L5k zo5B^4UUe-om|*3~nWl6TDXD6`Jb#XG2^)Ou{!z&3X^!S|RxU&D$M&Zz?$}j=X}O+% zGUY1^G$WvFC$c>)>~%t{=Z@vRkILmDeAC={VF#LlyXCY7NI^d@fPt}FU40P%v3D_1 za%g1w7^Eudnd7R@0I#L3{iEoQveFQ083pqF4?wyuYOa%cJ~nX|RRUCXXZbr7hea*2 z58X`Im$5o?Tm>iZE7H;?`-kCe39&lDQLu1dbkp{I?LtUJOR8d#%MIW1;ru12(`IIXOZH zjS`7Ra8YOe9JZMe-^_wZRCDtN#>yjO#c3<~*<-jcrr21;$9BxrTn1rgxN`$@m~75} z9q%K+DdKOo@&5bnhvB?{GeDT#66|vhc5T<&+oG5M!QDh)QTd9~t;1LkHg*-Qvs-9O zE&IXAE%sqH?g7MG7dZm1zZ{!zkiqVUSTqh~ImW8C>kle-(l@^?zV&zC-TZdL-P>#{ zzNz*c!MUuhiga=S7dmiH^BrsTZL5=!=rCZ;Jn-b$+Z|Il1F70{d_K_#sZoDZakgo^ zh?|Xm?Kd(U(tf$wfDK+GS?cs2_FTtSFa1;=I+pj*(lQM*radeaJCR^7h0rze`mW8E zAkJv}*Pd}(`k3=n`hG&cZlr{+-D-1r5osHh5w33Jjy9~ zm@B4O`_FCtfv@Fa9SD8x@O>Td9*ZCJG&qk zDRjE1HK)H4>iwdtA5{$R1bn0RSft`KDArLw{IT&v-|W5i3&DM>SA3{2%5H(}D{%eM z;Ku+DX^GVWpUBW+XM~W^35Umq+}IeuwmhT5)%GnIJ7-;+6Iv0H65><1qBd%}f%ZB3 zz?EiSQL(~dNkWq(H7pyBblTv;OOjX{`iP@xPz{X_3nUCSmiU;gusB)Gg>{Hw$!Gqn zZG2`rGcxgPj{DU82XupHOrzTjVbC~f9KzHX_$twTx|k6^hj*W!o}Qk)A?Wyi>;swP zw1!J|3Pt-H3sE8`nJ;ff?S`^Mue!Ry-s1cL@cPRBT%KBA@Cz6&l*`!qf8ANYFh2d~ zM}MaZq$)V1FSn*B1&BC6&}K*pn4RPJ*6KYARq>cY{JAIcXX+9b2E-11XbsCq#*+mH zEvqxRcM{VEjqIZ~wcT9i$JZ9Kc=crW32lX%__5l0t^;1%Q0IWu zjj`)g-AhI2jL>PpDRV|C^hT-e$dT?|`Z6ZIkD_21Ai zf4Cg&e|4=+E^ds~H7-u!dW40OzIq-k`w(^1n_vt%fc{9vmL2V>l`13j)k5vJF1LP7 z|A*;B6aOx{{*s+sb1X6k5?`@CSA_0eDKtA>6dMo&b{BJI+no{S_~h4Q2d|d1ml`j? z9fY2j*v2#!y*&zCya1Hh^b5akNi#XQn%eqW+GcV*eTLx8=faA?t1|nWP6R2_G2!Sj ziNXm{q%8#k=WigPOtqVMI6=PrZJ^n0pp1F|iIXs6S35-xkp11=V;0upbswR!2lH?* z@}VBYRz+wM*L)+eCVZ8gzs`bSGWkpjj63v2V7Y)ZxM1k)(fm+-U!J6B^-N`nVD^y6 zypITyw~v5^FhejF+q`VWB-?C88TYh-`_$McWVi`iiP~9zzTyhGao=oVR#>xvbs1I= z5W>uHN@eXY%+V{Ot7rZ6Nue0nfWGD~4e7!JU5?KfOjmPZ8@bU>bgE$i=0=~rd-AI+ zy0fI4-;Yg1QHgiRd;YObeL{{!3k;qIntZZ zY}TXB(Qdq8Tcqd}N{Y9qgz^wd^Flgm%pClExRfh=L?e6z=lQ4k^H1vM3rXnRe4z)d zfWw$!C~%^4l$6RVJ2Z~pKVkv1M+eg+kW(>ISq_-PE7vd`b6ehCUq!iYK}i$){NJX#P;+VEMVlN z?=IN($W&tH|Auo9gYNV85<8TB{oUqmTh~X@d!6pmFTtSZ;-Qlnvr(DcHA-%eIw_>( zwxL<~^9#VxNomDEDel?o@pT)sd3y&;Az>kjj22@~j2F8qkM>Z$dKMg2{~Zj+zp>}$ z7t{Z;P?2skJto|w^mqu_j`^~K`_ixV0igXTQL@ithMTddM(^4huy)>}p>R~wL~3Z! zwl(EE3+CL|W8%doUFGyAoN=M_+H=%8?T_9$nh#)o0J5n%<`ufHR z%x-0_DYri_x6dg*%WW529J7Ca^4|=Du7S@tfHUZZaZs8?=c+tXJfRw)T3j&OJe>e; zq)i_bdbmOCA9zYTsVdmIE6K_#f5>jJwzv5_M_)~Lcl+JiJpYnjco_5xy(Rw8cT1VN|Nbd~1rEd>SHEfSpIVbrqjTf7B#WyTE?E?RGu5Ef_!D49w>F3ItWKvPFnWv| zZtlg(UNU~@enZq_dpcu`#ZVwqYL6A~J6-#F5B|a>ASI9Q!1-f@Gd!XY zB4*|XM*jW_Y_1;?lxR?fZXO=@H?E4%8fur7F>I}sc^(+?!OKnGk5mn2T!PBQdpkg_QsY+#uA0KmcCD7&X(f06LDjCtT@dhz&5WHa*yMw zK_+K(n^aFZ)crQ@KegsNX~FIrv#vK{y#+iZN$hSvMfqdTSiiXtu@#`)j)utKYy*QTZNGx6>_&96&hw?!|HVE;)CHCUH&;cS7K}tPE)PN%=WQ zUDwm{Ah6NuaCz)D>2_$EyVA6H^Iz}gff{GxCokxss~Bl-+jGj=uaNg&m0PFq@AxuR zf6hE^)v-9}ya}pVJ6pO^mEH_>-6~P3wr8vWk@_|nAHYmkw>vnCOZtEV`W~iX6ujcEj>n@Lr22&k2Vz@S>@BKce z+OZkfEtfFqRnKQlGOklMu1nf+N@DxSsk1EajtxXx@MPB$`c@S8B}+{;!>fcMyovoj ztbiHpJd7T={~=Hv^fzVoQ%brH*)!qWwvPaM^X>Y2NWcY2wgYbVIRpQ>re~J`P>=N9 z*)KKqQ^irzNy5Tj+G2BK;NTRC)ECr0f7CT3hAW#ltYHj=&3gAy?$1jK6cN0Co~md0 zRXsd)7H=GMrQJV(uH0ALbxmlRJJ(eQHh1{=#tNL-=nt$DdwYIZR6EU)vs9iIn_*qZ zR^7^{tqY5a&wcq4U+|md%RGOx$3>nT2BwAfo&pixm#t@?z$&QPb{eShB>@msxo5Te zU)0okNKqXwWH`c#)CsuOYH%D#KX0YV`0@ZAHv3kiN(mPkH|T@W{Nm z&r)NxaUCEuc{`n8@g4uWNhM9n`B3M({~M@k;QZb#^BtRO>oi}pb#dyp(YzLLU? zurD#bB!acX3f(6g{HfICOzdc-D363)&@V<+ZuBDi*W8N+cYU|x^DM*YM4bV*zM1@SwGgvKgvlt_c`uBnOScH-ZX_eFK*QnJa0Tc-G7=k-O2Nwr4DiZ?W zaWJfCzs(|Psj1ko55J+%GdrxJZ;9dd(8ZVW`5Q>!=Vqn)W17i0%l2yuyUY)DG3(O; zUj2frnEw075vkovA0Tf_I;e}vu=BwF^Eh|s@Y%?>?oaJ7hwxDePe>32;F9Pk)7ao`crTP-=s6R>Z;c**~<;5t?Bb&piPhY^1}Cs)?qTLxIX&CxeO+T zr@3cDm5&Qef4Ns1Sb~XNlSyk~=mN1-H};eM0PuAa5_MH_9rMHAUHBn;$oX^b1y`2G zfx!2-aMR|PCYa3uYU+xoV&0NPZ(R5G!=^S|H`Q!Wtp%SAdNd!v)U|jYS#BUgPkwdB zSlP*kp7e3hIYIw@Y`C6uqx#syWA9nmM)6MaoTZ+Z?}FZ@c53a7rlyBLw5lxI+rR`! zfP=chINSZNfG`Qq;Fw5MXRbN62^LXv?t}`dfM+q-fm+7A$UYLJL=T*?C{#~hII22Hd^3KJPsk8o& zs>=D2uGTY+4)e9=2b)e%)-;mV&3`V-Zn?l)VKpX7!NUit=0mRuc36|T>(Snd>d4R` zRE7T2)!y1m{*MIKCDY5Z=HL^gkE-k*zkN!B6>o^RVn)qLM0@GRN|!Rjzb4aVrjnah zT7*sO1$-&9z7ke*^9QGP=$YX8R*z4dZvTdwH2f|dA^_Zg6s762IW}Lj_`A0C$j%`%v?iP$p}FAS6jB@e z7geLl^^q9seLnrwcLlswO)ka-4*Er2YBfG*PLGR{i#PPj^o?J1-k}SJr$SUqMU}}u zMts1AU~y?+o0vWbXvd{THrNaogIUMfg`MS#k+kx+>Emsd%B)$+Iy+0dS*C}A&}pLc zoZ#P5{k~1E%K+^`lIG~`8yQW-0jDQifeV%$ROTrAvxMlHa+!{eY&U4z8b7nP-9yyg zwqo_+BoA+M?v)ZX-a@rdY!2}On!S;1`-4rf_U@`I3(dNR*^}0p5V8HXokJG=-a+VNk=#3HC_}0dr!G6^r@slJ;NYq-ek-=3MvKjColuA( zG9F51o{U2j76p1<9UUD#EX`bO^*lUWJkWZ%{`|%!PDDyrD41wz>+73XAK-iR7txHB z?+#IPtejy7Dku;#`#f)T%V1r+MnP3dh%=vu@RiL-%X+zqcAH+ec#9_kXNO`cM)NUaK zfyGCe4;;u+?yH}>rjp(wZTF>$-8wSU?>kz~T`m1LYoFx*zBGAI2zFU{C{KW9_;%q8 zkJF(02C}1j(HgRGT&8|uj<3OYIcDlQ@kt4%$!MI)pJ#5EYg)%L%yuDdZ#chY&kYMu zp_fJA(F$R|EO5;6Haz7yV3=o2&}+0LrZ-lo_3*yKK!Jlav#nHO9Q-qUG=eP@8f?sg zvN}l?8e+mu7GKdwb;MAr$e)s2y>Q*XS08@k#G zV~he!jIK|CzEE0S{6R6=lPiqv?%8=x%dK#_!zh7nCp*MCd$krKl6lZLUuNf?@S!Ul zFye*k`m@w*3ri~g=imM9sy@N5A5?R6Bfy}~`acIRSR#YXBK#7|-WU!W+sQnwDq|~~ zC#=An2ooecZQ2kAm{c}j(ORh#^tjIZQGH55m-T3Oyyf%A{QiH#blvYk8yWe6;PVWJ z9gkH;!Y&aCv)>|TI1M{7T>B1f^PT&vt%8MiewO39Zwn4>*tYdDPjOa98o|F>Turzw zX>39AtA!bDA_DkmA^mxnrPe|vf@&4kXZ?GmL&hLLs00Fah-4w$yi^w5qEVewT`mG+ ztIk$>9kLu(1NU#06oC>97d?SnskYXDc}&I9fz7$tjhIJF1*V@)nGcSc+c(umX4QK@X#vj` zyI-GA2<*?vNg|Q$*vkD`(aK~@;M%=e1F6n3X?NqV1_ZR%sFcS9v^Tg_X)0&FmCrMF ztx=cF308r~s)m@`#;Ehwc=P(`8a7ygAi<_7X5bWc6^N_hG1H6Vgx>;#0h}=kPPW=f zJ8EAV)oxwBSA|A?e%<14Ub;dF94v&YJpqdDx;P>?$KpeQbFR6q;w?1YpICzsahQ9Z zzaRIA$?3?btE!9Xis>rKt13#!%R0pxub592XJ1ycQcVE9OQ>#=lP_LY!Q}IjY4T;* z#7={;J}V{(Rcti;d=v@$j}U?E6iO}8kdjc02XXwtQIq%Qy(jy#*gfryD25N;qXTGq ze$-u~myGqThreDO<2*tN@97JK12x{Y+(o=TG#^lh&M+Bo5Ek`wSr^%JjjcioL2sQk z&|x?1;tusv0Id21D!Eh5oNpj&b`i52_s)T*{eQvWjL-doT~%-p(qrNspAn|k7S=?d zfV?xmA9*f`enE?TGH&H*a29G@fKiZZtZe>NEqPcVWrngfnKrht(7wdX*|1DjU{Eo7 z27`SKcXbtel0?Zo;}0#7j#(yX;MCA4W8HC?siR;hQK=@lM)|x(zXev^TdsO8OAyfztcXGBkHMYAqM8kcov;E59HQsY1FIK>fg0lJbtLJ*p z7N_5Q9@4D z7Q91;I;PDnS zy^yIruOwTM^_?c`zt?PE(y2$3`)_I6CaL(XQIGzKT-{9QU(8%zjh-Ceiw(cD^XS*D zhUeD5ap3*CzEnbD{9AAGubSs(-Bz|(keBF!NYy8-+YHdLW=}JGoZ*@WD1d6UnAZutoM-@nx|Yajg6#CaZQzST_xMIF!I|_!>YhypS!n7pt{y7 zFjqC|_=Q{rlI%$aDbdVN$Uy<-W=7&079oGChU?d0L_wK_KoQ8l$gDglYx%!h)bgIw=O0r2mM2Y!0JhZeH6s%DKsM;G_UvV|Y zgO=Y8^9w$r6EMjzZbaj~EN_XWe|2H*boG!no0$AotBr#d`-hIEP_16U*O1qk(Yg#+ zKm1$LLPz?@A05Tz0$A# z%|R6MYWbx!_Sr~lyZckErTfpS_AP^CokgSH%X{goFg2r`#8S4%L?(xP$AKc&D(V^X z&OkSnV09HSXS3CoFe`UfhRv)rcf}q(RCn1@_sELI7-kRMcJ?@E4UD_ML$55&nx+uF`^jq$lX?P9$d?fNA`xiNshLisEd&qk?(C1Z#K6)3b z>sC|~TyrG238H63Of8~ehhgr@zfZETy!LP_niyk^kCFTHl9 z5-a(E&vSZUAAaxp@grB;_zT+{T=YZ!%vZcaeqVIQ>|K2WGr<$($3PeAt;b+7x#g}T zti0$Cj6YEQ&137%G>oj00%AZU@uKe*&{6JnAZu&zY!as=?Ra04Iv>Mn$9ac4s#l*L z17C4B6oKc@P%Z50ij4|-F$@0C{b-c#0Um(S`7moBg;54PqcMZ&a1=(ZLEAwy+-7lL z=-6qjhi&yBax3Vq1ucaSk)B2r|D)CiLKv&Frs7qJFz_3v$4wFKb?b-9ohBY>jD~WZ zb{6iX`ss}Pt7r`ReiA#0)HNte@lqB5nMNLLdmeknviR#4=%}qPvK|Moo%fT8!>ng- z(=qZao;ZH9GAhN+tG_S#6lpMEU`WJYYEjxhm3SM~TqlFV1J1rc zg|Gdu41wlVw`v*NX_tsi0@Wzz`tg$RqP)qMq<-*TQ(Y`SIV46}Lk?8jPt@Tk|O+^%bA z0$_DppFKI=Gg<%NiHWv>=I?T+=2SN~Rsp9r$DT`TR#KVPe~;gTw350P0&k~(1xh#u zwqVj=A-!rx929El2MUl_V3QXa6wc6CWPKWQ`=;|@PEW)fjg&2xs+e@YhK7$I8!c?S8@-U*=tjruOv?Ct3?4n{tuJ;)D{2$ literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-pane-protected.png b/corpus/protected-sections/native/observed/onenote-pane-protected.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d13af7b2640f33dc1b1a3601a13470afb88646 GIT binary patch literal 57542 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 P00000NkvXXu0mjfpbZty literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-relocks-after-remote-password-change.png b/corpus/protected-sections/native/observed/onenote-relocks-after-remote-password-change.png new file mode 100644 index 0000000000000000000000000000000000000000..6229bf91f19891ea23ddff860cde98c04a6dec72 GIT binary patch literal 59276 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�Ws=a}NL<|$@HmNI>>6Vo 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 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-remove-password.png b/corpus/protected-sections/native/observed/onenote-remove-password.png new file mode 100644 index 0000000000000000000000000000000000000000..72568e349434b52548b7b8ec710544195255d5f7 GIT binary patch literal 60664 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 C_M`a# literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one b/corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one new file mode 100644 index 0000000000000000000000000000000000000000..c9ad8fe1c0ff740dca1c8c948d03f277a54a118b GIT binary patch literal 14816 zcmeHO4Oo>$79Kza6qFRw?4lP!0Y#)0SI8xA;13}ntC^3kYl@QOnxgrGS$Q=y{7KM? zMYmea43~;UM7z2PJ*7n0CQ3il;}7gYGw(U)8~AqYGV_Z^3ytV%8W#5HF4PXyl`>N{q z$DEqh#^}OU_%iRc;mo^K$Gn4xfPC`gN&4OYieU$%6AMP~`}5WFJEsK^ZQBBt$=ZQR=bmy$%C3w6 z0F6Nm<3v5ZccOeRb5@BaYEAEyfHg>X9=&(aiVu9=Un}Ih1C^A#)0j~^zL;vS3TAZr zX34?&UBM$wo^_|MXD>Y~Xlm=`U$wp{n`I|)!SaYGn|VeW%T(o3B@=yYG=<+WNg@qq zj^1T7Oq{08bjqAhd(b1LTFTn_b_Icw2d%kmzFr2F-M}SpP+41Cziynzjb>ciUVTZT zLe_UX8)K&NPGYH@kQaIbyvF{Zgxr`RSW#jn%DNn`GzkH?%v9Z$+E$=#1^&lZfX=_s znSNZFY?fZf0)QH}>=qEC*)Dl2Z>nADbl<0)8%_)~yg6{x9~Uovxg$7RvP%JkW8iso zO?5(`->k$pI~U#OI_mpX!d?{tswqWK7WT>s4Y)}%M}2{JL^XC$=5mQ_u&}E)$i51D z{L869NBf_c9cSDz|HFqn56#q3ld&v?J;4^Rxokc?&0u<##-_2E^sL%q*kcUbY`gIW zS(K8V+cmAn7p{yO1#R>aj-im@tLAm|LGP4c-=F{MtGjZB zj~%mVaqy+ItTiXVZN84$^%CniA#Um1!0s6yx}Gz0j!mzgBi7LfvqmYEGGq=DrX6NUl6!9l5ksF&G$)H4R#ewy!aF1^dN z$ChnhVrtxk_F>#Yo2b2P)oitgZvY#AL$UK=Jt2>!ohKQM=-i3*rt_dmtT6rO^vmc; z1G=*(Np~0eGF>C(-%*YyA2ES)BIPlZAMs@YvDYt5=uF%Xu!W?>sfr#$CsCtrD;3N* zOwG(dF9vl^m?v7gD¥dsCl2l<%jULHQzO^l!cf9we7#LO)%os&i96UFrOF(=iVh z$~x-fCmqWyrd&dK1Lbp6cY{hXju-=o!krM37s)^+Wv9)X?xLq`1M2w36K*jh&s=Vr(&v6CR-QMz}uki#jN6{ULWR77!B7^uOqs7vu%2J)FS$ zxI=KGGs9kC&%_Q`?+y4|*raf#>qz5uqH!?qB#t@{vBzj1XDj%F*~L)(Y^qBpe0q%D z{V4-Ghte7ZPJcY;C*I5ItQTk(~%lOEi~eCwkQJ>v-pTfz~67Zp%ENR#EC!}bP{4tY~;jrBH+=(oR|j9qGX_qM^AHN z5ho@Q0c+J+5D%14$b%Y6L6o5$PS|MLbLKRyIydV4M=uBbJ!A90z=%LF)BKfWpkL@i z0)DY*uZ*8Fb^h?=wO4z5b7W8Dt6RaG%9&9>ftr|K_*;~p>4(tb-V1vBuE=(p>KKl8 zr!J5XKWXtDA|L@{^S+stw&cj1gw>a(&ENfVVuhfo9L>LKJuotz3u>Y&nMT;cNW-q8 zi-?i5(m*57yNqTTKQ)G`^5jt=?6Zg$p<75Eq^H^u(7PAKPhr>uN)2jZH-17p#7}x2 z%OugetZ$QE?GTD6Yl%A!5`)Kf-#KgwwDPg%4_n27e-1zAJy zp%U!^cnSH@S0Bnke(VnT{h#)Gt}m77FOaer54=H?#dw1MmBL<$!BmgWh5aZC{{Hlg zEaoTpQ&ye)EmgOrwiUQ-SHL`Wa70Ktb4r}#Ob?F7N;s)%61aymjRgB#`22unwZ**? zcBhwnZ=DhMi*h!}BMl%Lc(mVsP!Aq0rlB4qJ?zuBtS;ujh^^K2`@3hA`v`kp!;Oo9 zc!1vc?x)!E7UC$310JQMXL)=xJ>@f(Q^^bBwwI0{KQZb466^Seni^Y<$MSyc`qeDo zKgDm)IaL0}*h}d^*ckF))5z0tEEb~%P5uve<(2jQbZ+g3#fwJA<}Iq9v9!bq2GGL) z(XN+R-7hBUAtR=B4Xm9V@ueilu(A-c6wr{30*Dv#CVD!ZrCtj@f_U zHTr~&A3MzF+6vc@_&0n4W=!Za?+oOY##U6X#!)@EWJUBY(<)mwUc^!9TzC_;m#vzu z_Lgx}8jKL7TFSz%lI*RFqi&5}V0_r|wm6F2CUI0t=Np=?#xwLlnD*a`qu{q80jD$a zr<`+JwJtU*^gwt0p!`0N(mamR;)uWtFWw1eY!ycZaU$>nj#Cp}08FyYh*oh_BPRle ztl}sG98F5;l&#_@6DJyo2&c^=j%wsYc+FmvE#jzH_^p(JDBF#r(m1n$nC-?-hGTaoZOS&v~@V{=B%$ae}6DH2iUr9mNJ4b*!mL!>HC9u)#tg+IZCVjiTY+Fl?#;;3{40+brm!fqU;*fyGR zs$OjXjga--h@gNH6j8{9?=kqE3_r=4UL5z8h?$a@7vdo#oWHyK)EN4`T0AoIwcO+X zm=|;n^D;kwzt&HJ-N)!zMegGgJA6H2--tPLgcOJ;tddK;6n5I-qS)3=5v6cSQtlNu#hOE@zY{!=C=1`)xo|5U`84a98Me`?^& z81feQPkz)5623!g_XYcg1dQF|ckR1?nkn(`988Wn7U^wyL#DDRziJ!!Ps*o8s)PR| z(+FD_Df}m`H0J)3mS*Wc1%;~u0B#F6L!^{$&0W zder)S_WUG6KXp(86^{BzLSBAg6})(DWzVPL0+z>Zjqe+F%CqvER$kfnFYw&d{WnB~ z-yyyK2GQ~FHtmQTXClC}M|suSBctE`a%aJsE2pMGCYdjSde!eR@)awhciAr4IupY0 z2;&|D{0`Zw*=qmT3ICMl`)~cdkjK*RpjRX6C>dRC{yjyVFMaqTmRs{T6&OtD14mj# zA0l7+!=|C@U1ACcJ@LWd6{g|#^g-BM#y&EmOf8kT2rmY%4jXaRT@LVRmbB|RVty6+{!BY7?L$P zrT>(pvAdToXBksmSAnxNcq;TXcOay`xxaG~as{eQ6}b+SXQ$)@P8^y0ZJ)4X7jmr5 ziPi?SDqh2QHsduA9mmb~#0@>kU$<`6;7LJoE6dv-4gNIaORT31OVu5LFHyx;ESETC zyJ1UD1a78=QA0|=P1&m1YHx{~5&V|3mUV{iq6d$==J+QM ze|E&iawt>RzJ0RAoP&^MitzR3M;&HTiR&b$IDVEwMj12kY*9_mirFgA($`xi7zVanD55 z%lvHAtNue8-xT=NvR${O$M*4(2B2?Z;{O=z{Y|JMkn$t+k-NT%KHmA>>}f|Pm5nUh zy`jtJo!&nV`CGzEp^p{ZZ;v2;;ZG`y)xy1{7@s><%J|(UY&br(uG^U6y@P93`X=|) zjxY0b!E;mhfS5hBU3w1)qT{$oUW$r~lUJYp`C?`CiU)pjo|yQ>_mD}3m8e(sfelt3 z6$p~8x-ESWxM<|(ql;WcF9tWL4Q>6Def+)Sm5k%=djvz|!aXL?$p8QV literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 b/corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..cc7642d044a9d41989e523aa612020a3fe187d04 GIT binary patch literal 6440 zcmeHL4@{J07=Nil;Bs-)2?(@-vdM^mc@+-E6cF!Jgqx&A;pFsOBudDiiz&4u3{NXP z${IsBs`D>X%s~Up`M9BXN6(CweP>P&EIMAX;FfFG^0^y>cq+6d%vyaReBkIeCPQ6UnS;6dcKha@rYnaVC7Y*AiuNciv$E&{dXTtJAERN`_)2DDDsd7GRcb2Y zP(1SznN{kEAnze6)SZYvl1o%(9?-pgY|PPjrT2M4urM~77Ij|`Q);F#yM`~=&3(aD z5UB3+J;{Ci?aY3Sk26xA(%dQ!Yl^dvoF91yUm@N{s9+t`h_Qa`ysiF^Q3Jx)6cz8& zn*nbI9+C`LRc!rJETS!fX^W_Cry3L)d24mwGnzvEo|We<3)J=iFvdhGIjop1V%h9< zR!;SNHkF=Bs6aC_BQvpAsa3|}$pfB@ftP4Br&yc~m`fCiPr*~@#TjsC@{!`*l?~HZ zojbL1e)B7(=>My8L7Z*G8IYEEF;~|eJ!3=F#puDkU$4j605^9!mClCG1IS2HNJTmc z#DLOEm@Ska1fj6fG?)nmX9ZQZKzfkepd#@)-UnHPTWa(6eCW7VLVtQ~kPr0nT)(aj z*F%rzdP3Bqdg#eqUlFHjfv)HJl8MEG(C2VH)>5*DnqKi{z?*^pCyOfY`1bVpJb{Bf&GC&pdKirn~C&a3bQul8)ON_M2` z(`$Z7Jy^SJV;Q(eiEF7_5ZD>JFJ1-TV%Z<2Eq3aH=g!=<+i89&u;UZ(Ef_V1Q>Htk z;+{T*+YB^bOb^09Fr07uK&&MG)F<&RsUGrn)e%}@KG~GkXo?+*i0jIElw5+)^sofs2FWwvmuE2mvks<3C|xL^cuaj8%6#X^ za6BABqeu$x3rB?e_c)T*-8j;E4{{&-QKa}T90#0TrB+*3&CTm+>poN0A{9#C3Uvzt u`#tXC|I>E?KE90;h(tOc(Z=h*X5g^9e-*HmaGNj=2y+pbT7EZ_c=`|g*qwy{ literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/after/notebook/Open Notebook.onetoc2 b/corpus/recycle-bin-view/cold/after/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d5196250b23738e38ce031814e733d582a8a7bf4 GIT binary patch literal 11160 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 D;sr~1 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/after/notebook/Restored.one b/corpus/recycle-bin-view/cold/after/notebook/Restored.one new file mode 100644 index 0000000000000000000000000000000000000000..779033e424f67d104bde8746df94c2c532f0ee2a GIT binary patch literal 6120 zcmeHKeQZ=k5Z~)TTj=#T;3_R#X(g9XOvMUk0TDT_ifypv6c9rYj`CRog}^mHMSV0x zs`zmrLR&tiLO}=|2w22Gf*@a-loCmi5NjmZC};r*MZx;}-FtgI&R2qe8TBTax4Sd5 zv$M0aGjA_GKlbIf>Z)>g>>4q@rq{|dBOa@rS2S~B_Mx30-74PdIw8Vf@P!IXw`DhS zHq~@lcIEhvx`)6IMJe74U_VL{v{uq3*QK9IMUGJ#xxB?||g7^+l^A z2bv76?@>v?Z$p=0H_%C6wB2aF)Z0~Zscg#f%=3q&4gEJ~om*3towZ{6$FKLTNH})) ztjH+hf&Zlklqiv56Sm1Vk!XPf(l&qfaOZj@XG`72i?6(N%q&LU{-)-+3x=R?6r(6f z7S^Q>VLfOQ)-=umZd>ySzDIt&d1F`c3m;MwVUI^BVURJ0)%_a4|D7$cAXIGM~0jhTvZ9Pm-5 z8ZxUf8x4TDhQR)?Py3d9o^W`nw67zH0PAd_gs(5R+WojtlGffVd3@iLtjaCpmlPU% z-IhFccFR|#`+dUa)(qPKrrypM&laVsU8-eL$MR}N$1ytAaOc#n$K%GC-E4t9H<{1{ z)C0r!+ldT-2|m}`uf-{Rjhf|+s^~ra*IAQ^#g6OSsslF~J>6|uS#yJ?BpdUjy^Na} zAkT*_?dA?C%9fru)Zz5W25Eq1GsqE$cp&0||F{Qm|CK0wjKP|fY7=&5jn?WGGe%2Y zvIa(KT{;#0rak|Ig-;)Rx4hE;@B7;*d9S);M;@b0#kr=j@uO4nc6a^m=gPsEr)9nJ zGgSln17*E3aDrBnLbJZicVts0(4yZaxUY%HBHiUs_cnfZ+z*S^)#v$VeBtl6V%%C; zljST-gkPcqbFZV8%lh1mIxXvZxYg;Hk|PR5s+a(rBPNTv!YgJ4dXqqz3(7=L3P3A_ ztgQ1~Q?B3Q*91}ltoPTCZaiN*chInXs|Svn>NvTbGeZ3uZi)2kwj}qf@e{6^+L|+6 z3%VHxNWUs9a{$%})__?22N?ZzqZolSRqG)&zV4_$>Y*bAfrl;lT09!k&HSm(gZO4-rL( zz-fV~dw|P;mqBYrE7y^0Fym-HDX^E|L<=-jlqaF*bCRY7 z0`i(rn9cbALyQfq&okt@^OHsD0$@A%P_8Z4F|fnnSNLnh|EB1`+#a;MyRfG_MCuN!Q-E;~Aam_N_%yI)@Lll$IRNIF;XA%Ir`_0|Q(9Ay^~S1(3|e@vJR|c- z9Rm@N2;>Fs2Tuj^H1kQL#$-NWY6<2OGN*B)fN4OUSX}7L8jZ;`MJ4H>%tQtgfNCjc z3T658q)&?ePx!+qkHfQA_c(Y%y2RA;1L7DFyTzuperZV*mo|jc%*0l zo)msj6Lx~n_{im#PFp*w&@<<${H4DoeqX!)-6`Ib z + diff --git a/corpus/recycle-bin-view/cold/after/read/page-000.navigation.json b/corpus/recycle-bin-view/cold/after/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..786f5d77169a6a0cc6a55ecc374de91d8d836905 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Kept - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/after/read/page-000.png b/corpus/recycle-bin-view/cold/after/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..b2aad44f8952cbd2288425e61aef24797aa4a2c3 GIT binary patch literal 41556 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 z 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 + diff --git a/corpus/recycle-bin-view/cold/after/read/page-001.navigation.json b/corpus/recycle-bin-view/cold/after/read/page-001.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..983148b40e4c8de82cfaaec2324625cbeec56dc3 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/read/page-001.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Restored page - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/after/read/page-001.png b/corpus/recycle-bin-view/cold/after/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..6f761efb808af77e986933b154ca59738d740b10 GIT binary patch literal 42087 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œSZ$>^-V=7QywT<4Kk;}Tcp7+Yx%?;Vqze1wN=HC;GlOlSa#ZOc95YQ=WtJu6t_K(LA$`lw^O%iMaW zx%CcntL^5N+s!OLHZ}jq%=|-Bvky&8x0;%MU}Ew<9^);>Mw^X|HyIlN-ZM6Q&&U8k zwZ^XU(U9g@M_)z=HK|L4K_j`7iz!y?TA_DOrK&R6Y2-PnTy>jXT1(0(Gj+3 z0ir2>f-yc~54>{ivm5vWD>UQkU-*^TXVhPFO!Kqn3$c41WWy0)&F*jc)YpQ|$Bfm> z^ogg*6L({l(>e&p^m=ah5-zu5PS;|al)7{J2uqzO4muA2PNpy4+|h8BTCb!!&%|2K z#2WX6YS;KGm-s6C*h;gABE!&ptw5xrZ>F42hOBpnoNuOtTQZ09sxE9N1rn^1#{MPA zENu#o$#4sZdcA;{ATlj00KkmnF5g-6S;}BwHZHJWy)zIeqr#_I#iUw>hRGU$U>Q3GN@&_r$2}I$lZAj=xNf>_y1 z?lytRPN9j;;fY?+(aEvuCI0_bIGxCI|2HOB#TyZcKSdZ-@)imf5!b{zMxV;erXELR zn^!>xcua5Tx$IQzmPoDES<}q4x-Q4`W{0#E`?Qwy+O7*`SNr9*bc&F66 zC)GN|S9!m_Jr4<1DRhHpsub3CWtBFi71X|7Kui#smK7+41nc&rb$?S}VBT6_!TK+e zS-!-ypGy{a{oG?0GZCZ*I>Qff&~x^s`}fd^pbPQpH9UW9g2RpFXHhlqh95iN8uUcjN^vsL|EMl)_p_P z1x_(FAXsHh0~-R&_#`Y?Ffder1q)_J#HP+^09XJ|K_+-b$(0C} zDq#*%pjpm=iIzTb{JNgkC2i<=j1G%hf52%301NcI#vl{C1PXv+pfD}7iBbU;ESMF* zC8pjxgsJNou4oy2%W3FD4Ub}PJb1S5I}HZrtpye=nDynsb5YmeL?u%%>I6h*u3WH) zXjliBx*}}6V_brg0NxSl0B9Lxnz|uCf!DHCuwcQg0C^)fr+~PQKGZOJoGKFl6a?lK zBSf%xM)BZ?pvUHcff$FFguv3wz%bg*Gn7wOf8BQ)49r^#ELbq>3p1yvXIP3?c&c|q znhzq~FDk=7IuqzrU`!SnEId-H6|6S~ELbor0KAppp9yXW%_n>^EWFa-6A%8Yc=STz z5x2xcE^%f~G4O4<|4jHkhtNF$yCBokmyB!zjBNZ2tbBK$@ZMqJx&8RX?MK|V9&+7$ z$a$0b`Hct9uHOf6T)W2(xXSeODkIw!M%I5Bp5VFr + diff --git a/corpus/recycle-bin-view/cold/after/read/page-002.navigation.json b/corpus/recycle-bin-view/cold/after/read/page-002.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..a0820975652a5b88c4d3fd40d0c41e8291629b36 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/read/page-002.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "In a restored section - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/after/read/page-002.png b/corpus/recycle-bin-view/cold/after/read/page-002.png new file mode 100644 index 0000000000000000000000000000000000000000..289544633ca34d34a851d607bd0f698f2e29ac40 GIT binary patch literal 41199 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 + diff --git a/corpus/recycle-bin-view/cold/after/read/page-003.navigation.json b/corpus/recycle-bin-view/cold/after/read/page-003.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..e12934cfc3629d8de3638369df4969f449ea435c --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/read/page-003.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Copied page - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/after/read/page-003.png b/corpus/recycle-bin-view/cold/after/read/page-003.png new file mode 100644 index 0000000000000000000000000000000000000000..c20d3f2794da478720ec8f5edd80ba7b58cb39ee GIT binary patch literal 41982 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 + diff --git a/corpus/recycle-bin-view/cold/after/read/payloads.json b/corpus/recycle-bin-view/cold/after/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/after/run.json b/corpus/recycle-bin-view/cold/after/run.json new file mode 100644 index 0000000000000000000000000000000000000000..346b3f3cb3db119ef193e9d1b2d50561bfc5281e --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-notebook-features/recycle-export/after", + "expected_pages": -1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/recycle-bin-view/cold/after/scripts/cold.ps1 b/corpus/recycle-bin-view/cold/after/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/recycle-bin-view/cold/after/scripts/read.ps1 b/corpus/recycle-bin-view/cold/after/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/recycle-bin-view/cold/after/source.json b/corpus/recycle-bin-view/cold/after/source.json new file mode 100644 index 0000000000000000000000000000000000000000..2adc9a038753050520e42855ecbd62e994a7add5 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/source.json @@ -0,0 +1,32 @@ +[ + { + "path": "New Section 1.one", + "bytes": 10768, + "sha256": "dba689859ca9223cc7f7280b8126df9dcfa8bad9146237a2609d69cc1fc014d9", + "mtime_ns": 1790878542932303216 + }, + { + "path": "OneNote_RecycleBin/OneNote_DeletedPages.one", + "bytes": 14816, + "sha256": "bb80046a0205e1aac6ac1d6b04b50285921860880a3da23b26832a0582391979", + "mtime_ns": 1790878543094303021 + }, + { + "path": "OneNote_RecycleBin/Open Notebook.onetoc2", + "bytes": 6440, + "sha256": "b932bfa563549a224ab8f3f950d4b23c0e74fbdd56d2ba31b1296ee33495c2c3", + "mtime_ns": 1790878543072446775 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 11160, + "sha256": "00509e99899c98ce844e32441563d64714964d0d1f4b976a1e1e55e6558a5405", + "mtime_ns": 1790878543056292320 + }, + { + "path": "Restored.one", + "bytes": 6120, + "sha256": "79fbc722219346d2b4359b4bdb3efd60fed68c7953bdf76354501a0f8e614a31", + "mtime_ns": 1790878543039977656 + } +] diff --git a/corpus/recycle-bin-view/cold/after/teardown.json b/corpus/recycle-bin-view/cold/after/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/recycle-bin-view/cold/after/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/recycle-bin-view/cold/before/commands.jsonl b/corpus/recycle-bin-view/cold/before/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..b7236c4a49d9abae710f78f3288e8a84ae8021b8 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-9027D2D6 -ExpectedPages -1 -KeepOpen", "exit": 0, "stdout": "Read 7 sections and 9 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/recycle-bin-view/cold/before/machine.json b/corpus/recycle-bin-view/cold/before/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..07913368ab8d8468f8e1ea5b80cf301bdaa316cd --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/machine.json @@ -0,0 +1 @@ +{"name": "m6-9027d2d6", "hostname": "ONE-M6-9027D2D6"} diff --git a/corpus/recycle-bin-view/cold/before/notebook/New Section 1.one b/corpus/recycle-bin-view/cold/before/notebook/New Section 1.one new file mode 100644 index 0000000000000000000000000000000000000000..02954af59d39f74de14db49ce9e73142aa4c5eb8 GIT binary patch literal 6024 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 E6Z4`?rT_o{ literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Emptied.one b/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Emptied.one new file mode 100644 index 0000000000000000000000000000000000000000..97e399a976b788ad824d9841dc68835643f9231e GIT binary patch literal 6120 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 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Purged.one b/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Purged.one new file mode 100644 index 0000000000000000000000000000000000000000..24d0385f08b82f9cb4cc7fb88e5af6fd3a80b7b1 GIT binary patch literal 6072 zcmeHLe@xX?6u%D?P!Uj{O7?yFU~lveMf9E zu?4mS>g%{K?FrZbdpbGd6AM(vU>U=<|8s?|nR8UzmTjRqt%)-TOV~ z-gC}9=X}q(-`BnJ*^*sd2Q!*lo-XQ~S##cOYm2VFxID3Ge#x;ZBNs0eez53LZPdfn zy{QeIldEr>Z0ec?zAwt<{Q%B`Btah~U6PN#R#SWB!%Jx&d~&+ucJAr>wjIqmlE<+s zM0<+IVAto_8p-?Xp6s1^CeMwuHul#YNNYOyV)?!95~s8wY|4_zIrB~|+x^pbt6Jaa z_<8WIz*E2j|4R?3LBg&GC07yAQEl-y# zlv#wiGG3U!P=t8~7{s?eJICF(@AS45XVp^@p)Fgez3InKq+Tga-nk~LzT5hCEk(sf z3DpK3*SyrT|CNr2zO;toF01|OZ+B*Z*H9=b#0YZn-UCMiLj?)|HPewq%vn2CiT-|>`{LUE>qTex zNS?NP;8&x&szjAjH|zkIMkg=N7ZsXanq^YPZg>2+bq3b((mcrpOt@VU`>qa32@rf&I7ZRxQ7o1m`=!-+4C)E=A|jAV}(LTA1%BnA7Vz08|X zAmhW4cJqW>%8{Np5_z`6Ee+6Z1~~u$4+K2$ANK&>e>Dg{!QP%_RfLUIW2nBxiZRfa z%$_H$FO|-XRo7&erMc?k)b@n-POcoTFWFGXxTd$JU`c6QVp7HFxZn+2V^+(4Bpm47dDkfH<}i8-EBUUZvI^QQDs{L~43~mnYJBj%&(-Yhj+iU&)#vR>-Mz^8CW%m6M2W&&TZ2wTeiU!IA;>cz<8Ld1D1vY9zaiWXK3LS3Yx zaNxnAor&k<&QOmYzWZj#oCr(+mIH4ADc{!z;jn8kP);OB5negt@%~LvM0hYzfsDI~ zsAvVY0jq)6LF>mT^++A8DEcJ?_7WTzfu`EM4`Ej2AWaWE>XuMht$4p7hI#ZeX4G3` z5!UU%QShPEE%lf>O1Y^aR z$q4*CHrRlB|GIdgjE253(8F^(^~$qKY(^ZnpdJaq(sP-ipq0bb5m_%zGVuUBF<;Op;2BTdWxcqpGg(Yn zItCS!6dn{nCL=V)cc)8dveHnh7bNFY z-i!Y6+@X&B?{aaTzL*0O$h-K>_ZP;ve~oLMRyfU4R%Ob5usSOLa^d%re|@J31lHJ| zCm(Nbe`HEVi_mfdw zm3hkCB7`GP{WVZ}6uzJA3kWIeP#A literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Restored.one b/corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Restored.one new file mode 100644 index 0000000000000000000000000000000000000000..a37451b4003a799f0c36f76110f99b704544e387 GIT binary patch literal 6120 zcmeHKdu)_N5Z~)TTj=#T;3_R#X(g9XOvMUk0TDT_K3cJ*3Wy;HM|qY&A#e>)Q9mk? zVtpKl(3YnlZ-fH@ix@~yUImi^(G&@>D#1oU%PSNG>+g5px7XwRO7JhE-X!zw?#%4$ z?Ck8!x96W9@$y?W8?v|U7(A=G+mh3RA2~I%aLSy_1KT&>EZXEcCPJY9xe80Ch1avz zRd-l;>FBna2fzprnfoMB63uWUMrJp?@ZRou|VhaLe*f@crW2jq5v#Uigrj2)o=uDW9^#F}3mQr{1}JF+b0}VINg> zu?WQu9%YJ_EPi|M!JGj;YtHZMUYnGj0^T~0C=o5l#k~i%21W@a08S<|O=Biw90Poq zsfNr-%tixXt|72L@Y9~fpT`|6mG-qI5n!Drl+g9%Ry!XRO2Ud8#gFb8pRso1sQCrP zZnq>)o!#_R={~RU=4ytm22*e6^QMUs)h^XCsbf*4qwR1VYq)c2*W+>H%x*USo*PW) z0&0Pw`)x-CzyzP`?bqTI-g?dQdR6qU{%fzvL}SObE!9CT8a>@DnptzTrX&;dq`i!r zC?L;=E$!wGDaw|fIMC)~Rh=|Ivl-+tggp@Uz<=BWxc^E7KE^=JO123*vqp1uiy5P- zE?NB}wJsfxeAAxy!JH@ezgym}kLUd@l)PJAvLlaCrs7P)h}dCCIXgRk_siP;=_h5q z@-bBddIM#>GH`-cl7h3o%y(o{#^0jfBCxM9i6YhIQ1>=!TFj4gSJvkECLi|oT0C-v ztjTf~Cc-a~{<&9C%Vm9TM4gs(J=E${Ovw@jB3XY%oHRddg>BuySka_R_0hDH~-!#9+$e)yDPcL&V z-JSijC4qFk`cJwLto3!;iI-ul7fsF8`q`BY<(%)-Dt0C2>v^rY`TSQdsN~%sMU4S8Lg}xfaAM$8_sDfPGs?dXbAuH+kYcS(zKPj-6;6w{FRFo&6=XH{% z1p@M#P?*j5|3i%Sug^2&y0a2R@@!x$_)xAb*D`qMT6-cL-Z+tRI7Q>4#k8nhD4&Ly%QGVlsL{ zaJLztPX;Xy*(V?4E%^B zNeu%L5D(-9?gdZz^EC5Gy~bodVQLBF6EY`qqkxG(o>)xq%xaCvG({z;!OVCD6M$+d zX9{L|HKr2`c4LE?)f&?c27P6g%tO2I3L*u-x!Z7-DS-(rimfN?_t9Ynu z@2(VnQ4@B8&-lpZmrh$Tw7@<6iM-O^;(s``w`%2D3YTfZY#2}h;rBN6yT9^E_nk?e zq{L#c!F_LewgXfU_}&W5|1^QX96Y$tv+By&9 zB)y1eE{8gI`!4fM6>1G5g4*?XcfPmu@~(VeGPVdN#A)aX)Na9h%gsXo)T@nd9+&!f z1f0kBR<8E;$;DVtx1L?ReSA-`PDcY7EDTcKCk7bLhkV-2_~8=BMgBEMc8l_%8-}n4 P!XEgScpx|j(BwY>p_NX9 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/notebook/Open Notebook.onetoc2 b/corpus/recycle-bin-view/cold/before/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..b51f56283169257cf8d6382cccc4dc89cee63639 GIT binary patch literal 10656 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 + diff --git a/corpus/recycle-bin-view/cold/before/read/page-000.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..d103fe551771c44e2a0e837c579330a7417b707b --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "In a restored section (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-000.png b/corpus/recycle-bin-view/cold/before/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..2de1343748cfe9d127a9c071d4028bfea4f14989 GIT binary patch literal 45162 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

    rR6*5bQ_ig#~}(2 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 + diff --git a/corpus/recycle-bin-view/cold/before/read/page-001.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-001.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..9c5e423d31fc982b584542431afce6de58822c8b --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-001.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Copied page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-001.png b/corpus/recycle-bin-view/cold/before/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..653eaecf4b5564df4a8bf44fc9e89886a44a7538 GIT binary patch literal 44960 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 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-001.xml b/corpus/recycle-bin-view/cold/before/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..28403dcc0ff92b198e97a4db32c26fc07c5aa02f --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-002.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-002.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..9c5e423d31fc982b584542431afce6de58822c8b --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-002.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Copied page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-002.png b/corpus/recycle-bin-view/cold/before/read/page-002.png new file mode 100644 index 0000000000000000000000000000000000000000..482ffcfbc4e94f4ee75bb5930352bc89a90b253c GIT binary patch literal 45643 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 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-002.xml b/corpus/recycle-bin-view/cold/before/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..9d10e94c54930aa073162aa9b17d3069a667859c --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-003.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-003.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..786f5d77169a6a0cc6a55ecc374de91d8d836905 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-003.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Kept - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-003.png b/corpus/recycle-bin-view/cold/before/read/page-003.png new file mode 100644 index 0000000000000000000000000000000000000000..f37593a9beff28fa147631db49a564c964f8bed7 GIT binary patch literal 39793 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 yLLARDG_EiG4 z674O+&mh`e%+p=O)m6yRRlwSr&-|-Jq;qx+pMMcQoylpMlu`vxEO$t(a6{L-X4E>T)j4I< z!P9FU(an!+;=syBwn*hbw2&9t(l^O-wVks-u=)vtMg09B1#GF`K(JPrfM7ZMMWAvj zm)$xMAXxv>zTA+H90bG%0VG%-7xUz1cKP*qDYBJ|6j>z0+yU~7#+;XDiG5fCS|&bC zb5~(yQ_9$ThCSmDU0$#NdJe%30myHe_4cSmP)qyoR*c-OpSIULkJ_$umuuC|z{Xus z?YmGtJ5&31ruE}V?%9Rx+!fKXGoS%v0NFrhPy`eN#rLR3e#@*60)ntBej@b=Qy|O!MtOn~12WoWstJV83%6%2Gy=4+T zr6S$M{N07zKbc3mplkSi3i*8s`Me9^=~cg(&j?l4Vg99?^X>E}zkwpwP zvBV~;Roj)@iK*t(Qh^kx%VdzRRa>S47*c#GYN513PnvcI0CLU;#YEuLLjo z)PZauGbjQIg5sBWOhG6R@QvPyRS1@)Z-Pr$oO?u!e>|c*=x&7yRe|xb3@`4iK*4;E zM`iFUNN+*!5MS`kT}$^#Y{wC3!{%?z>SxK~W5Mig#^h=G(!=DXn=#`#9Rxh3n%k|A%e8>hrNAb!>XJUf zQso+sPpcR$*=TvZNK&1x2U2`bWN9Kui#MB|8AXjgH@VxbCx*K|p-C zK!WwrK$?sSpJt3_c80210h&8{J!)YQN*QKGtj~){G0zGnYXE{}3=fdhw55z&U@QZt z_(}y!jnIze5`?-ZWwk@pncAc9fMe-Cr;1$x4ZGtyccu65%*TFKIe#luN!`1%26q&Xe2N+0TssK>3*aeO30?vjK(;+v2v7tR z1jRL1Jno8|Rp0E{%0J02IME>_34GHQ8H4qH3l=~qu>5c5qU%nDe>xUibIAYQKA*?8 zm~s(z_q_AQsizE6NHDqPZuo(02%O^TK(LDIdOiqnqZ5!|K|oLd5-f;~RNC1N}q8cb~Cu_(_9+cyECO z3u0q=#v$esgj6>5q>O)5+Uf<1god@hsSCo!E800Q0pJy$0w6Afm8Px;km0Qy6(m>? zt3biX)zLq;rE8!cJ4%r;zyJ~4YX(US;~By;P69hJ2ON=6A`?W0S4>Yo*3Kh@PfmZs zPZ|WodkZ935E~0Urf{)h{Xy=u|*-`aBqUq}M7~?+i$=AXWi* zE5Sb#+>)9v`D7V+WxyvM{8#b(mE?17Nd_(ndQNfhZF$Nr@{~>Z34m4TF^eD_vj814 zKP?mAqnEr78F?POc=g~p_k9MgdkmcS=sE5_W54qhz;^oyE8x~+mRoepH|d!ErG1I# z(aV1xG6HTqe1Ye|^Of_6kyk|39DMvX{G>rZythDt1+lS!3kTr&EZ~Ad4!Fb+0M{BB bknR5gyx$uSV-tRw00000NkvXXu0mjfx5Jb6 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-003.xml b/corpus/recycle-bin-view/cold/before/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f2ef60b922f4efe228f09ea83889121531b23ec --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-004.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-004.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..c6ad93f4ef700dadd2fc10d99cc3f805d8ba6212 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-004.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "In an emptied section (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-004.png b/corpus/recycle-bin-view/cold/before/read/page-004.png new file mode 100644 index 0000000000000000000000000000000000000000..903616747f1cd7b7a710ec1596ababb139c78c71 GIT binary patch literal 45220 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 Jm4tEd{{VrRp%(xE literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-004.xml b/corpus/recycle-bin-view/cold/before/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..af8f6c870899d3b0993d4fd47ede7574ed1d8a3a --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-005.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-005.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..d16fb646f9f559bdfab19eaad159d21f37ea6b16 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-005.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Restored page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-005.png b/corpus/recycle-bin-view/cold/before/read/page-005.png new file mode 100644 index 0000000000000000000000000000000000000000..3120d57cf23fe8866ef5d59edffbf7b7631f8664 GIT binary patch literal 45709 zcmY(rbyQp1^FG{r3&n~TFK~eZ#arBI(c+~L2yO+61S#&fNRcANix-CwNU-40P^`Em zK#<@RcPH>m?`M7Awcfu@){%YA%Ti_aJ$Uf&p9c^A z1`_^_J45q?hWo*TS_5_E*9Lw$yX{0?PuD*kR5ttWXSNOn9*ksqVq|>(rdOIt`74>| zS@g3JZ9-^2jBW=DY3>7;Ywz6<6ZZ{P zM+&2sr@AMFPT$8SVMlL_SF+|Q2WyqP!!Gq8yW7l~7J)N7;Z(9pWq2Z1sZ`FS>dtfZ zIEflbO{c{9e~E~y^KkM~>J9QT*y}(1^BvdrE8E#7%C+L}nQtcr4=hIMhK)L|HnM#j zXm1rfk?id8!&L$xy6z%)Zz|wM^RvK!)-RWnsfLE&aY1(4?nI9C+_`MSWrG18yLFmb zV<{i-3#`iAg-aa1XRK}hGhvFkPhQUFT-AW>RoSCwyJ)D~< z^DLwrPQT~fpH~()w#_OlQ8bwFDx)JP$!na|=9Et-)M^tKu1OTH-{jzFep4FSF^V6k=StRC*=Ec#!Zh4wyLIT!O#x&G&Tvh6*gqYm(3qpO}9*A>bAie719)tKB8Kao0Fo7@d_4KOvzLaFq$w zGcDR!4esILo;zj#I6C-?-EfC08zgDw#9M7QIwE&-v8(X$uz%4!&8O_XotfX*!>V+41gsxxay|-kb!Z z8X;!%sxAp|gU2#sNGTb&!zF)5X3S1>VD(gmT-r+q*vEpsEDnkk<}Iy0ues=-OnL;} ze{Id&@q$RjGXSK}KpnOc0k)(9G953W_DOlCs)%5kmZRyY{-C?KVYZYI1#>dgnd?ZJ20)y;YABBT|Qd%d9NY^iaz3W8$@Y8eA|f z!F_OMf^!zhfVJOnP=)_hBwBw51<{<%`M5HpURE1xCH0*+UG-I>i_;k1;GI3>+^5Kj zA=Z>!Cx=-F%T4J}c|cz8Ep`0v?fY#A-JZhu~J5od8Ymf9XuLF60ncQLZ; zA9dV&Cwhc&3&En1&MMBDJ@)GNU!TR6Q=Y@zlU69ujAA&ycrwMXt3ksbe47B678Dn! znXdI7M3L@@?`kdhuPr5E1J5(k08Y9@2n}s@Id9?N3Kt+kINoX&MS&ztuV^}3dP0+C zvN{z?Ib03$MLL|p!IK?6o0nx@ z|86byQI+cYROGM=cx)j*$@hCIJ%q`2JwXjQ^VhxJgdut#3WZ0XkN7zB6or&ciM4Eu z052rEi7J>0CeKlzu(I}plExf*X8)}!0#ql-O1DTJi*?KUD{WEl@Fr;z+N#Gd;m`8+ zf~Wyv31KB0CxZjEGyI=##D4w;+89G(+L|aJy=mB>u(a8`^&{t^gQqWjm*Sx4j;zzA z2np9<&u(myW%Egu!s2-^QmA?(C>2VG3dK3#^3oDOCcZOB23n=Zk+bFg`o=nuN*ku7 zmrs*@g;zN)o-OV|MJd?ev<^;8Rxs&sX>RF&KolYKH6S(B7Tei3YOs#6)Be)WON8m> zS{GKCu`H`UHYCdn?rm(di#U$5X!a?k*Tfe;L>`{gVvaML!?8PQX&rnK z=Aah#vYybZaKKiJsNcS$QY5Mr#8(3^5qe%NJ-+K*9M8yc4e^nu2YmQ@4=mt%H2iyu zZ<_hNNAMZz#J9Gf4l?@l{!)QK@z3pK9`8j@qa^&A_-~v81PY~%(wxEx`a;XAu=NXc zSRzL$ThNI6T%AcM+SCF|)_MBbl2qSReAD7mFw>H2W&4tUEmps~F4s-5y~eysTSCCE zr_9i3DtdhYoCVxVbuuzpH=&mAi!Fbo0!xNkLI_cr=YwjUK_};pTynBogK!~<&W5w~ zY>Ru_`{}%ci$=PAztu`Uqsfe1>g?g$8)K7Ylz3p&8?)T(&S6HA0_gUipU6ycYP2gy**qw?klt1e1~8CE z3$5@nt$ZxEBsBBYo_5ryX7;~=;Kzez-Kc-*Av?!(K3bWe$f92+v^s7jLPyh6hW9@x z`}Jmx9KswLQmjH;X^`+B~Nnw90$%5kZ14B`Rp#%$n2fY zQp`orLc|9N(?O)@;md?@pfp05rcq8ZQiU_iJZAlaZ_Z551%b4-vAmcAtm(&dzR6UD z^=y8o{CB-BE0{%>=XPkn$-@^+m(!2)0tY7ka?Wtt4tn??`z-CU8t6!tCV46gi$6Db zAINN7wDI}xV0eX^rLw8GFV{>7usz5ps%JiZSe%jtF!;r;(K+3&jF@BA7&BO794Np) z963YRCxY_(93@w|XNi4oc|C?bowo1vQ11Moocuh@`zlsH$Zdbeg_>rOvFD?_1by1I zE#2ODiDm|}T-DBmTAef2s_GKOZilyHaI={oa&!|C8hFx2WSMs_e4kPXxUbo2oW4J+ z*s)-^-MeqP?m_C4jK&Vz-{$JTOwhFaW>aV%gn^@lW4yFQ8iQ~YNot}a1(RCGXkIKh zZU~ZFA=6mmLegF`R`iow1XM(v?ua)C|Gd=7%t4P+qOY_h*w)&p=F21}&TBBTHnC)D z;0y95WKipa5bR}BG2(SrJ=xIf>@W6ov+`}yAxF!c5#SC3 z%Q*xdm{}OIrF5zfl9pfmxUX{iMRl$JHnLzJK{e{rLFDG0>ts;sm1I?+TB6E7S51`N zwB7P~{XQ^BJWT8~p;1j050qB14g zP%j9qZ^BJD(;~Ztg5=_byrGtJ3QDHvVThg5vrd@bMZ&@#2be_@FbE5?YY88KKgv!# zaH>me_)I~dHUlsS)K*lzdYGHKaetJ009r5W{)nD;@bV-@wq&EX@yspDLC4g>0lT7=?J;R`i!aNbhc)cp zo0l(yBYl=^up_0h!vI`F_LLvcwe->PLsmrM0#*Py>Qpk^YS3^Q$c4Z|hX6P30dy%C8Y&Bp~B*(CI_KYL~+ z%|ZeDa-c2t`R4=E859#2R7U1=u+vZh*v)tDz$XYW=!gxADHT&*Qa#x z*J!TfEGhFHlPU`)p1DC!sQA~+-%?R1&Qr1h&%WIIBML*a8V^H9Ob5Wy!S`N-HZM=U7Si(pXlkEVrHi1-x*=bt7^C!i=7q_D_c7! zy+Nr0f6$zbT{L?;M-onQ&AJ|LptXcd%9EhUsl#|V%$|Bi}IgA^%0;hs_~cO?JNpf{|%SK?YbDPo7ZeTvw?xk z9?tabuweVeomsD5e0^`3x-RxfjguVuqWcn3{k;>SuT&Z>7?TjQAER@AnZ*8QfS4B^ zqYJm^rLUchur^n*`GRJ5DfojS!kDZQg}m0&zLV73_xn_K*40^@CM@;OU>1!v@8&Ia ztx7Jf zFY&Wc*0wr5bTYkclydN1+&sSaHhc^H=p^JjO-=>>JYD%%;{;q!tWdMiwlJ_TMJ}ZH zkM<@q>Nb_PiqkTMv=y+wqYaWWN?CL2kGu1zBjHSZVP{AG(vTcv%iJt7z|~tEOeW+e zQ}%N=Ouuo_+AmP|FHG7mt`06}*e{%Xx-P1v@N+^fwCo*>^Jd}zgYwmQg(D?Sp>qGL zILM{d`KKvXu`nNPjqzkEr3gm}9&_?|zE#{Pf|lu+c&xZo_ZcWtLK0cbZTZGV@=We$$!bHI2OHhXYTp?{U1U|B zWG?gBK;8};%#|XeapqtH{%80k!dAw1QS)*nOog2#srU)!&!B|$Nytw(LCGw8FMbu6 z{O$6@EGAQI4^@E*avxkHcg;LTRCV;3mTI*F-q&7wYzw56ElN8MRHc+f_svnIso5bK zA-$cd#^1p2j}1b3l6agzte14k>nR{pI!b2h1tr*j3g*bH7oK!5iZ$V6J+BWQFXdb> zR`Z0s?L9EiCfyGk&|KE+B^(;Icr_8_Z zt4_xHcsG3);OUt}mGW~}ok^imhX^cm7d-g=6w=v&ng`~h*bT>&YF$zLToSY=Lmgv{bLGm1DJRxje;MFr;K$Wjnu7=?{S_d`=bVL zY@RD4%YhoGzoF02ORH}#JFrDzS>_5=+OJ8989T`}(lJ-c?`bZ`>2=*=VT&lw6bt?J z9igPs9d@Qx28@D6m{$}T@^H)Dy@v1%h(AS*v=`8XZ_OEE|Z=#}=9i~WihFEq@3(SMH&52J#50@PNwq-M!rB|cmPr;ix zpXC<)EM~%u{M5293l=Ak8l(19=&6JrxW5f<0q2*BOrCQZN^j9+EKww_2c4h6xUZoH zbuGJj`;>~&RKw*46%#^H&(D5GPZit+&V~D=QGDamT4aXtslbF;{dfR;^b*R1sD&@3 z7y0SW`8O@OwnVl}S3GQ18o9vdMUOw=KdPasW|b(+r-1w;1x*N6V{QuYJB`kMf4aWzcmN!ES5up64`3)@%PRoZWBK%Br*1Dt(gQbxxcr>+f`=#r*MoO45QruG`Sz z@X!_PH1B=yfJP5Xkdbh%D&C#Gpx{Sy37w+ObAlWW$vo>k_Zlyru}~#|ISumM>mdz1 z7^P6Tr}Flu<)R!sF4{9jt*?;QPO>{Fq6i#DAtQ4QvdFZkvl9|gm9KQeN^;=4)pt9p zRbhE+g@5!Q@q)YDKP^O*Pr2e>D~8_csaB|$t&tNM6W-2jh?`)0;CS5KBsX@j_!s7# zi2s21oz|VELG(rrmMqcQz*Up!6k&n;~j9 zaIKwE;znyHY24P;BEKXB2I=fjsKF@f{WP#FHG|qGcNSO`r6BYEFHrgX{_vTxeT>|U z!3ZtrwM3gqc7cKimTn0+XSis3I|c<4ZdaJ^6u2U{H;TZjLco@@(vU~<0YB%$9Y9$p zaiOV|ngTCgMQ2>5R&bAOI{02F{06jKy_WD!q)-fcDP;(3J?7PqAi%N)rM>_5R5oYU zzMgNLh5zT1Wl!v)S;**0adxS0yX!H5Q+2-ZaK@H|R;~|r%@HT4k+5Ars8~wbf+*)v zY0Sa7(LMrwfB5Z4B2n}9JmLt$a{H zylDwB^_gSVgLhB?#pB36&o)#mfIINiIOAzQ?3V?!V{X&$(F#G~maZ)=DJ}l5vR7Ak zkX%*VY$Kzt`<)dk`u7WCa*BjUI1m43cc5~9Ekv!wSc=;@j%ev`hX z-l%iGl+I(@(QeT{iBRj)Y4<)Jnk&<322Ff3opvCB2ApDjUClQwo9q_v3eT^lPPi7N z^<2cUD4sf3tkrqdqzb2JD!PvE zGW`f0ixRW*mXJGkDw6TLBDcL{K72k&#}5k)uJT~-gt~HZtbv(fc01LeTf1BvUn_V= z>+N5lghXNaC%fw9Cv|~0Zm#2z3%ImQ0BoybV`Q;z%Sg-`EQfq=v`q>`&!oXBUl*lb zA(->GGolv$!gJ8$VM+`m;}* z)9x-m+KHWBFq(=?`L^+ss*Q9oAjpfDe&co*b>|%He(CM0bb(7}i!$q1BHlj7&ZL!9 zYb(1Ml`iuoNiGXIucjEy%Y`20s((4qF!?yWTY|}~J8kt$$L`Fp-%I<>c8*Xc4jyDS zuH-fI?dLYGEMD<-NVxS}YzVe-I}Z4kYPIp{$qF|4ZcH4E=J}4s{letRF3ZGF?^9(y z&&xW^RTtUM<7J`lOp#n~)h`Y49T*D5T8+1R%HMXBTQ5dk@EQwlw*@X9w{G&&B^Kg} zvf5wBqFtj${y2`R;D4?nv!%KI%d6OO2WHJivq=(o6YL~J%F)Q|y2R3T`c7W8roqzu zklQ12+EBmI+qFQtXQ6HgHH>A`@y!?cyG9k8^*#k){dPxB-7*hYi?zV7^Rlv;WzK!!@*!Ux6zUN|?(m3FLo<-v=h78=ZTml40J+vE|9HD{a7DC~zwid^J{fVt;= zt(bxt{9J8tS`KCtd>ea4&TmO~zkE%QB5`~9GhRWRcJ@@ClZoJ&+im7?)3O6A&)`G( z`S1K+)HrttAcvb}d{bgfL31uo564UYDr~wgH)vY!`?bS*`&P96b^Y-V;_>niCSI?+ zl)O~E)V;L4+wnAq#i? zSyNHduAyF_ZH^tdLYp|im||zzCD0(I_VzFfln9|oypt_VH*dveIH$_i+s_H1TyB~_ ztW%Fi_&te_{cpL5WBp2gCtvD$kt6=Vo@iw~Jm>o#RWdA#U$4J3%(0p@Vl#GpWZObE zIhcIpT09#2q2haY$j=Ljp!t&>?Hd+Mz1z}8d!pN{g8RuGH~cAmz1{skN8f7ie+dxe zX;D&=++Y(wJ)d(q7bw0IUt}kaUAf7dX|t?wsw?+NEWfQ84ov+lz8~Nfj?F2q~?L2=53&kxvTuXaBb zbV2AaJ;?4VXU&kZt^-Iu%CUDO}llewDjz#SB@w|A4F zl3&lG9+p{3x~mS4{pcbg7$E}`VxP0awe(ri-f84vgm|USZskk598`vHRFstprT&{u zOTQ1!|F?Ey_KyS=|A5IisZAa!4l3Uwx*0wV)xZCIQU~9`@^QH3{sGU*>B?+ClQ?M_ z#VW-&^iF?J_E(GSrt6K9KTwM8+2_~)Asa=Tr+8mZ!G7Q!-`#r`EWDkyN^@`3xYe#v zl2Pt17T0#h;2?T{u8!SWmFBGHhFM-?%l{J>-iSwKO zR#lWtKhFC%IKK+h(%MIWXeN>-RT)%Ibhm~jh?(lH#o})hzRzeYW|43P%E-`>X0`v z#0M&|%(-}zWa73s5*(FnDrnZ^Zd`3(CE!d`W1`+YcssXe-{s;`Cj1-`Li z!Q&I<>U+0H{k67kJlmtBYWJfiV!bqHlu4wdf4y|q#BD#JJ<4gvBr8ksP3p!5Nmq@} zz5?&=7`LfRk^o&VKX8lB;-rpUPJG%^&vs=5eaOVXG^Jtu<)-CBr-zZZkYSIrFV}WJ z_3awB7PGY}QHRTR4Uyi`gi(gYY^s=*Ua8-F7C_*5m%D?t(Sc_bsJCK)&{)hZ=HgL# z_F5J^s0U!*<@Fd*JJ2z1+Z>DOEk)ssQPGMWmcXPM8XQP@UArA<_0$Ad8X#I8j}Q(Y zOQAwMq%iQCx7V|}ogetxr@nbqEJMsFvj988lnDU+x%nACi$cO-Fa(Tgxp4=X*IB^D zOZWR~%&5YxwxIV7GQPdNF!r|;?9t}U9V{z zm~<5F8JIo`vqQhad`p1NMe32h839d{&UV(E_lxK zmqe?oy3u=?0$#jzd$9iHmejSO;^GFP@Xw?gqcU{mg?rd&=mE@)HPOB0lb3!%m=xo&365p99}p z$?V5}I`DoczDs0TvHiCy2O$SgX7bE*kPX5?b{zY~9oWv}$q#kz4#rpUh3W zl1zsXT^$!ULx?&Yr~aJCA{Er#PoFm%YZaXIu}M&>CnePjSW}skyi)E|?)rg2VQ2NC zOn^z^Onr&79 zC|ww?^sO5oS4-V2GA~pEL;6fQy$>RLyEM-n1W|dZqJ<|7X|p)lP7TFS$Oerk1;$`o zBAF@L2-}MAFLHO4Q+>8M><0E(Lv-6q%IWtXL76HB)%$#gA2@_d|Ne{hV-7J%v|3e_ zh!mk=)g947p(|Qotfi)LW5MHhUNcKs+I0xnS)gyQK6_6m#BLjWSDr-{_S}uvl^Y1R z1;%Qwlf98_+Xi~yh%F3&1~e+Idgcl+|JdtCbX8k0h##kQb}&|om=dCvTb@`O{mP6r z-@Ds=MZoLtHgJra)Iy!t*Oktn>&@=aljq*EJ<#bgiJtrIixDvw)@m8|pN&25rWwGJjU30zW3$l-6q?_A2JXBXOq3ydT zS-YQ_*}X5h%0&IJeTLJd6CbW8Y&yrQC)#&xc-2=kh5xj&&$jv3!T|y8r?<56)6U_h zzZVd-v(7D~0ydPV585ds==h@|Up+)5{C0-zCsYT1W{00i0;)y0<~%qismUgN)2q=8 z#hq;cm_;37fw@tK>*(`p<`>(Cbtwv!ppNo+FYku-rt?A|MmSQHgDlxfYs6u zoG6{_3_JpDGI~v4f{Io+PO{x&-opN#BdmYn+1$J^wH@=ikzJy!7E|0_IKL^%nKYYXX z$jIf9$&dusmTFHIQFT>26{3^pufM)jXV{kY=;-vtGjt`PW3GoieYv{w7TrbYX z=07v07oO}xz5}xjZgL$(gQDu&hdT|gM@{b?1NL(^pmUyRG&!oiGwX6$hI&(S`g>>Z z4#C&IIkY(7)7jJf-$b6h*m#!X(jO+Wv8U~wwOv!cQ%Ah2f$3_~bJAOV191PXDY0Kt z=;qabNU8L9u;+|(_O&(ue~#G27R{_AC(T#u^Q$J`M9IE_st*-3_BfPQh8tHLU{zQ* zoj^tS4Qv^=-$@dq7%)!?JRWFb${VOOO>I;RY)X_oAzY&cCyPHRpIN`1k3V=C{eJM< zG&Q)tXM0tQX7imd>!HDv5kO26x9YbK0V;OwWwkn{GjX}i@m=ng{vnMxm7-r8%D3v&ORyd#?!2;%+Swc zZZ(&6GHz)7=hT!CvuVsMejgIaO^zIO~sH-b8P4OgG zoh_$9$5k>s3Q?vG zxp|4U=qFOXxn>3n*W1nK_U{nsHJ>fzT)3e)!`5$JN>UY*65zuhA5Crgj6MR_JMVj9 zfoaxLJWbMLIQ`DS`5)1>+wM8@V=#vP|ClY(rHeRq+6{Nnxn6iXjCDQa#x&{eq4(VQ z8(o)7c~E$MyTMAiH`wf+9;|5d1Z?A6!U84=>W>7E8uamAO!>EKFXX(m<#zIS8*0)! zXuCg;_Kj+nT5*H6Q^H-m8&-gGKCF~Jz>NwdEq&j11-;uxOob6C=+UtI7D{ma+|wPd zA2AYUXHk%;77sEzDn8-<8O4P{JQ72O$2l+N+005-S zC6a~{zpROVDP@F+b`F^`TXWJN<5M;ujxwQJ6B!xYo7x?YN8UF1of+zRi4$axusDE@Y0Vs4`DuAgp~^AX`VGB_+{dQo@})bE@g!A9Ka20me$(y zL2HNouJn&43@b2YfUf)c5*u^#nKlhXbNTA>SCh=5Hpy-3`98CUZV1E@=E|_bGZ$u~ z4a2wfJa;}#!y}$Ew3$qKwI$ig&Hm~``U)`cTr7Rx@nn}YbNsbL?2URYd?Ou`|77qa zwD8*)tORstH~8pJ+uE#C?`A4(J1oSw@#CFt(Ajf4f?*?6&Qp|-Ah27Wu1(EJwyOrm z=$Qr>ihFyib}HQEjuUaH#)q8j>D|BF-7~TX#_ERpb9U7N00Lzn|NeeZ)_^I!_A)0GX>jU(LGc@7pz!Zmyp7StV~v*0q=?2+ zm&4FkKP5VJ-Hhm@V_)M^=#f?tsmRD8`?hpg;I}b|5w*o24}U`2ZY{EPbUh=_QR-%| z1T!-HobpEYzP~rreTb4hp`?@L*hJel+tUNnBX7?Co{u`zRGY6VyW*$G~e9?&9%u#j`S1O_uUf`sH`gg;MITJx8fRTo4==6c6`mmVS$}v z3iaP|yT4n}9KF9w)Jv-ZI~g)-p0*9?7YVp5dcfMi9ewwV7Zr!<`wLO4?R(~!nTB)Y z!HfCJpVn^et@Cb1FBNkX(9LTW2r7RC#~ccX^)Dqg?N}YyIqNX6!zXcb@LJ&@m~;Qa z!=p3$W;F2@8!obs`Fe5HFJ)@UEG6~cVe&+SFQfH7iIqB# zPHb3_!}ok%IghxpP=2tf6h5=(4q`K%7Ko}GXpy;VeslIOUhE8t8hpH@f9(P&CCv4C zO#}I|Y+Mn@H_v>Khm!NWURc7LPvHwTeI))ufu_8t(Iwc>c`d;g6Fe~$+hO87=PP@) z#{9_v#P_m+W}c~GnT%ajQxcUR7r67qw?0*BJ(qjMmA<*pF@CQ$WW6h?v0LutsP&-S z=mN{dQq=WEca~|M%>GP$Fq)Ta%1=1LHZ2w9Crj#M%;n`YBR>~8vO%tNf4l3clz+ES z$NYTfOq{3>4Zn&0?eFLx4~N-pvOTSo3Agg*PVjB)V?4PL>(pBmXmY}$X3&6E6&QLx zleBf3RFhHKWqhol=n-f!lMyg0GTUQYD%k0>=j?$uC)h|Q8k{zHdsdKjzL4jZcYE@U zlhuvL*sQ(xCiF2-FcyL`imyGM`$v;#FLBh-OFm3taCWR;oO;o@6vIp=2#8LWZlZnOAy=Hn;dW0UgU2+=~)bhG-${x;Q}V4B41kPxq?f~jf*!dP*=LSWdFm9Sn6XykucAK+sY zIMKL=HZm{+7#ecx@$xc8*p}>H8JxD27i*Z#wCub{K!QTmZ9Ed}XjpEO{>} z)746O#PkM#7X1GAr+04N1lv+xvd&{9ZWylvCHBUk`vRH$(A|U^maEwxboN4~rp9yh zJFYjMO}idbCRNAt0_g(C%P>USy(z5TMwN`g)ru=@dnjGPdskUXB8D z#(Pq&pv{i3E^uzi8H|B?HZC6zTaEZvL&RhYgzQ#ri;)JWa~UyT3iU8 zSq11%jw!x*w&fj$w8eYs>OjhL4?RqkXr7$C(csX!DE zdMYo-e1rCtvvkrl4MJm2i!@im`Ik7d=J>c>MMaFN1Tu60yut_g3SlvDr%gf#g}MM*<*rO5>I zR;Q2hjzgxLZYHsfggDdNy181|Sz9+K^9WSwGi%OR>sU0yVcr+Z?1_zip{s;!s1J-B zsa!g4MqJSCmV0)>+;^;ekp=)h>GcXQ-vufifWp-WGW@`VG2(=VLwd~4H`V6ISyqX) z>QsqgmF&vF2;041zpDC2p~=rVIU8seulE8KXnek<=~oLB?@J|{8lYA?y&@=_BYFul zDK)4a8u%v5lWB(s3u9{@afU#_j^*Xm7Y4{!o#@3U8G&C0cu6#6@q5;>q#Ww@{KO!*EhNzBKKOSY#0+y191W14 zt*`3~J$NIbY(^c!Pe~>cIIgB>A2ET4U)j=OeA}CDB#{OXi%kt+(%@Cu{=&B%E6d&x zxh{rpCw5hWWcTL;H1}8}eX z0p^{yCXyddQ!p%Sy$ZDZ2yyK`jOv<*yq_=)#xGP!F?VzV=t}jI zxMu_PgnU-O+||J=#O02(37kA0=tDpwQ97)0zH4IlwlEH2rVTS_HE9m`Z`+Ep!SKXW z5=1gdt`$<$E79s|7c41Kwxp$Mc#H;ZAErtBaE_Fnr|aVO-F%g2@pye2&>qldL!l`s z%>higyR?b5fQjE;mBg^&SMGIfD#AVzYt){^3fG?KmN|gKIJ?^l3SQ?Z{a5mz*r(=C z>?@K=Z_*Hs=A_GIL}>WQ-jxZt>ft*t+C$o$2GZNBdRFc8A8W_)g2+%$PtVxc*v_s*I=W@dPrEb)B#fp7wnP zS^Q=n@eZGl5Bi1@GW1j%Hg$#A-gf%`9)A7$wYs{xib`aYJh(1`FkRW}6^sijy%_V! z`T#M3x1*(cex&aZY2_$k1polpfWe}fw)w2WaDF(xjF|%+ay8E-&=~8@+&)|-vy<#f zF;PTG*L{0?yRu?~Q_ct#?HbJ#V7eqTmoR!L*VAojK`dI+S6Ue&K zkp0E&?Mx;^=)86x+h>CA3f{T1r20zN$>o*Yt-84cpJM#Y#Dq{MfBWvLsA@x5rdxq} zgE{ZM`LXKJCsz%e?Sd;|-?Fn!fk2>zg@rd8ii671m1a#=NsI;^S$@@U2Ns;c;9*z^xFyXZfb2kT*s~m zWR9aR4x4*XXzd-7Xa?AJP(ei+TIZq*UA&8=>opPKmLa)6oHgv3kFMm?<^=}=M)-~Yr?Kpz%uLTeKtK*Xm z_R`N`H!G*YS2snSUw3@RN_kgFtjqPMN3TjL`3Lm{w&T7nf6pXu+Diah{yoT7&djMv zxpz8d@%MPm*Uh+4x~J#p{r(K^@896d>1&mvOSTZpXuu#ss2G!6kk5u z?qf}s;bz>{!Lhm1C;T%%C8D3g8VW1V)|4ZFkV-ea7#1Dr68T$qBEs+9`$>-Z>p`D3&yr$c#6Yq;nh}%S13oI`y=$ zYAkoEu@a;09C_`WS5sicn!`jTNB%PTeVt6N7#uLm3b0im)sG<4jifgmuO8k&RSA7s zrY|;1D_KlC)qI3wg`s=bHrze&_3*4{8YW7tQpGGh3PJ{^E zlK4Q)fB!7WEF4MR(|xA67RLoFDJcP4(a=62hH5C};@AlW=>VrN@7+n;uIec~!TngB zg^*T@8fhWm-3qtbLV}GpMO-FDK=ueBs@RhJ@`M|~(^VD9IEKicxBUmmR?0i1yQK%< zkYDr(bk4N~3!e{r+$sr0esT^EvE2!Y{J`hM9sY8^w4sYa0z?0-_v(YPFu=hyZI99R zHR$r0WRAUnYbYtauJR38(`2=A>!w$bNf@Jtd+~Z?!W!hu8fOCd`y}7G*9gJI;IT8+ zifrQAE^&Vf<~4}?<62q!o)pDO&NJoDKzvOzK9Ny-CySCqcYZ+K-*mqDzc~(mSl=@zCWn z`KfPaP3=CBR>mRP5PYS_ztLjb`g{vR6_bOE=f&^LNpZa-L3mh6=b6S}W|1W*&8})jFp~>D-&$Dh@5UE^!0yDxo4z)k zZGz6nG-w^lZN3Ym4Nu-E+6CplT@95PBuQw_9?X6d-sLsHI_PS`H&vwvb-G)nIOg*G zVr49k|HDUQl1%!sES@Fd4Ypx^%{7=8c5tmRL?HW~e2<$mmlopieQSIFRQmIxv*s|| zvoz_67vuEHP82#_dirIKf=|O$fStq+$k%7KDeJ6(#G@&U`|G}oGVF~|Y?W0>u2vnH zB~dH*3?+?Y$0^bPsh?^Q$34e?uaU%h4=L<{K9*=^I@q1ST!l=yzMDW74*vdTUg5O< z-U#%OBt0(12i@hB*mgq=iYl3VO;zbmEzQP;Qz3U^ZoLi}G2%EqkQslFTQWTPti|@@ zQ^1!g1Se+dI}+-0&`NAb^L*(!aKDb1LvJoE5%buizEZqdq4agHG8Yg{@dYb~7EBQ4 zphX0(t}o!m#>3dC6V`mGvLgC2L1O4^TPYm`FgD!c2cqfUxzmoWX~fcPaS;%Z*6OUy z5~afhC7pkZs?5yo$I>~SWwUh>wZ{*!PQJqRa8D;9X!yM^HD=Np=S@w3j2f`VEw(vz zB_@Xxr}>34(t%NZV9}L z(p4=SUGfbf;+?|T0HYC+p->K8T=EE^p_)P|8?F``%5AbHp`jKyo3N`CEd8y&a{FH^ z6`;Rzwy}Z~`+yvBF}3XGN7#!CD_nB(RsJb%$;j6)h|3Ak1b-A9`=mo`7`3QEPl7mZ zXOr~lFMA_b(D}J{EC9B zA?9nKld0!F=|cIaP$l=nY_Jl`s}!9~3&>Z?)el?WN)*H`X?Fb{5V0wb`~$3|E?ZpQ zuL42JtG}4QQ1@45=!O@uJY8LJyKVKS5L@n1ueY#W1*sRcZXDu4&q~j}?c&M#FhO?#S2^ zFoG#&vQ~m?E4P+i`^4M6IS-?0L0iSKY}|)|2oS_`U&r_U){iG6_)4KzOd7^1lS>In z2+>l)`Q__iegS4G2yElYvOT4tUHmf7rrQMR+}jVUap1sAAB@4mCk|V`n)=*{4x*Q9 zU-KNNclV(ZK>*m~UpQXAW4P5Xow8CwqfW_xE?<&n-w7`r@hpg{d$p-1g;gnmSmb*?08`+t%uGWf&1#yX;cHh-DK{fBI{t{?{~93RA>!=NI?0{728j zkW~`R)VTH7F8vQV4$y7#C(wlZQnLRcV!erb_%2ERt=T&hmO7rUh`!ZOIr)EpT9j0{ z+iQs5s5sAE)op&X^-BpHU?sp?>=0WLVzTi_k@=5VWJ3RsbhSmR&$d=+D@KJ7_rC?_ zkWgvC{>h!d;)lMRYhIzPRPO8o9K9D-J(nr-e?55cgC!U9yqc!Kre`dcf?usg2gaqq zl0wdik9#)oG=#c&=O5t0YZpAec;F1uW;1=A169{g>bzsoo8Z=1Igdsq1g1ZH0fWaLyNN{%u?jGD>54m^u?f%@i zyZ61f{NUG_KGoG8lF}L@K*V^|V5`#Ws&^j`Wu}LCmzmSYI z7+6PYVX7Y#4Z;e0YN)iu9}mgG;86BSqlN z6p>%(2-Hi@_qXo*Cg%3VPs8u1#(_tvnS-9?X0>c@&3)?vAHKOPf3viH_%}!zI5Bn- zDbR515M9^8YV_{sqd^FcKm(7A^((kWD@!*g7$5C74+PNrNZt2`05Y%Xfh^g?g#bb^ zr+1gez)GF5=MX`S_&5szqyRTkh(o`t!MsKdvM4_Io=+B4>7o+>FBc!McCb+#?u$q_ zj-ax>WAbotK?728Q8^U}XL%dXeZaAn-zK5T!hmP9j?|Y%;*#U1Ex(obaluSFf-20q zEzQlpZ?Nmv!UkNTIFZDc*26ek_jfqNKXVv0Yia3a{79ew^M_mtep2S=EdJMw)GN^V zS$$|2G3QVU-(FultH=T_!nVVhN}9-z1c^UsJl(^V1nj#M|_vYz8AAr z*Voq~lR{tdZ!ZoM6&3e(jDV%3D_c5Wc3@#?k)gM+8n5EM%nUCzKF{#L<>%*DN##FS z?Ftha69Q&~fviY-f)zUcvLG2nF)6yPwx}|HRC7`p;>J<%Muhdq)oW@L-vO6R!p_c4 zmG1>k!o-Bu0}{eWfjDfPmWPMYt{)eEBfivN7xlv; zLGOJwh=uW7wN1|Xp(8Q1OPNtiA2q9ZCL%m0EM;y^vw#QaUDqiyFfj(y_(%3V{Koal z-rq63!Tzd1J>;tfZw$90nyjJQhb?JR2nsdL#>NJf-<65#B_cv2h8+B)ck)*roGO^J zW(oF*8mt~*Od<$KFbD-yQ4_3;oo}DXm~%z(l<$)Ul>=BYIiKu-QJe z`fT*YfAG5odO5qThBHbrr%b8lYaJFc8V%n$ELO{Nz#CmQ`a`;51cTP>WWM0HE$W=p=6r1nzgZln zBt#$)l1+ujt$(#@alF2%%LeCYcMd^Wft#@h;8ll$?C z(((XmFo#ut0=rMKus9V>BQD#TS2j;8)$?(m&G<%K&d2%~_##yETW!rwFbr{04>$)r zNw)Ld_=TUvU1HTHCLE7;^3R`%nF%HX+oe`toz^Q!5G&A)>7&R2$BU3XI~OE6LVu+* z5Qh$jycb;mS>XK)VL`(6(m0Tq%^s`e?3G=pBn&Yy0N4){#?d*RQnizvjm8{8VV6rhOU`h;=Fi91r&}_Fe0+RZ zL~J-3z%+7+p{k5KeE}Z?W$Zd_Q z(N-R;9{eafM;<)y>c*-XjLWt()oOL_Tj@aA*o`f0|A*t_@G}H2foxGUMX@!@S6bYq z8fR9^;*Yi+=|`Jn!)vYz`PwF5Vw>{#4}#o}!w>nr?EZm=f&jXkDVC3^9r2O|ysFOm z)N_Rgq1RS;4gRqz2;^ZW^9liF;iE#;j8a$$HPO0)K#!QBPDtCJ)4g+J6&uu8#Qs3D zXMxvk#w62~Ebzc{iGGYr2O&BW>=WbtQOuU+X71)U;1|&xT^#F)rb_jYm5ogcrKCN$ z)R_H4s{uaLQQ^1PX`f&smUeF4^ZBTAFkibv`$##_6fP%HEyO|?Yv)6Wz1BxC(6lzOPv{E--LAszt#~ z8uoE&j=cOk3M+&T17QShxj$ng2im;4Kgt7uv$^>l4XD^SJ|STabE+~=aRU#qDG!7_ zWD`O5k+9&wh<$g+#^>PAj41uB;9%r_aL>vR$Ei~8j&V@a-gCHyNhnU%(O2VM8B0r* zsRTN}Q^c%!^TJuqx!iWON{rd{s@3qJCl-%?JHs4^p+kPy+D^(^R8_{O%zB305W-?H zLtco*r%x$)DrA9}-U6hBxp{dsU<6-ez?~~7^o@)0J^vs>1JvQ)N)}6EC3u-lZ7QdJ zGrqsz#8|T`cW*FuTm1x6D#JaLeSJ%+yvCouihb#xs)x;2OpqgX5$_=ldoHEMuRrs` zX=f?Kx@r0q5yF`p4jXeJ^vu#~D_z8k!Q=cP5`AjbtO*~Vu~pzkL>bl@r43IJ@F-&d z+mSMg{w)z}Fn|d?z6B>l5xvn*I?OmxJ9=B)0$Q-l?Vk(p5Y(xE01Ir-G@&bx=UFX$?F`I_vTkl z7n)=NZ~1=Tn60wvrw7d9ZiruBV${rMJY%gh>G*mi6P<8V>V?w%r|l@;#EBnye<2$N zMdQJC$q^$JkoR7T9T?c<*OsoY zk5KRT>yWz34Mojcd@s;ggllU{%;!wz5^HL`H@2xtrU8TblllbCESldlgfj~qwubGVCUibH z3tPG8d4Mw~LpXWE=L8(+H`N3saGhlT6<_~ExPHr7)A8lfs z+7Lp^N{{JW|y0vOtUHg0$2 zR7AM>@%sCN%*6w&$3$@;;`r$}t%-QgJ(0;5@qEga=n3`K2Xi$gsbul-GfEq}MVXylA!MZ<1p=Wtja^KxreOxGr-{38e(Yl|4Syva|rB}1O) znZ&ixZ^4#>7Z(=qRYBr^{HSo<8KblzrDl_aU0tz$ZI$H(P8dP*N@%E}uef0rd+>7#6?N;}0i@e>d@ zfEANe)NB#=0;ClD`#uWr@Y;W#Tk?U)`PAn^$q8!T`{Cz|%MeC5=s znVFe!if3OB86eD(^YQ8!38St#I8gBwV|xE~+^1;o3GeG;?HlOz$TkiMn+0$+8AWPq zZ%-lY&eqR%x$go{zz?G6BLX3^FxLmXv{$^ki3io`MP+|Azcud2F9qq*!R0&9=XV1I zv9#TMFVVH#{f-;{KzK-IyHy($pE$IEBrhZ{wSY`;~~GljyQ#scrq!go6j3@0FyjGHKKf|v9lJk^?fU0Z_LP*FYS zFCcnCPnnHb&#s*fMx(sfCM#r23nBJ zqA(7d|4YEMao9qbn3+`{C*Jtvp#!TCHd%33XI_*~*c9g--`fr7r#a_jAWae(FpghD z$cmUOtSz&%o>oyAy@oAIvaqwrJe!2YYEwd0P>U0w1~Ria#z=7QS{$H$w-U_9B!jdadjGWf$ocyd@L^zOlIY}DeR8>`BVPXP1a$V=@2J~Gu z8U|eYdU|^L`u649%PbHGVLR|1HylMmD6~0eeCJ(fyk-pND>PO$6cOxkWr* zV4frlQ?=k<(r1hWlwqDyxUYNSFmtqjZ=wL|KGaXyXBiSahT`AE+<@{^z(2TP1H=83 zd>U|P*iU)mGH^IzR^lHj(f%hK47l&X?yy#Cir1@nSCQ2gQ-Nh@gDB%a06PQFivPMf z0DE$pb$ONfa7~bop1Psh>M@2k!;=P$QT~6R=l_NP=f$~v2Sph-sfN0;PR;ZW`@I9q z?>qr+i+})o_CI>2k}%RHcEAn*_lBnm@^kjIRDt*Mko+@&CsX-f3fuoDodYg@fk+kP zt7~EJ>>u3FCpff989|{|E*DD?6J) zhwa)p?>z-p+t7cpWJmY9Tb1s~oAUoJGOcgMlOFngEj4+BlR(D|(89E%>-o<-*#9St z3yedWpe1|e5-9tz7IA|1CQ)2|X1}l>=Kmbd=D$0zM&dvl9TasfltT)NVb!#CS+DO6 z4uLM0f20TCF#luYa|qB@=cW%pT%oT7h^HZ9dQMXc5T&L#f~*I~7f#jc5+K4W*4+tIIrQMmj{Np@%y{~yF&{EtS& ze+xwa-H`vk&BJKGd;{z2(WDgxT%Nu6PHIY9(@MsI{f-%(+IzEkdVU`o;^8Lgs(Da=tNCOPrMZYAq*Rb z%^mGY9S8_S6x85-?5FidKwuO4FL}Xh@cC)NSl?XC$u1-&G!3#k5uSD>P5vJ;D53s8 zm6_ZE1dJaOI=5Q6d$$_8e`jhStMZ?tzd`(eI{N>bD*rD9&3oAHCObVLUzY{wx@%+h zTBbgHzrK?IkRgeJ90B1j5rC^O0N1aBS(Hx1jWh@d1Nak;BIrb9&j5VxBNq}P+*!d} z9{^w?0-%7sm|1cA{23Y1|4tx)0vUiPV&qs~qo<;?r?R^46KU2qQdjVD|M>Lq079tY zGlajH0E!F|0OVg7f4ss(`1;5@lWm;6@hpiFkiz)ouQI?o#N`6`F|kT<5O|(s5qWwV z0g2*;t(_gbg6J)<&c7(1?C7gM29e+t?UT98Ai2J$ASVwJr^a#ReXpXDFEk|?hWzW* zzcIyO)HvuwO0YNG5DBOZ)|239)Li--gU=~AL=aWLvr8WU?#c~TG z^2u(Ob@;UbGYD1~0LD7NLqPf`k9e@w*sl?#Sc<=9e%rrKIt{H&iNd6)qiv+zpt^~f zHZPKl)zK=%VML7oL>&MwIk%;C;;?Jlef(WVsqAJLoWb$_a*fTjk4EG7-@K1z0+BpL zvseoftzOv+TS^y?ru}RweRp)yWllq)#+;__t2e9~*+OW+3JMC;;4t!kld@z1Bi$p- zJ`*GQ=E$(3nr$2awq~#kOH7}&>*LCJv(>P}Cjr}Jq6V)K4&@muyF-&XM6sG^{f#Ry z{zED)SW4f5bD5nt=}R++j5Xa$)9hrnbFjDa@VAj6j98A0SfkSo%qbw-ubL@)iwA93 z?BFznZSryoV)E_fy{88MTU8hu4<6KC)YSb~RM)7!{I~uY&O~+8idKe~rsufH>|}Vq zE2a-*Ty0&%VVhr?fPaj#;YnSqJcgX;MEVF%pn4{hdvO^HR`Si3Dc);b+@#B0j7>6r z;hIU!OC`%Qs;J31L+ke2HCP=hHiaj`pj(w9G;W0Bv(RVLiVB@{X=_D|4AZbo_}gq# zE2rexDM(+IWq7%rDT%B-wSckDX08xV1tChXiPgLG?LFssmKh~XDLd}x#4GM2X}xYa3%#2AkI6^oP|q`Ou^WT;u-7qU^qvrzVC_m(eSiwhSz%NsR%H`>*$ zui_W#OPTN42FN_4>9P?n7OEsFISvx!$U0*;hpDfj^jL)F6R_D@zE-O4vRnZJO9=-$ zLkeJsfF*5`OrezU>#$DRi)3Gqh;NNPT+k&Mp9?%jK+2b*j3iNBarPU)n9@l~Wk%zy z)L{&+dS?{;hKxdHC?VUmH_+@t2Ik(R8;`b1dy_h_ zt@Cjgeo2W}nVqnyg>2NQGJ^3{ehsR@ET@{~*|Vp@H=}AF2WFz@362C$FT=Q#fa@yE zm6ou);3)<)Kc5X9+h=;2$*D?L=G5{gFEFM8?VLROdUkgh_{=N@#|%wCtwMxsJaGN&dEI^7R^Y+Z-8Zf#seqCFG4sg^k-m0ip=UajSILJ_>D%~k_*es#I|A#?hjrU3wY?;w-aeSC(JOA3d&~fUR09{ zIwxMPJ>nA~losd)RU#-0C}waiILs*d_NvdsN!5Sz^J;#lT)|TxF25&vYGX%-8W>p{ zs!PTcVWmYDkjOCIVJ&*HZE|>?w)PF8Ulh>o* zMbv!*kR6YO^#f9S7KgbSK z57(NkQA5G%ANgBoi6Xr^VkYar{1lf^pg?aw_m}+X;Dw#k#u%|3g)7+J?9I^Cd6Kak zz27%W+9k;yh54kzR!TxkEsTb!^`x0}^H)I{7La_of;jTMLWU%gh7!vexF%7yyFa*s z1cPXte*^=~{*^~d^*MS}YoC*7Z2XWc%(DK1xh_l_n`xX=4wmn*n46&1c@xfBLs^|U zsySyUGH7MVLX|RBk>vX=pODSvnkTzpNJ*o*mrVbwu#BOwCp$IxS9r24tcOU3t0+5r zC6eP^%D5_RHc73KGt;oX(3``k zir7@Gk3o^rbF?XD2McdP4(;a!W2xSD0zE7=eJ z{*X!`r7Aogg~HXz$pEWWz&9bhu>%8}-Xl_Fq$Rq~S(=yck&zLTWdO1Pu|c+TvNm_J zPU8K}t))I4jzP2uBCHtVHt81Lwk5 z{Nnsq5+aS}R!V|4FY;?Sc!OueMBOLH76ZvkD$7We#T<9U%Yk-~U;ThLMf5lR_cAPP zaWNZoGI-_1_ip48GF7JH!n&MrL)@F2VA&vfseqo65nivFpJb|(@LhW2FM8;JTjRvS zVM9lTpa2fU*e~=A%+VNKUQ5&a<@t%be!1X4+279A?3ERNiLvFsY9L=87ijH}kxTLq z6B)YUe2$oJK}Z0$o7w(@`#ky06wPm)4>WTttcVrmdFeiuFf!HGFR*_E1x4$)UEqvJ z8)~AZlsQ;akdqceef>@{)(^T#0qy^-q+VjHu6v2-FaA&ED!6zzsAT%yOvGj{fIofD z=0cyK2leF85tAFug(td~1mf|4qeVd_;=+d>QRim|Zy*OEzzf8{H?CGHCbZ4?SV8A3E_`0=PHw zgl?tQjm@+#w?k8GAchhqo?JJH*hQ%up7x zXm7q+lgP#)sx+v%D(2DN@#O?+!=J{oB0z1{Nahqb}~cw zQ-v6LFP;F}MMpvn<^jm9{+kHk(@=a8?b3rb97R=sxRcD{wM35EV@a7JK?ai(5mbea zhmxlvcar(VIRDJz8ZEUc4xSZfFSm&O@{pRQkw7Mzu9l#n9ncYWr9lDL{o^z7)j-%O3x1fSn9mIwNc ze^ectd}kvg*ys^lHt2f9wy+t_z4*Rwbq#ASV|9ihx&8A?9)sJ?x~Pj%VlkPvG7Mq! z_WbNpOBj)sUte9SdyA6jx3zu;{6zB!%a5}*9*DJWnn$~y7(mV}{7YR!U3eThsB5nA zT9dq_;-^PeSwmCo-TPWrflM3*ETVYOzY=DG#U>F$fkoFlBp{K{UP+>Yw>RS7C=s!_ zph=AjXnshU5gXM**XG%+uy(brzO5FKDGD|C2p#GzS8*7y9{gEC=ixtbz4rT!jjpyH z_jqaQ2qn>O!A=`vDw9L;4T>Vk_qtm}Xi@k{s!kFjY6knqg7)Z3({=#`N zrKxT29m7rZK0~&>b6HaWWcI2}8UNw**B@Py!*9KrI6+iFo|sRt@`g)>C@V=B#p`PX zQyMlGRIok;7~D-MSR={9bf$W6Cs;zT)_#6y`^$yqd8Ow3a9nXWbOsB3s?(IS)ouLa z&NnqwEry2nD-AO*u7l8RJG17uN+@=&Q0tGK)`!Spy|)m1P6h$%n>hB#2(aw{f#djd zWV@8~U)vF>K*Lf63g>Gu6IaL%+Z^GO2S7ii1^@iXu;z=ZqLKE1`FgVey?24~=czO_ zO+95olbe#p*d;U?PN<@!!v%U$Nz$|`Rf?uDuT|ggQphoi(@!!LzkY_K!FrPLI;RsO zQ#LRG?%S@0h-*sAdiMkryOg?&F~5}9fHX$c(X=kJR+@n&hM)p;k`|Aj!u~hTDJK-> ze}4}uKKT-2LMUM3PccR)*WDFwldczUjZwN*{`C(lp{xffwq$q2RLZ8I>7a`|*9!Xy zlp=bYMAFoJL)?OnPSe;A6pq<^jDrKmro8FTCwkUoy-qJxjfB@Qbr)!27d7W%o{JGa z7x*?iFKvIy&lSQfIy_<1w;Jw&Xd!xEmf>PGq%H^u{_I~aDY&T&qkcS~p3WAeH$Q%& ztp5^p1Y|63D*1#NS%JSux;{^V>_5|S$bd5}Hs;i;7>m2<|44bVq-^ztDgQG}px{H} z&OSa34phbdGm3!`;C-wta*#m9;cR@iGv+5i7a_nQ;?&?L6sqIT+L>S8>>#6Kp0dnV8b_V@+b#tc)vKuw+_`meQ5Mp`k*>A_i|B6_mZaXc2CUf z%YC<wsh~265IRvJw8)adYQd6D=awfaA{D)C~|<)pN%CW3e)RvOS50 zr)+k6whsyEm6IRr>#$g7$g^Nv=3a{(UyB(tpM3sy{rR8#2xu$o0=Xxhhe(sS-7u44 zxizlHB^?A+pX1$vtI=V)6fKiAqKFJoASgs&3Bvp-1J<3^^0eK4nCOvOoY8#N)u}i- zq2D{8Gy6xiYwW`$xA>sY`vnGY2fx-hhgQF+!915nH?zX@TiGSPsbB1iBXsZ?p3xcB z-U;EZ0fEUsoP+IR3*2wUS(xU91iKktPxJE*b2R@FZ62Y?>7l8d;VPbCF79M*oOql6 zynRaIF>{-W`Wy$fu?QZOZ^wIIy|bSljcx07Gw*$)HrIHor{4ITJ&xBS2PZ`cJ%Z_A zows^LeOF!Y*sZi>z4~lQLt{LAOfw>{sKAyjK4O8X&_|#6pmSuJr?8&}eqU+buUlvGZgUdrDL*tbLR?nL{$4jpZXKa#G)2%l zT`)W*r}|hq{LN^Ed+!Pj7uf+`!nemWF!i)A06+04v%b^q4sW`R_~_pI_^{&CLoE{c z-O2E5>Uvs(^ZGzU2U9^gl_=lZKzoJSwM~i07k!+5DGcQ}M$%d)ZZ8hbu{udhf-^3x zD0$urcdlyJF#(Se{@O|2YHb0S)?}616j$u@n*>dsIQ2=76LfJZo&;n?ha58+eV4N^ z{86`gH<^_xp2~s^@@k(Lr15^U(>**zQuPsJui~9_SB2jX<2>9=Wh`0k*0|Nwv9`%T zv5!0K5P3pS>D>0D?LgTa#&9o*W=XAjO)-TIt5ff#6)_z`HUyDvMn zj>3vvLW-S2n3f3Dn^~cs<=(HCw5x6#Y_}go+^`mi!&hy~M>#q3>1CmL; zb=w@`hMqF_|E zavO}V86>DtTIUOo){|%6lV{rf-fuT6=uPKq1%kntQa;apmSNSqvVY5Y8oE zOAU_JMaG9R%M>U2zt5f^;kp2{SbHB3M*wN?K6u(BC&xDRUR*tre7tM@xL+3%lr`8igMs;B*Rzi z;?fA~t_&)pY)25vAGSuap$OBiqK?+#-c~EOBrLQg%rYg(GR4g@J&f{tM$bbvLC2Kz zxu49tm(24WANj!tbJz4dH;Ozra{3yI*SrTA)^p!W=D!!|h7{|GYI6~*^W$rC<7@Nc zYP=ze6TpiWAjcOp%ynoU6M8o$6qQ?Dbip4s&{I+Pr0*m>e?#{7LkmRWki2}yq8z)j zTzdt|N)3TH_0dF)v3Ru+T<_v*u(lLfZ?JvwehJINiW+Q7BwD-3C5L=|`9}>~nU%TJ zPL_i(R-HUS?^RkFRZ--+bnvx;FtTupk_ zkPVVd;#fSj^v(tH<2HsRd(WXZBEg54L%%_GZa4Vkvv!3y@D!i?D2|zJf&|3j9GIdX zb54b_{0rZM&Xw#H-4AUR)f!^&uoHEr-bj>YL=_Wqv&_Y5An%R&jwUfQmdy_`m1bH%*x>;P==AoI^`WmAO^$}o%=byzB!>VE$DlAV^%I^+c)m=`kWtm z|Q7cS@!qP%E1W!YV;3cbg#6fxs5pc_wb*Q987y2xgBr|F%@DzIko z!XOmyQZuPW*TZ3tWT`j_l_fOgtNNVal!4OE%E8JwUMX;Z!)0ohzqAldt$+Fb_0~4+ zbWb>rqkY;2=iy2Pmcz?vn*amT zbJsR<=NEG~7IPOD(>7MVv*jiHv2HxRO}}43n_>{d24+1Ix$EG;EV1q`DHH^>bwwco*D3qj+YN?BCPJ2wN zpZKz}jKFO8wd-F2>Anr3s5r&xw|etj3jH*a zNn^h$orxJgPZMk#4Ae*LYp}{l9|zM~hw#ZsIF%_YX)|9C#E%pF01?M% ze@5RCr87L1uc6uhT&o^AsB#BNP#i53*`=_l0%Jqs<~yLvNV$5y*C@Z|Wj!0rP|&!d z`Dp+5v2Pgk`z@Qjixtt~J@3LwWJm0}SJAQ@!(mF)^sS0U50yuSA?T-8P$8(x%tD?2El zBpnltzy>X6iU8L&G>5+moL4FV;zagoIg05y3QYN+@CUK*2c2-GFsLq#)?iEq zWZD4>z72jIEPcC)nob#VliPmjQ6_hZ5|>^IIeq0fTvghdJihkc$=q0`SkEeeUhY7L z+*AK89>0<(QlR6-t_^IvxbFL>txr+E*sm%aaX0%9yhkE!57VeM2G3}+v^IHzjLz&- zY{cC`Bp>Y0V`J_)St8pCv*a#gWna@`#4_$IXheCuTbX6>@(Amx;S5yU*f1g7$R^xa zS=Wl@vDMqA5AZlM@R8DVVGXtI72rzdH@x!KzjMKA9jA_#A>$`xYvAhkTAUF9J^X|a zY6x?W5w3N*4p~c@&dJ`k-bLGBMg4AZHP7Y!VX0#JfWAQP67FO;u$R5rxq&7s@#CkI zHeO$pG-16=#^P#xy_3%NANyyvan*x8UzCLG-S~}0gRk8{()Ro`H1eZi>%oA@a8xZZp|p4m8JkT5y!=;|_!QZ7c4SC3W6J44^hy$kmaWwInAF=$=3#}YNf z92v6!4ZYw7W5owW(+4@G`5M3ZD#P<{SHr1n(>qL$&p02wIeRvZvd$L}fKDx`XAFQkR=Anz+s_`X`#q&mWynQ=XEmA6Fpxi>UL6$f1m$tA`mWFP8Mh| z`LY#C<*F<87vk{Clj8Ao?qT{2(Ua{bZ}a%a_ON}run)QP`X0Vv7hp5tYsY&vnApuv zMLK#CqS<;zXQURS2;B%!#pFdBQ`4d5`Aos)NeQV7H0Ens(Eb)ZJg>4TughI@Wr4xn zF{}spl4d+gVj^0iCM9d16jLRkYyx|z@s5yJAcJK*v6crchQsI49$tVo=_WxPCbrKC zb{T&=^+gTV)2^kLD(1jX6T3O``t=uA2Hj%Yg=FI2t8q(zv{RR4^%0&naLE>E3HE?{ zJ|jP@pZtBfMyMlcd;YiLj>6C8F;0_!&IP-E};G9{4G<~7FmR5)p;V< zIRTF=@s!8bq$>_y%<=6`D(rwt?#t~?)sm>{&0g5L6j=ss|GKpn+VQDZ%d%nX-;x8PVcl>+HDmP?i*ynYil&MYq0yHcS?P7OrCJ${Uw**$# zIFZucxRc8D^x%MH-y@%c<^5lO7^1?x`s2Ln{%BvOX&>PshFZx->DZKeFjIDw=WxPo zf7PXJ>!|!?rMpVNz3a#DujwdYGmQ^$8J>Op4)#64%{%)?!-03J+-+`#i(~QD!Oyzl zcE|$wSyLUN!g@<|!Wo096;)+P-waFl2d#z6qU*b|l~&b-6=K5Mw(9Q`-w+=W8$>ir zn_gelhPc=hHdN>)v4Q<9^87b`V$k*z%~nhHLh>GKGXku7ss<{Xf!U1B&VP}6Z}QBW z6W#nra4CvnWRclD8cJA9r+g5vCw8n%5+Q%P8{e8FOm5ENRMBQjEj*&3aCCj8X7~0SGCEHX&p7F`Xy<`o-H(kEIAh^go`O$Vo>FJ#xjSEO1VGh1q zyRqM-i9@o7*YBJkgC@QRSY#}vdAr#?l-i?s)NU9qk$XP&5OQrah3e^;hdY+cENFVH zN~*inmwf!BKXeuerO7PLYfcs}CIUrj!}~@;B9Y)(687?kXdh;i zOtl2&(1px5;hUtt;*s72VEzw`YL!ehc&f?HTs5n zM}JPQ4#!|Q611Vj*I0D!6M;^RefAh%w3-07+}|I|yj^gEpyJs0Q9w zrIP34(8^_(vzSHwMt4fMGfCdtczY-^u-{@r=}yenP(*=+9Cl1@E@po%TOAhNomcoN z30?dBbAFAktan~ew@kHF4kM{vvmjkKC6VzTIgb_NVrX}-Qqp|iFUU9^e|{o|4tbA;siAM4~V9wO2ITZ z=NFQnvU=$mpLv-ps+xvZ zar18UCartt0g~>ft&Z7bG}1cZ||z8s@x zAFH*Jtj=n`y8V+?3+e^~owGvj8u=&f>4k!G20AD0Th1h1nosBN6fl5GCoORCza#h4 zGSug+#dTrb*K8ghUA~A4*Ah6N;QbkWbp6)L!_8Jt_Ne->al!WU=X%l7XHCTvO{o1V zIwySKDKX~MyDa1C52aPv`19#eFgqAOM$V2_SU7JiK->0RJI-8xK2K9&Q4uB-i9y*@ zrqGXCo;e%a59QY$1NxKv-wd(>2mj3?K}#d@WH@ZUKW(Fg`B*yLk+LyB_zpp4`7)Y| zEw0d*QBx@9)DIqkQgYx+XYUO*h?<<_tc%|zOr~uTWS4rJm9d^!W~{u78{kmf&h&$R z($ISRRzKRd`a8{|Yc1-aNAT2wX8MAAG#!N5WXs!DHvZT+WUTY^LSTzBw7C9Q|9AQb zhREwJzqqCK{TDT-TXBLf`>3vD59`dl66&%2e{IRKC{E5!{ql zul{Tj2bRbM8-25Om|24`{rKaQ-S=EsBXJFN2^V`$6uWC5!;kNe>gTeE^6Bj&_4BHF zk?8}#5W5J1)1VeJDbe$1gzW5$R(1pisgSW%kL^SrV#aAn3y_Xsk@@@Q{_=6 zq_N?%gyflS+OHB_w*{w+1r2S<)I=T^QLKW*n6f^pb^d+nN0GrgJ+9)&Twhgc;A2&@ zJAMAUiOk+Z;O&uv`%-+K@A7g0<4|wAL%qKH@DPd2{m*5O=;7mK!m75Y9m*?R3$cRL zhNZF)$_>zyf4CGIlV+6!K0N#cl1qBGgworS12M`nF~X&0Yt4vEp;k+b+V(=cT)y+R2T_vAJwJ(exj9) zNgLMcdkD)vDnibwKHsNHw+u>mv`BY2e!qE?o0yeSyDe5+sbbOxr7tUG=BPZn0!tiXMu5q{Nv>6K`)8TUsK}6}uF*l8! z(CC4j2SwKCtGVhq%j#nNCv@U**&5^{&oz*-G+7B;@8AqZ2365I*$U8o!w)$Xqvog( znKk)wqTglu1t`Ld@7YyJrZBT3T`E|>?^B<%rE{qJ-NwixzXm1W6J}=^F8hMKDV2lu z$8O|2<1UwU?jrQvsG_Dsp9LH>Xq^pH^|e;kC|S$JpOkswSL)T=_%0BgxXG=n(Df=7 zNO!iMm?QB7zH{=h&rBbW5~N*o`#yg$^0osBt>*C^lh0Z=SKi8$ z81?YD$xo!`xc7*Pa%LEFUco4vMOcUuYN zLx$H(lY&G^UW>K}w^8G1rrb#azz3Kk;t!8X$td4b9AcTqi7Oxmg*-?hFVQq#s!>JG z1hR(f^r8Eu5ivoqa8xevl}>Qq|J@9`T#qwb4$obB93OvuE%Ascins665fu zu8pfnY(}0;@TO7Bv6Zx=(b+SqkL(8?Z{;SgAcZvng*9PW4Y7r-NafWvQqEO@{s|_Z z-Hk~oF{W(75*ff^_s7E{BTn)Z*HfB6A%>KPeNNENBvcQKYY3tQfnFKp+(m@X)m82; z_2nc#8xuY8&dqC0AXvEWTyA`u^2xjEFOZaSI1psrqKXYWC~+yDu3(>SV)vXf^WOdH z>EmPKt`RJ)4vddRQB?DT-@ZXNAKe7uu{DH51~QPRFA&6o*zME*+)L^{W*f~J+tRbL zD*FC`S)f_!#dd_gQ9r=sseLn>xc) z$4aos*f($(V6jQsdgLEe=znTMb1rtsdgm(laO=(DO=a!dQF?m->Mi`VMD%Ato4Kw8 zZtYREcX$C?pg8{E@%nH-DY#R!cKF` zBQNVH{k%1?LEnLJ6GmE}MVLLwwNy+@z-A*-w{hfXSanau*EBv{IaE#b{tV@avUj%3 z!O3#^L)5DWt)Z8QL5{^;Z5(8G`Eg4w^1~q0Ay&#HCm-(>fuY+^_dJ0X6=O)>rivz6 zoRVI>k^W28e*1i-1=U*w)%y?XF_)C@b%1YRKxearBoRiY%C0iWwkQ7x#rzV<=o0SO z^ybp^?t+Hpp@oZC*-OZKm_bZ`dlkzkEtQwahwwe0Kg5n-?^mCDz3$ps1+~8J@l{Zp zl~r3%QJbA)Y-rUxs?JgT_DL`O!`qehetf9!m&{k>q#V!#regY~Ui_wBMoYboVYx3g zs8|f(8DD8dss7xygt!HE`Z|5m!F}uP=qtUGV{B*t1Jjpnc$4*}K5L5E{bVRW%fN30 zlPsYk{y~QEn=cm$9R9fVs}nJn+7RTu1cX0mScu8o<>AI}KL-bQy#_9$P@}*S$yWpV zjX5|thI$61QPe6(K*G8(b93`ol=)y>2EC>fEO^f1bm;ThU`d9-?BcP`#Gbl#Q?1Wz zhk11P4=PSRXJOj8YA+@f7oN(`sM^3b4$sS|`Z0i?06m&y<=gf;>oU*N9yT-=JXHOT z*sn!Av|2aE=G;~H_OFFy68RICW(m9=(Mr(JO6wm(iSFC9gI|a==XZ%CLBL6x&raL!j-?2@+f@}E%kJ{mHDwyN1z^9sHgQ-uj``ZWPA~44+Ui} zGHG+KUqHm~CQ7xlZR48TH(M+!*WvqL(Z3hZdhNgbSx%^`zns|3fKVic(j}(!OBp&E z`7SwLxhC2%u*XLE7!Fu5M|D)r|5h9-a`N%8AFm4@yc^p(qvozLMj6F6cyZx{eNi9V zXee)}f|QPpL{WQxpnd<75$y%DPEG9a^HpXmRPW-<3$0$9jQN|S!E5IBThVJuX2Mzy zY$VLoTlP!*8nN9ljqH2*w(OxfQC1a5rx#?O7`e;-b07uM*dFu+pH>T=uOfQdCYOYT zd5xDdTv85sY+23E&HLGgN`_1g#f->!ZwhD$q;RVF6+6=eA|omW#xr24lrnHFK*pRh z-eNp#p6{%0^YZZs`x`MRsl$(9l%@wOTyG!**CPiN5Uho!>SEwQ0WN{H7z|V@_{)Qg zi%93>x;p8@;asv{a1s&JbP zK0$u8+REiO1pRR}G+7`C;ZzN?cA|h02sdBftWB`=4=7Zv;~i|jyZ-uIA~DyFVYEBr zhJ3YF_^N4pRRt)$Q!z6(!mJ;U=adIHQi=m!&FLPks>=%_mQ62#(lH zFF7nMS&mNI&P{)m{y4_SyNg50dwg!&Qq$MMhbaPbS%}wI*iiM_Q*POmfccy*#P-uh zAftgq_xSG9v+j((d}B%Xp_EnP;RqdqN0Yx>yl6;!;`@MhvT@KY^!od z7}k{k8u1U~4ec7b?i|~xtFJ_EN+qrR4?Osl#xmNQUK?mkGJk#O`|6Ylol58DWoj`b z^lQPRkoQ6HxBiWHq)Z@9jLw|lZ0*^xW$C8_qW(mzLxDfW`Xx}82$}X3l0^^6&kvd? z_^UH65xVA$#-aEiMtzvBL9abrlG1CjErP2~QmlSZ2!2Uns^0&ExkM;D1uw~tq&1)EIFaE4)i$(K+EsAmvT4}G>mTmmdY;w5&%%hTWmW#K{ zs6e+yg~eevp^tHqv(k79ZNB$yePQ1zsLp6uz+DZWj&WR}Ds`u#k%H=Nemb!GS%qi; zW#dH0Z1LZjw;wU|mjLm`o1cvH>BRV(Gu?tBPQE&|D@)l{pN)TnMz#4$5LnD!gt74I z#Aau1iQgH86#CtUEC*Hie;8*Q7jD^{8bq^7EO(gkK6<4LlW|=gS$_{lj(||xO#5JY*(J#(zwU5-H^Pl z-)LVL+etL~bU4l)bU^;}hRZ?|2Y6OukH0ydOf5FjR~^fnUr<2TX_xg6j-G>q12-1> zf%eVU)twFr2|?RMa3BsO-m>RPMrGCAVi4Z!$1qqi8-OAT3O<#zrwObFK2ob@72-OI zo~QpRtWYi{1N*!gL9cy@{OA%|-|@UhD6sYS=`Y>r0Iy`K6(i4!{+a}J?eM;}Y$@}QX`&yzD;SFWQT z>w}=l5u$!Z;@0_g%dD4O)1c7fJ(AqAaTZX%VHH^T+@W|*5c581v2IH!f5hcOqCjj$w3HGEYdU1~w+-sNemCHiyPG>!)uI`k(jt^0W80Lsvh=#yZ^Dy844xeo4#t zWs^9z>)nP3b5dPjAaBk!mWczt4REvdqoZXSHM)B}dySSV&%{gK3MZoGQ%2z_xwV#X_?5!gAAnn@>(tr% z+j;(F?TEnflu_6Hc-*uCJTyUQ7b#h>eT8`H1`{(cHR1j7VEX(!}G3`rZHr_W{)m+SDKQ7|4Db zc-aAOxjhCSi}R6{zqpEjt5i`vtR>MTfFVfGYh#gF{ zl%VxmsKunC_caq%>pbvoHTro0RoF|RS4tc{1a+r*JJW@F`kM}wtaGN?HHhp3Z|(Wj zf|_*)K(7evD|q68qiB6Qr$gXjc>i>-ul}_zm$Tw~dEf|o#oub>&^-Eg!CnxxDq_?J zw;koZ9_RpYCy#eP|LS1qXD~vjW&No`W10tH&EzI&`@wIB*bBSk_2%2?d0?vmuT?DM z5pJUS8lBh-+|PS?KW;7>bC5Rol<~z(xbjt;nPn2(DqDl^$AJM~YG}OPpLm@)i#u+^ zDxxUoPNlg1q{bhVSX>T7jdivVDW9DXGZPQAF;KISFS+B?Fbp%!j71659LmsRp_i+x zl7=odFjn;bFM$7$se0E^;&haQw;#<9HG{T22F_QT_f^-`*GEN0k^lhb_*8Gv#!&@C zRcP9mLY4UK#Sf9EJn)-*r!xhuwun@6T)hCXno>e4M+SO&RB8QxIZBV(>jvm1R~sIc z;)!OjX~~DpNsoA1`W_P8&XoU3fX?>I^Mgb|zSrC}rIzUvY2IbXgm7?fW@9JA`A=yS zJ&Y&62(*8(^(8*D))yt;6B?GfB%iuSM}HCGK@uIIjJB(4p}*A7KLlsr2ojaxCmYXz zJQay`L;qiZ-#Vi6y6cE7`*c_bE{?a>$8kK45%p7*S_k%~U`Hb?Oj`CX3Zz!y+pl@= z*`zL18*sVm1b)?SlZ8wi3rA7*H%6{+)2GSp%SHr_U^6?bk58%1#gQR<=!VlqB zaVI(R=g z(3Y)SE-{)%!hkNEL>c$cQ|?4mTY<<2MeU6Kp-(iYEzJeZz^iPk{9{~ z&&V??cP#TbDD6PEmb5G~^0$OnED4L7l(c+$`WRw|CDoR-pm}AP*GbrQ>)ZGAnffrI zA$q#P2QK1H9yh$l-LHS+gXxt2E}8g#@!Hj_wk*tSA7N>d9NIPxAG=CipWQ8d_?+Q4 zU4QLjmM;fxll8rN3@0NqT;BIPk}j&I*Q1CZ$c!ctqv)3qj<5F;aM{Ubj~&>T z!YNgyoXtp>t^0v4yF9j(Uh^ZCI5~qI1lM$Wwsex0K)?C~_H zJOte8`-;e1a^!KT*ND$=YONikKfcUWMQu(eo@V3aUm$6y8^QZC$GdIgtHHLljDT_8 z^H%xahVYBYisHg_mvpuM$M+1>waSe;1ZeF-uCc#HXBR#}Bsmhb8WW#70G`sDqT2WuW*%W_%?QUqk}HEvu_G9s3Y zZv~MP=ITiqi2=uu`@5X4_A~W(&6u$ z6akDi51~)jxh6i8t1HT>;aAthOvzI0 z(cxKpU4_-H27^w&a$I-l`75xA|BTOSSYDY~j-6Q^s}8BZl=HkOxVZ4vt>2ZOtKVF9 z9Bv=a99_@zazVobSN)_-$qd^`c-W3RadQ(skJONum*t?iKX$&6obJm(m1$QAj@cX; zQl@y$hyaPgSo%ZoCJ`83G~W3vn`LP2;z161^`EI(cGU&!L8jZPFe!bAv!{K z76)cRM&*Bmwf|%Z+n^4b9V{&^sbAQIli=eo^51klV%Zyqh zUpwoT9yAyHmc;dE8Xp9bH;ooOE0OO&o@!YC0fKUMhsM=6cbd9o7@DjAJKIn@uivO} zuT6z_zHT?DLMr`FLeWNCO@ysV!`7`by*{XJoG z0u|$>2Ar_-0s_a~2k+>?PAcSC+0uP&xal7-jf|^w_jj>Pbo9pvz*6IHn-0iRx_@J9 zlNV$Y@=j<`mBMkKGEj}GSVZVueWS( zFar%g4xrLrPWQ-V+_y725__J}M9Plv53}y!4jsjv=E4&LPx=I5bxK3_XaY2ujPWH7 z+V4yRACs4!ntGfEP5-KI2d@@=^D6rm6k**tNY&YV|Dh~dNU};pOF0#t$L)M-%49bf zA^N9+=WF%f#XR7h;dADAR@-IttyG?A5`q@|HyseIM0RF#<-;P&F+tK%_XqK znnwC9<&O8%gxl584a7pI#Jr3Y^!A@szC7^xc{dy*=G0oy9HJfAk8D+bgn~VF z+zT7;>=!egUfflZ;DYD@4NBa9jWee33g(e${c2nt;aK21u)Fn}$J-CfvRX%o;Q6~} z+FtlFPV~2d(^e1TEVehB_Z3d(LTxUC8<*#H$}!5>=viZqmSn~ zoIF!uRoYB77C$^QVWq#`o>1psVcfq`ZN_ZI?J$Zdn12L=C(w^)i^ zy}doIXIrKWd7LQT6$?ItzG!j^UrAb0UlFo8{nLv$7v)b23s&%~dRyHRGIhAPKutQQ zz|I^?fgSuH{VO0?dbqpudnzX^;uSnz@2W;1rbb}2M&PkTt#CpBw#QkSYH~%<>gfVk zbAda$kVcre=!4~BhH6Vn>e4vKNsVeM7VKfL{lCboVYu?!AFMVi{gpOJ*VWr7zooU7 zZ*p?a(ELC~#BuvyxvSjKe!CucecEy9t0Ps181XB-A4x9Zo(kn2!}dYp5Rbz+87>#I zsfxD{sNO`^2@@=7Urrs}b758_;*PertKIR}uU~D{*IQ>Z728Ye<~rS9Z(Fx-R(o&+ z8ZnK)E@0uqkIF|8TkEEqxjJjZLDd=KQF4CYF_<}#rvJ@JeE2a-BcE+@zw3-xYHRV| zoj98;9OMMQ1y|>+taKVqA?{iN=!t_E!t8W-QN>gx<{wF$W@ptK`!aakJV~1pI11~M z{-SoLU=-;WX~Bs|JogtVt$p23`x4G<1D}O`)_J*?uJi5w*J#<&Z)#%pkHQ&fNNb3` z(xDSg6HhVQoqvwA-^?LaS-Vj+RE)p$ILCiaHs`}b{#fO%k>ethV;h3-+;DxhJ6e=^STSrL#j3};g}4+7=!d?EcF>Oj z6MICmrl5C~)tLDw{mu`C()y*rzIMh2x<)Dv`i9KadBH!I=W?MSW=c~Ipf)XqF(*-| z788--tx(BvP+w4nhfA1)58OqOR7uJ@#=>8g@d)I0+msZk>*!(+$CM~EnGDS>zaV&KbI4lXnDUW*h9U<;AGDcfUdH3J% zi7-FPpZI7Jdo))!V70U^sm}GfSMuK!x@tuff>?}WaZ!G&NB=vTN@)#-`F6%)tGt|U zYAkV({^&-6(_m9m*L&}Sct&pI@HO2Pui#At>mK|O8B_bZ<-AV~L9jvm(G1qrT#hL)h|WKXIro-p?zxJ3HQc*I$k6MKid+ z1WdGk4G2g}(5K-cW=D%T0obuyFDX*hC^GI8+osg~8BXR`OZY8~f}Wy_i>GGNvl%hrv-)~xLBxP7m43Ey+NKHm!XC!jaYlI5 zJzIz+b^6x$9R60Tg0kc3pa*?t4%iE7@&|%xUt-Ye^d(vZ9pDJJa1uuG8>Zc-Hu*_p z5=nXzRXv8fIvj&M0{0(mHob#KBg?@MI+q@m8Raw+y4{^7VZ^97W>-7<9Kw~yC^v(a z83t3~s%n^W+}|Cqc_A}wAFgB)G0Z3MVeKe7iF1{013_=gvD~Db;=TM9UrK?jtZ>qH zNsMw1Resgi{uC0)y$V%KK(a}ev;KCL{XDKsM?IyCJ5|Cuf?frnxjklr5CiCWaq-B)M2}OP*6jWS#Svy0vSs^gw+xx~Nx4E`( z6)6^I^!#bVg^v?cW5E1=V|DNC56;O^N<8s^tb6bJ5DAboBVu0!y<=LlApgmc4awV6 zGt6#&hx{(^$={mim$}!>>Rmmg`_}HXV`P1h;=dL5XFy^jY4N2|F}QBNc(-zHc_9>o z$Rn6%Gz^nXahvxx@a67pU+WP^@#5@=Py1ci93IYjQ+rj0fGw&kBsvnM_aj(3=(UQX(Cx)YwN|iSF>C)L`40bZ*r7SHw)L+@^RPvVFW5yl`3|SGIaJ- zwNd%pd{OP&ei$OMpV|oD3V*Hgy2HGZGhkk0b9LB&fQMoeKj5~bZ&!V%WAe~0V)!IM9Pr{WSxrh#2t(LByW|Bq@ zy&F7phm{Ohr7|qN_HD)Hn-nBa(2)Q1)XJTL{K(Kvz+YN|zr*O$C$@SFhu{~?q#)z? zw?fsL85rO|&x~X>(_r zsFBTi(U|rC#6Cs;3Y2wJZ#S=;d&tmSuWGS*gX69S{uwukvKv*NlUE!du)GllKCk4B zyu!47Jkvof(sK9L^DMIga>gMxE;=|RdmfI3zq;fmmr-aCA3Mp~!oVQMRH{Ka;N-ueE;o|qN_k|DyMX2G*z_H)vr|NEKhMQWE!h3Z>_7NX~GQXn~xl@3N zVH9UEzvJ$uTBBWW9uItq0@<4MCH^Sug}(;*vIt_DzHpv4{}1hYQ^2hoB{+k>VuY#b zH)n0iBp+*I>s6zog@)lV*1k91{uBBuA+bX2yAw!C!$x$hlwjbSmK?m6kqku@B)^$B zpX}gyPQeSXM?fI`(*2+G+fotlI5QuYyXk@%wC93h3zlplRHem}U7_k#M(X)Oht!(` zN`f+dHugxf&?z<1AVI~d9o$&;n<(Qh{!Q!|5=$F37PUCE;B3&=P%LrG;x)ZdB|6#^ zkh04XtBb&X8ei2Rfv4cWUJC&1+-^4(P=ZtH&O1Z4U0%oT+grUxUHND8Yt&#c#qudj zP_M8b)bjqhoTR-6268+Clug(IVzY$;9YY6r>)xQH43LsP9{SI9OD)#=*F?C}?5iO3 z_n(5L68uYlJ#tKJRJrrz1K2ObWRP<92209UOFHMN+?N@?A!`x~r- zc}i^H2b=_KzVi^<#5&UGUUKUl;5OevLahS2-~NvPI;B}^CI4M zHW~|O2AQ5rxZxopXBn; zJKrOvcd`HRfCIIQg)2MU)!W6pH(6>|x&fIH{cFHN-l`?$QXjZQQ40ZhS`N0^>4)%@ zf44Qw9BUG-{*iwD7of?(2BApuo5^}wM8+Bkl*G;H(HFx*U6i~pAipsvdfF`7v~(e^d=NK2Y1hcyv*BFaA@dg;n(?K=s<{>r zx6!l^b7{TW2DWX@&OLbuRCjzpw4n4dN`IHKa!L@C?bIkWdO~gd0KdFIPE7kL>tCrF zFA2K4n=s4!r8LZFIUF+n0llrXwQn!T|JucE`B@C|X;QhsSOh3Vvs=0D7D#D;9TI>6 zxwH#Kf!J;l*J)>am(_*tSWuHGbVV+*pYI|Pk2cBMjxARI)nh7U zhMTySqbu3}6==1GDU+fR=JfG@*N?~jN5f@|Gxm$~?=RWUP=yBH=#BieYtEN+D&-BM znO|@qqFjA8*7m=(r)WRuj7U+-NIg|q7sLFtgbd$Vd`O9W<(pmJrUA;L zq~5HNs$|e6uZ#T3K}qndZ)>bZ(@bSu`<0Goe|BQC_5~v>*3D;GP^?fa-Dxllo^Na} zJdo`>IA_wXXb77HB`*yPYfW1TOk3~;!YYc?5?tO+utwy?->ao0IlVSl`0RfAMwPFR zUkJ%HJCmsCZK?R7L->9TMN#40=bNt8CSCF<>*}F1B{nf8riJvWZFX2m-`cL-vp3}j zsk5^8xDNKqu^BCW{1zdL+tx^^PeYIYg!fu2yta{ z$Y>ZMzqrcGlYdI%E3J}Ex|wZ{ zl(MV+@eCLTVdmi=-`pRZA=D0YEcI=)WPz$e6cw3^%K==iqn866iw&!xW8<<U$;Rb@7-9$yrlH0gQ> z7)4+&I7pIJwaWNfx2_d<+;cwusjNYMsCk zx_d>**sRc}Gmqhyzu!*=Ru~a@!fm;K?>zR}Pg zb-qI-T*%8)6=Bzkc<6opQ5u&vIzQRz5y$Kwy^r(W%!%FXV@VHa zmyy1-gqyCAwN9f^)eP@A1Dnz{R7KQxcf|Aw&ZE1E$5rE&C(RM540Z*VAg{%zMseguxg=JBgW$~NB z3ba-@)3+3|v)RXacM*+*LlJ_w_R=@F49%Vn*rBRy%?1~F=4NjP26zRoy~#V zG2G|kX)eRliu^u3n;|ehOdQaEKBfSm#6@nA9Cap;AZ4%DV3g{v_g#B0y1g(qrB{%$ z%7hF(8i@{V9498S11+WHbBX-RelM4eMabm#>Zbg)qV&I;5h%sp=<;NOwK2O43;xs6xl;Ha%OH$N X62?8Xw}1ZiYki_9t0q$+Wd`{_Y49M; literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-005.xml b/corpus/recycle-bin-view/cold/before/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a5e0604e4d2627d511f58b8f00a68dd1152f38f --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-006.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-006.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..9c340888da0a18e3b6146b1e6f79b5fa86de18bf --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-006.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Purged page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-006.png b/corpus/recycle-bin-view/cold/before/read/page-006.png new file mode 100644 index 0000000000000000000000000000000000000000..17672d0daddc886da439f128385e9fa8b1742fed GIT binary patch literal 45579 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 T4bh+fS9%qroGS;HF%A4b73_>n literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-006.xml b/corpus/recycle-bin-view/cold/before/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fe81f66a4bd2edf6b8d6988d35e194f0707e56f --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-006.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-007.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-007.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..d16fb646f9f559bdfab19eaad159d21f37ea6b16 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-007.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Restored page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-007.png b/corpus/recycle-bin-view/cold/before/read/page-007.png new file mode 100644 index 0000000000000000000000000000000000000000..1de2e727af15f857e1c486c57b97d1b2ddf923fe GIT binary patch literal 44905 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 z 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 I8T0V}1BbfwJpcdz literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-007.xml b/corpus/recycle-bin-view/cold/before/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b030e900018d0c5aca5a21df4ea2a8c56d9acb4 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-007.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/page-008.navigation.json b/corpus/recycle-bin-view/cold/before/read/page-008.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..9c340888da0a18e3b6146b1e6f79b5fa86de18bf --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-008.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Purged page (Read-Only - Recycle Bin) - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/read/page-008.png b/corpus/recycle-bin-view/cold/before/read/page-008.png new file mode 100644 index 0000000000000000000000000000000000000000..cf298cf40f14b2bf1984279f2e6b75948e12022a GIT binary patch literal 44843 zcmYhjcRbtc`#*lpDMgjqTC*r>*Di`v)E-qt>{VOrt!QnvirTC8iX`@kP>Ph;BeD02 zz4!R0=lyv+e!u^c*DJ64bzkGY?&tHmt~=51HI+yn(LMU>ufIrClodYw_1A;vfBp3j zknkVe6>2JK&cFVG9H}V0)%DHZK@j*FPvq}cdh9nZG_SRu?_Cc1EL`sqO;AxPlYaY$ zNY%~xxo)V=Us>O}2$KF{!3*W-GM@tSH!1JwDV8+RPPun$?7eH?t@MfWuV?pBA2SL# z>(7;j_s13`)}@|Y2L?w}NjpO8&vN;8^DxuGlw-aP;bd}zEMW?Qf^h?UVShfq`1%%x zyFw;ckp0b@8g4igM-9LiE!6;f);RICw*rV*rpNRwt3z7_MDAb^Bc5heCDzv2Yau8Ri7_-J^ z;rsiHLKoIi&xSSQZTv$!aP{iS9Q!XCo05+W{#!;yvW}GG#LGx+wV_X$rb`VeMtyxe zHMQ>UHSUj&V^r1p9JlD?sc2Z&xDH+`Mrkj{H*|e(cny^xQFEqt+z};&s%kopu|5hw z1&AMV7|f_%px;YJSDm+J+fTjO>G-1>Wfu)~`LX8gf#yyKzqo1h=+R~PS4Vx~_8V^K zE=m|=X44SpSF?*+0huw}8!GTRhMWcuQD<$E|8v-r^~=am;HhJO2E6>0!~k1SU;Hrd z;rEw|P5D+r!h;OzQZJJllx}9%5YkkBGgKaDu5a;cb4}QG|0}K3s1z3Pk83u(?VT@z@JesLFq1&N*|Vjg1+6># zo1@5*-1BU>>*8`#aIj-P!X++faZUjG$!l#`l;x?%yK3Y4dR=Dz#H-df2qA}VUDQZzj1n85ml#vQJ zmFupD9?c{Ly=J)#SfL3%&zW06n{hXbtZ*jJ@5tUvNJR#pUg}o`@H>Q@%G%J=6GsA@ z?A%b7#Hp&pecO?I{f|NV)1DTNSuZ&rNu7Zk+T0ws(7y;s^CUB>Z85ogSq)<FuFc z)bXk;9kJk}5l$m<7isU+^qKg2d6=OT3$Uu~^`q344i=M)0X8d=i2lLN(TJA1yC2!v z!Y{nX*B22nj2WZ&(pt}~$7Ov7vHVj1Xip^$diIw;c;-O>cWH9doqRx1!?(LuizxB; zV3~>2JW2C9m`%1oDV&Td)g;Va5zAef&*G`2%a3nk;`(Yhl2k3X=!YOpJlJh$JKE-9 z?M$l7!Tj=mYwhBEwZ~perHqN&p6hnlOiaV? zARRmcEZitG>E=Qj4zRipp?X=pw<)^OB`Jnt;x!&KgL6_o`wQ^U%p!xheM zf30`*WW4zXkx!W1X3#vqjQA0}?b?RAI`zcwb?PPw434i_xx0-Y0}cdIy}bUZTb8|<;|giQkD+7aEAD4vbkJGFFLK9TxlSD*n5CHsxRKN#HvJS z`9N{}Z?}IX8`=$xLaS!BA~4dW-_WVwe!nLu4HQ7k$k0`V1yZ*hVj@pcbtlH#S48;i zR=;8b9Jc5RM`!!H*!^?-c~Q$#%G~536F1uJ?48+l*ASuU^*LFKv$)9c6u$?GR5@9Z} z5IcdU;RU|Unt7rbOX+;e$=JuS&+L5do+dV4PhRrcS5xuiY!LJ-c4``bw64dN$;1t> z<;41HQ75U_zrf$WH5j*tekbQZw^u^Tp9rw`Tt&GED4UpRyo0M7>CC zP=ed>cjMOg?sbOQ8BLS(1sDj85>Q^@%&vZzk9f>-eGS ztr-Oi)ViV=XtvJ#bQ)AXbGAR%9ZPpG*I8#|+D}0_dMTQ7rs7 zqAe&?kXF=P$0SO12XvVv=mS`il!Nvm)HaQitK-H z>j?^y+=;p6J(YD7a1mg0IMBMW7eMTGZT?nsk%hIHka3zGV986=+MJu()D<%N%`PmW zs@V^nHnPefUevtOX;3><0g&q4Q4wYpZC%ZAG!Sks8t7Z74-=Y!FkZUv~r6f1!#7znAa%N0j&k`I0d45zM- zSQ4hPU)2_*>%%e`YJ+zD$(KGb2VWc>t*)u4C7+yHTT@%Ep$Ck#Y@3|vv4m*b2quYf zvZo#HU)Pv;QR~hGk)GBc6uU@sy*?PpEahyxCT|_B2S3Brih8Fk-u~Bve2g*KUI7j+=ib z?Xi~m<3f@R0`=!1Z&gp+i9&z*A?!4jOa2nNA~k*% zB)J#!%Yg26hdM!5eeCfib6lFtrv9(d)L+fCZEEPW=$DkxaAU6+--ct2P4R~9`iv5M zsQ<)P1yi-LfeC$8&ggDm*{ogXHjsSc2NB@tG)AODa>{#cxL$n!sSI{W1!D*WJ#E9T z1wq?gj~#~=E-{m4Muni zzG8t0#&?Hgl7fkhHN@%8Nv|v8imHA%fTRji&Y_;O4S{j~l|mS7OjBP(6GJBL4aNlJ zH9Z=33k;tpkK~`4cIT(;)fPouLELenlT_K&*k=sQ?2>o85mD7lc5OMMW5zyT^5DZV zkb|Pb0i(9>Y99K6%T8mGKioefN(d{~(c)Awa53^*%5AK_VmJf1(^tcgZ`D1H77ujI z;Q-=b#nn-Vqrk#d5By0_FxsC_m@A;`)~y|J2puxLPusXA?znmrs2#xpyytrBRIuTs zR_Pk$!M717>W|*xQPFf9IH`Lk$bf47@WL%p2^R#J#EisT=BmAvuA+5V`od_yfEmJ6 zE0Ugp3rHxCqoc+Nr>jRXs*m9msNFd?3jTT7Su6{H4powZole?u0|Chs5u)6K1$w0>4R1fs!~kDpQ$z z1kZ6woW_9-h@9bPzS!{*zdIdZMw&BHk+c` z<|b4HHdsGs27?u!h7^ysjv5BGatnVPeN>lVPZrL$V5{}+6x$ER1x~S2CsLCSo7&UW z>d4Iy>t`MAV3q@CB%vaVHw(_lFjoz$gs3!aBO|n{2WhpH!1QUEsL+p?C zpIG>TXufZ9(fBb=} z1)4&Il?|6ac&o%!WRCCW5ILx_OE{BIG4*ryjD7Q6om%w5YerNUHJG&ZgypJSoRQv9 z>UG#CChR+S#Umof2$UxE;Afc% z47*Q!EL%VbH_Z9(#Jhhw*l+Q3bEG+8GJ%7&B^ksR%aRhM*b@z(*vTKzHz}L&#!p4A z|Cn78&KxNjOXcMR_O>U&ZJX?15v zbZW7>DxT8Bn-m6rj5=z0vCfK_(Ff2f!iF)x7-f1)rTv(zZUbAMqnlHz+dnjTfO7;8 zw?7So_dOFDslBlg*S%U%5>`l!+LQ}u0)D{n%mVKH?bM~N?u3!jsVkH_(& z_`KH!rUr}+MUO+MaUfcy@U}{v|I6;zm>I7&K5g~$C(*UeMVA$`0nT7qFqZ*&}$B5N)kvg8`Pzp?W$;UIT>wb&?L9 zGsDeI?!QXIB7ZjN=*mmOnmX`{iGkGuZ9his5%2TS2x^|QnbZ*P=#kAO9pq~4(OLN! z0p-)Fqg7i^`%K3AXOrW-!d&9W-(JYQgwNf*sO`M$Q10=9?a-Y|tyV`luxei$(>Ewnh1y~h4u#6`ZYuW$z;E#u!vz9 zqgNNnB;17r4-`uhwJPV)g%Ch8TrE9AP3Ymn#3|51|}T;vF81l+XU|F(rP({NxA zkd0?Lxrlj*x7M*?piY_*!4U+Ltonb$C34#Am1*T7EG8q&pvKo1N|nqed+B-!pBA-h z#HWu`?+a5S)9~3Z48|hbKy!383Z5#S>YiGjHOK_2|EObF^yMxe8~Tai>0zh}DyZc- zmh(96?qjaBTF@KY-h>T@%iiqn=}rden7EtYH23~G79bBZ>ARHp0W5hAxd{a$^KpnM|zoLKl~9Ai<p>_Yc>d z`H0S2q4#Bc7kR2pGrD(7g-KY$9K$;1xl9^zoDA~+B^gF_BvSOb#ESRYYsswo36syx(J_zwMOvF(A{N?{|y;)3(- zuX^G6KF2DC(({kr)f?W5_eeGHvr2NbM4FTTVdB@d$9CAlLeh&KNK&A83Sc-hec2u~ zkxHrW$LOfK{s3C)EX~lwtVRiDKj+U5Le;5YkOa0#$~Rt=E6|vPcGKW-p~HyiLvi(N z*OiMVdh~i7zMXnDtC7a1SaQxWzo~W;N6GoMqRw}F zoK|4~qcNU!%uz;PU{w&nNDU_WWktZr;B&1F0W*?U3i_Unyc|cL2DAiy1V2Hr*e6tN zrbm<0`?tt0NlAPPTs4X_o;l9JXwLnRiSdw^inGQtv4m}^q&NBwFXppacH9*j?fla3 zgq&zsez#&;c#fv3>i;bGHWWxsm^u`BbNC1_OR|ETZMsr7`UNqI4cspAnQxoQ3Tg`% zyaia-i|zz%<}_uk%){+N)`8-e_$avF4awo(NI6)+0)l^jY^64@9xbq2E$YK7Z2`-U zx85qUfmHZKZ`NYV3yMUQf->rIbaFbr9 zIZ0;00L7h{Gql>Gf02G3_-QD_UR*2d!sRfvD_H(boA@C;WneRZ(6ZOE+j0P={d|wa zjm-s^GKD_Ch6XbStTg$!d<{5XceAShQW+uL?rS?fz~go9e_rCY;%vM^zd2oFb3?Mi zX)1e&*yeb+MRnM?1{$RM-$Ey493Ts^j(wJndCVjuXZ*z~FDGS>Uh9#u*v%UJ;K<2y z2>uEsuJA&#koL8tBg`k`uhv|g=~5{#EtUfD|sGn!deCCj)GJtm(Tv~_tBP;kF4vyD3POdyl1d#YHh zmf|PT1xScjW!!={N}KDu-8FZvG6um%@pz8EqQA_ZEx;Qwc5Fgn-Z4`bb3a6JzN&-nz0HFmK|H7QflARUiZCUEqmE ztq-;6&b8lcfVlcWoTiC*uhH&{s-P-tbSfIbv+@q9a30}l4CB4H%Otq#x`ybrbxx}e zFtzFnB`aRsYxDEFn}};#wVhq(u)WH)$Z@Uq!YSiNMGJS!ZpK4yhHIxF^kmHEGp~K^ z2`f9*_gcKS<7b2I0z;21>J9a2y+1fk%W61D$S6W@q=}r?05$L{7rOdKzDWvmY+>KH z@3Vg_>8+1|$&4=XdF*yn+pqgXyo)*clwrB>!vS_5fo!+q6P0^0`y=ra^<4KHf#h~_ z*|jSbe~yJ8)_rlwrL!XTH*x!M&3-AcGA(ANYwvcSp82D_g=>WH6%A+rqI4&-MFX{$ z7COr@LVwJ7!MiQ6ui5HWP-amft^>gc_hR1v80q!bQb<$4X+nWh%2Px>&NQ6>5~453 z@3}~mL3)m^4oJoF1*9=FZjJh0lMU;XqUGl*CI*!B5)5GK+kCet@Y8AXP)hVr5L&!% zqL^lrvrFyM>?q~=aV`9s`G9-u=7%~?S~3^jcxp7HqK>N*(e|WG^>HSHI?9QpfoGQq z{DZ4=VgABqR62&@S|iVYZuR`sSk^jIe9R?Xa`&ot%sKmw3F`LBKTChJc(Rr?xEUNeiy^AV{1wMcB0SxsPhor`Jjed@>RFi ze(8kp$~xDWbEf32Vj^x>vH^`Vu?BBCbE8(eT3l~UYDEgi$6X$xmJRl_G;++jEX$jbp6zd zFmyS2(RDdBaNAgChi!lSM|!iz$gf>E>9b}N9{JS}rUvO>|5#kA{QKAFyurto-rLKp z2+m-i-q{&SoB4~NPK|xe*_)u{fiVS}Q_76o$^Bb{##Y&FG`7|`hl9y>K@5ZjjZwPf z-Q9t7=9|6ZzLg>p;%Wn8iHn zKYSuc(hm3QLY}kpwR)Uo8ALmvXXWCacE}O_M6FnSIaPc52upjw*gk$PZxg3mUt@`SE05`$!FHeZr2WCnfT7slh1{F@#^nXL+Q$N4 zhtWokfu?{8-`IP=&36~AjH_KP;rrX$@bkgDMR-9(GxKaEyUMuV`D_u~mNQyuWVW%s z#}9>8pnY^mwY=zPxDJ3n*W?Ur63@9Q@jG1An*sG zU)hX$NbmDXUH#lHf6!B8|Dkxnb4{<3z*IHRc0@bIM9&Z3al9lCYJB_4TFw(N+xT(q zR!#rT99zN6Q59r9l{snc$fRt@c-@i7%nrRhB-jp0;;p$WHAIsro1P2ry6q07I-(xP z04w=ol=vJU@*c01qE18|5!PrDU|Z1VN#o#gZsY5fRZ-cie?{s5bw@viM#^yW{nu08 zQ}I7O;j+m`Nb_f|{z67iXdew+fo4rv^jIz5mZe;_@py=IOrIUJ#66HPJuh6_4!T*o z%KOx`RLUI9tP{j>)LU|2YdLm*={q*0UnJASdYVsN-VV&TiqSJ-GUZCT`dz`709Ft5 zok&&EFP5qCNBye&P>)|7w6?BPZ-;sUoxSm>h4#x#^W7l#F?1xRM5f6BC12TiV|j}E<`nR8_e=@1 zOXlZv8;?Zq`F@%k17z3+|HBfy=Cj&hJM7s38InT=h|nRHqy9QEiD@N zN0_VnAMVS2Z9Gt{&Y%2*(V_Qt)B}-C>`|r2wpo;-hg)_NAk-Q$q)xZp4*$1+{}25? zVqZVMRouHjjhEIc+4E<$KBvs`ellCP(K`^3H{H5lJ{}nQVJxWG`X1V_cdzF#4Q<@H zKTUnmKIMOa1rg*;c`Faq&b*6%JRjuy`|MX}BlD4fZ>>f`!;!&mx%^O+-Hd~ue^!~p zJ@lQzZFvFF$TvGp5$;SH#z|q<>#&S-hlS+> z{$q;u(e|$ca{sU?Tn+huE~)%I)SP_OXQkYJvgUd*QzMVxEQeb~#-JU6ydJIwPs8LH zhM0mih**;FI#`Pm)-SNFdR$UZ^7^>S%MiY6(`!RAX)Jmq1Lb*4uLJfv!-@6BRjs{N zkdBS4Mqy;qxR(S9%2fbduIg%*W{WE^hWsX=HrM+6)0)Tj6eS-PTKzV@v|M=%4A4^b zP1VwdS%GE(l_&G{8yZ-QxJ!_ca?x9YgY0-Q-`dg#q(~X0l6{u8>Lbuqa;I+wiw1)t|?6Q|P^Yw=y#YjLW5c zR60fK9OCQkH|{d0YvbZJs8w~6G1U#FL{cIGi@*xJjxG473G`X9xS3ZgDPGLUbd=*H zpm%RN^+l!FLk-<%QCf&;rAxE1$5~P~d0-{jalXzf*h|AhUcOR}JX6nL?&Y}Zq{TbE z(CW`tT;zC_0!Ml?#X~bKx?gOf?|hS73=AVPhc8fQso<5 z9i+hIk2|mUUZ?K7g1^}$-{H%T6&2`5xx`O8gfVo={&td>^nIiWB zE(5;O&Vy$2nU_bK*rEGVMC8LK0Ur;{)Ofc2TO(g=;Vf)Yiye#T;b5Um!)0ZC50~)? zdv<`TgsDqFE^evR&1RYSVw}E`kles$DAVI=UN%XLhql#CL(4&U2)#%{jmzF{fyWYL z%d}1mIz!{K)qIwm@X9L;#C}kNMRIgKOp|Fp>AM2|O)T8KQUaz++>klEYhqWUM>=pG zJpvrXD@aFkvAQj5n>p*VcS4qJ1%d1%^j$p zJ4rk3OPQ)~Rhp@4P{u=j_&J*%4V@0tCQf1emU}(AQ%u0Lji?0UtZc2I@ITzh__&#Aa z*!W^%z`HU0bKc-LJ&W<;q~R~8dZQvb$IU$UEZ>lsXJ zmV?D<#GIx=t$H(_cWf0oy{2sYFoz!!_dM1dgnE?*kcX*DJ$;iz-PS-#nCg>*h!dEh z@CJ~iCpB;(I9{=AHVFw8umRbSZQ|}bn~8;rN{9VuTy^?;-PJ0UmZfE;jlKkX_ijag z$>D5RSi*cxgXc~Elb$Ytr{dCF&OJ3mM7_(};Ahu&NsSzQR};*p?Eyb)>q%x~Cn^h` z{aQnHvKT&pu}nsU9K}bC`OZscoGdLO{+X(O7}~^uU6@t4kGpWmMWx+L>qIb{sPupJpvSGkeoFs&}ki&wy8r zu=e2WaA){6YRv8Pukkc8(s8;?q-qviRYwc}Q?CD`oyAJ!ecA^bf!?f5*yT*g!A7@q z!c5q09lYyT7IR5;kIuPNGzR!EGWT1@0-^4Eefqg*Xdi!2Jx8I$S@l9Q24-D^{TVmQ zkYYmVMVb*P>GUiBZn>5oM=nzB_Pt?Zv3Y8Da{_xAssxgd@KKgJ7d&ZGs43kof3vLl zb?mAyg=d3xEwt29eMPu1A&mFg(WP=$t*+(XzZ=^w%yPA!9o#NbfacP+iVB1L@o~HOdOu{4MWl7Eq?N@l0E1e~q_g|^kOMWk#TG3>7}Xf-U}U- zcBVcCOT4*?SFVg^YB5ilXlzkB&c&P?rJCr=h#kbIr@!^+zPhz?K6Y3EvGw3Ry4Jty zYoaDj>*EM#tgLAn*#puy?sZoeeLaQ~#z}>#TZz35m3ez^WAyNw++)b=$8|s#b)mSg z;gr1cEH{oJM(5Yz#}}!7KYqV)USDuDlHN-}X61~|geA-16Q|aOH#71aleXCezcpSb z%XzbhYFPf-^7pR~C$aah^%czSd|lp}tMfb+hdaa+m}4EN`QQ{P#?-WFZ=5#M-$qMC zcuiKz01+M&>w!J<>%j(B(5yRa|Gk}Bv--8VhTSSqfaqOlBgddOwBu8p_>v{VG-hm4Z4yh@n*U%fnxlkpfD>*rJ*T>0^am+3?ff7A7HQ5sj?^5ru@5*Y$m z<-g`}Znt}}=J<%)0Z9*90PNFly&6o;bLigl8V}`<3d}MK3&CU{lUbVyc)HwToW2gr zgji2bpty$OW>}fxKD8D;KQSU?+^yg<3@NUh5Fk(*fG8}}kkU&!z4t%M$af1}{vd)> zeM2K|)8i=7z1u{&J&C<}MvMu(trvrwPo-fXTGxvGYJ&H--RTLH-qzWmnRWYso%3I^ z(ypC|h|inZ+4QfH;tEf;1J8C?+HC6$B<@d5d9Wrl#4Ud5d7>D5C{nlQr;`^)?Ff(O zQ+;B(3v!K%9nQ%!InC#inEelW?~OX(lz!4I+>OlH$8DBNc$Hiql5(juJ$_#tetQMx zOpblW7#LpuaahMPQ2qVe?T9a;w@Pu3oCin0{B-~EA((M61vpdF$oS9%_7!J`C zUL(2Wd^&0%ulm{KI)om2G1wmRLeT4;$r<(<|HTjhQwRLQN&GOaW%o&6LjjaiPeT2IS-ZIOks`IJvJ#M&_Lq{yciNV&|_XghGV!VR3RP2~)wtJk-5 zR0Bu72j6Ul=;_WZ=ROHLZ%w7KEUtDk%n(~g&mf&@sc3kt9u5d$R)D;^wqP!oH&7{n zn~H{?pS<|S{(da;@wpqD(*14RQlVKu-~}r9awaC&U!oIKKf(*Oiq74}LAD~NnMkW% zvTKb!w3J`}*oSq4Uq1HXuY$@GX2s#KE^-1U1RK^*gw_?`V*?VE)+ z=%dxqe|yQaL?xxSp`+yzfg0~k8Yb=(cX1Jm+6wesq{W;X-O#iVs?<79*?P3;*ob^n z^Bdl3_dXW-xw!~;q9 z*EHB_wKACTY$MI|Hi7p3=4St{&}1f)v9hda8b}teXF4~$5*%>td-39Y@7L-48N_7= z)eu&cBYtZ>dC-{r$(x$J>(VM)?dVbJZ+P@dxH*X$lcdduYdpvE{4teEZ-0pB4R%c5 zGKiM)*t|bDXq7owWaX~jFHLD^{$y*jmqlFM#k*}At>>FH$m&ongE&csM#WVsqn$}d0gAXt4>ZCS3dOMcd@!uj7XKn zoQ|%s2>`H9rBQ0SfNdI{x(V83&b!`a&JD6rCTOTCv!jYnY4K>^Y<|yUWifUp!cb`& zYVO4e@o7||-@X=YN6+(J9A;{a)K`jSnb-Ga)Jp-Ls4+-7Ee+>eJp@grPD4OiHni=+ zqF9tbJB1SLRMqJ1@rHzL`?UT{!>{90f%}ueyJe>!1@Oxk`P1Pem8P?COXm(3 zG?-hXt)yA5GuX!me9Ysb*qjWkR5|e+dz1eb7)cH7M!tOZCn!8<`4~8=4U6@fe)vTZ zlrlMUM80apGJ?<3e&s}K1N~M}O3_jmy;WO$%GY8=O{15ViuUq&D08_@>au-Eh;&e% z^ZWOt71q=ToUD_74G2uQ$KR{PQA09qJsw7=`Q;!x7O%3d#^(Bq^ongflcdwIT46+N z#>q4?3((k@lzCMvOj|YOSHOxWuDaQ7pxl^|0ofVljy0^Gq#*OI9lhTg=%2j#VOhjk zKnw^h;(his-D+FbvK^ao%k~eY>w`33wJTy^-VtWmq(RnEWHh)d>Psr1e`0!OPuA5u z_`Wti1vvd^CvM)=*R!LqQgX&i#g~<1{cI!)UPC0!?j?ilLqWN@%5`2wSW!~}HfRBK z#IFHEckI!3dbC%MKM(^nEe_%P3CvMz0=`5_H^&|L|5ZYvpB8SE0mwF|{0B38D zI**Hq8Iscg2b+^^A5AxqTE;pM9&SZVi{Yl)O$C3p(tApr2ZBf_i_R^xTduSR3#Bpjdq&P$HCdIMrqFG^w? zr;8D%9G%B)4`VZv;%{C(Kj|vioTwxQc)!zeQMK4@u5lQsc6a9?CU&G!wYNv?0sSuZ zB>dKTLR`V46`4%;Yg;-74Xokc2D`pxJcXM`sA`QDVxW1$dR`ia4)i>Z^e4LG}-$g(7R1F4Geb6h!elKllYpsBQYZ~ebO1gA3lmiNh0n`c+ z{6O0`8VCU!WZw`J@UpX-yW&&47YCeoq8;Y9aW`8~!*oy07N$UvFDPddHrh40+b2}< zvFo75o4x5FpA57D1TM2b(8WY+M$J>D=~JiZ(WLr5`ieS^={tI)=0U6$yGlhxNg>%{ zt|#|#GsLR}T&>Rm-2(3cJ2j7vDyUT5+^Y6~63x^Z2F2x4fjGmR{A;@Y4#hedl-%#F@K$-_=i}_987$*5*rfWRv`h$ERPh5`Qr6l~RL};l=+GGh8q64*KP=fe-7QnI0IgF**QiCW%2MnOb?p(k$?RUN*zS76uMQ{KFDp306r|_PT5>TzAnJh$ z%pc_>X;vPUnUS5w6uMQtsCdx>t8}L1-8TW~bz7%gcCWRV8;q;U{)(psF!CI%*#)uV zGLWNiE928H>Q~Q=>{2s{2m$ryaeH&mf$yxT-&v>Nv#&MJU)yN<;iKO3%vILu@ImEP zl_5&2u9_16JzHpYbb`v;GitHNW`>)Wr+hZon-KL1H4lWj>sZ*o3v%-_wdl>5{b!`0 z8{%0{VLO?>QxiH>Oi-&zn$1Nsm1m%U%W|HeH)*BZCMYp7Zuln|fFSnxVmr&&r9X4G z&~FYep1OQjTI){IF}l0;i`tP0_hQ!NG2UO*WW2?e6yWKeJ#t>C3AODyRrZ^llvamY znNP(DCeg>`yR(1elBh)qO2%YQvbn^hXhMMw#lj(?*l=2%{*d}JEdh;P9<;Lz%Exld>2CF}leI@3-xC+w=lY^yJDIX3#Stst0^kfz!r1sHER2ilng7v zR2f;{S8%EhR$OLzx;3Q!cr#-T+dTao;9V}G7G=)$os0OrK_sM9SEfc7jbytQ~yc5!lsWbIXnxE{2XThrw>PtAGJTdxAADCuPPyWUgvW8>LnxzcZew5#6%|8;LW4*7XKw&&vnpJNcihi zCv1^Xsdb2{zPxh@o+NRxy2`Y|fo5Ej3 zqTsxy3nRzPy zVm9`u1|FMvjEVkxAG2dt>r=P3WnC%ksTZF!et$*a)e~Gk%zx9tzsbX3hcWYrYLN38 zorU;`?^0(%{W?hSuNLROZTdwezKEP7GF<_t9OKR~*bY%Fek%meUA zTxxNu_!6L$RdI@_;fGq43BD+0b75|e{wUvANXOfTQ^hW(tBv-H$McX{)CJ;z?=`|Z z|4Ev~R}M9AnM6Wu;Ry3xiHuTWbaellCB12BAbW0KjjBA1l=(I9j%tEI>D3&~@nZJN zN2xBy_0aQ#W>D93E;=oDU}ir)IH3OmLJ3yUdVDd)`Gu=fBbZ^hBWt$sIgq7<8?2Qv zf;)qOu5LvPzS6@#AMm>Q#T$O-7}^XAY?rH}Zb|-vw_k$jBokl2Q;EGEiTYSESj~+T z?VzXo#rb7PvjncyMif zElT8;tK{x|xz@Y!Bc4FwXl(wFfzVBpqCjpZgdLKSQ7S|N6;gVg3Nd&qBVw!2{+Z~V z229dK&*k?*Pwf3ndSY;Z$46S+`7+`MmU-!mwBTqh#iO@{(gMK2U=IyU!f$+@@$@+R z8i6`9Dzl6ju*vvX^uW#!B;0@u})1EJ&v znfLG<=J%|2?$%R<;AUFw^3?KQOu07HFvCW3&J+#fOxbfFq``W*QSlyE=_~SQBZfyO zm!AWrwn}Aa#`aHd0X)-!1$iztE{o$Is$zqG@HEA4KejSAaN7R$atGSFu+27WxZ@@* zR5Ki{%(y*}C~)JoN*o+i%!9{s!33V<%?4f`8HoqHBv z-Hi`&$?b>FR>`(KV5*6PK!133Tt22kSt+&e?Ej0m5&O$jN^|h453hx`Hv(-&(1@A# zcG_*{h~KE)rA40Z9Em!#ia6_pEd_UjbutojmBW5BDRoGCEr0KZ@YfqtcuxSwHeUi+ zXt%Tmo|R!S*CD4t-W&`zy__qU3qP$-llzt{7Jmj+TM^gyQ_71K4%<# z`Z;nZ|G21VCgk>Uo$=h9DRMXfR5|4~D3U}n*W(3-)@zThO1|Al&;iYxN(}f*<(QB{ zY=U>?7$851K1$M)^Nz+WzXaj}@9v*A#I1@gW4y}weXTpuFC8!Le~*zas4tHrV-31* z1?Frr@I)3?o$10UQnL0xEi8#}*}GJi7WWNQPuHhF0M6dUP3Gn4XPQR9y~H%x-CdZw zlyU*JvmED(j|}+RlS@`-y>D57dTV-+km9Ki{h=QHEmj$&V_puup)&P!uSI_+?@(V+ zmh}mIgoLnT`hOH!)ek{h9Zn}*jCU)JLnaED$9`C{Qu10wbzd@pq6-J2-W|;Qdii`) z;Q7)Bq>#(T3DQ~6A2KmIUhu?BFIBIFI8`u$D!se5f6SgTq@=flfVoy{Re}he{iUs0 zuIg@BCk#!am+-z48FY*qw${B%fA|O2q;Y`Fv46Bt(O0QTtR_zc__l{PG=-(~{#*W$ zDJdUtzFIJD=An#lmc63TxW=B4Cb_rv|Mzg6`Lpu|jPCe%+BDh?S_0x!JZ%dbm>Q+d zn5*XR_j)EC?=*Y@)#aT>usb&=u{*zz<5XZKzw1V$!km5eFwwA!h{bu&Y$6tg_%Jfw zTOH_5qAILT%XM=mPigvD$JQoNL_rPKzpoH;qli5-ZD6~8pGV4ZR3Z5sNDg4q7QE(E zs`Jo_6JN`afj#e+2I8<*(G#QwEcOY=M_tP(Jb3hdTSDsxO_<~ff2SQ`>N&~M7e|j_ zj89m+ZpcK2bJ(sr6+X`iQaK`SSM5tIeRdVIA$kRw@uyX^&^(&Q#@}tXH>riGk$^(% z>m$Gc=jKzls~;ur%~%*-?w=L6YcAw(zu);BpqKcm8;TOgJ_KzZu@8_kcNU40yK6Bz zo*~cH#@1a3Nk8d${eECK!i9>VK5}FLG1i_UmnuU{o;+s>D|?2gcG|V+)1*Hksy9B~ zXaqywU`u=IVT?Lq;ia|5qrx?$%u-WtJKXP9fBtTZd%ejfxNCO9(4kK%MMZ3&HwnEE z-PJsJZ;ZEawbLMTk{fX$WaSb2q}=^heS|E4v5xlPysZZPLq4g!8l7NXVhF)EGC5t6 zkYayHHed(y*l;{<`(Odao1I&veukM%(VSQeSEF4vJ%*{$A|hS~@>JCecMKU;y5Dom z5z@Om6(9l}oW*?~_ZqJ#0oGc>I(rL6^bPsLJyVc9Yso+zFM@dW;TY?k?}r*uERiR? z@O97Nz+ruSIOD{E>F)Gh2d)zVj50z8=#i`zVc$JwJAI$?w2%}QsWt}oaZkpe;S zn=$bOFbblfT`me1^kQz8aNF#P=|hVQ!3tG#y)Er`6k zsCcBieHS+uMpp2VjCW$}?+&40kk#ltJ4xL{AS$hdp8tTJY@Zc%cN_>Dk^PFr+2U;-AWl#)N zwxVyqhU>Qp4>d2(9h_U8@9-g4RDvnzk(yDf6JjU0pi)_NYlMjsJU%(b2yv^8-U5Cy z-g`J9KbpMWT`)t zs`9~>YsC*sQ07E+!2!SAf9xUJ{a>yIhTeI9R#^v~Ft-O*e|BBo5<(mm`euj!y`ZAn zdJU4S-P$X?7XJ5LqYKH!@wDCSs^*`zv0R#mcFefKC9B_zVDrK|Lfk(j41)b6dln&0 z+5Dg~we9`z7a$3WwE$SbjmjSG?xOn70Qcp+EmeFu*t7d=Ovll z&PceEs)@@K^u2T zfCMMOwQ+(s?!h%caCZwnhkSqc)~l(hsd-bk-n}!g|LCedea<>-uk~5F&)$a*#yxF4 z*f`@U(wlE#lX=N5K*Ym$V7$dCLON-WXm=s`jS>879SaU_G~dNfHfMn*!nkaU?@bXfD*E? z%&!{ZzlO2^oTmo$F-}?|hv_|T!9O$73p0U-gL5T}g;<=Xw0C89H&PTFu)2k0(Y{hr z@kS?$L41ixXInzt(fbNuoiTDS?Kax0u^`L6@k~UueWS;v4Iki~_n^gQ>7?BAB>FnG z0%d;JP1*xd;kK9}%S6eCI~kW1xb*AJA6vs)v4$LnAq+CtIT3KBit=x&r+*@Lx(p1P zKqV?e=&8RAgMlNyk%dD)Wf;M}ChVgTELpy-K0^QK4@X4U?Y+){0I3Kp_4wVf><^bu zLcsaw0{_B@_YrM0udm`WIxui_^op^x)VPJA(^khvD>kXtW+s-L@9=zQ!pv)}Cx*59 z*V-W5DBlmyjq1!pgy4deUm-1|G9_1;@*L$c-%Pa1Je|aUo0EBmn83?*cSjN9VVaQMamr=EiU2T+BIFr0N=s2R|A*Qy(EO+?wKBu@$$jYVj#7zUFmDJf0lD>ZqZ zn8noqx;KFbJQ7z&aPe*`i%pvF)Zz>9duKGBs#E26?vV(Ohj4(ww0{~=*Up<*VaL7~wDvmcWI4Jh#cTnab2+kG% z$-nJEY8{qaIa>eFO2Z?fzmP~T1n92uRKne$0Dnh}iG9zhsvFZVB-Vr0*)KMFU+flX z6u9d_(V8J{o18TQ(I4Tjc#%LYrv@oT)l(&lnU}%#d zKzb{nJt48%vBLhr0=A_>^y%xft)J-vJoW~^(to&UR~WJR>{X>irLZ$GfD?W*gU1z! zAXB%q4Ni1fyI7;L;!sT$X$bG1B-9zaO%xa&t=pxoi-yZ5$0EZfcfX%}F32%k zEwDJQoPB?04H0n<@GkAvZO(7^IZ(8Z%(GJdN(=c(9CA><>yFt9V=oaVrng|tAmSDE zP`$69y{|LIcwQ@u2|%5_Gf}{2|BIwCI?CkwUdAl&-^X!)Qz{chlp*GCG^=H2cW`%o z7NVIUvS3S8sv>%wTT|n@H(jhZ z!+~dgj;}QLCK_DJGXQYX-k)wA9w-=cfrTrPk!VdO5e1@m$5K*IzkBucJBZdHz3W#J zS=ecsl!;*%#A1SA;hp*M=$AFJEhPjo67L%^4-jDp+d?$p zVg_26p0llvsc8;7n9zs<#KOeXk5gKq@KX48z_TC3lBgeQF4-J4y8ku-J=rdmmD6~u zIb+Qr%OkIixoM%nj%X6U7xNb|l}qT}x&VX#B*1oP@k_sFp}|slZIU^e4WX7pUshg% z)A;Ph5%*@z+k8w**CA7_xTT}`h5$_^ua2*g3ySG#J-T_ofWGOCv1?%gS|RoC1T<&+?WLODs;J09|7DDt&?*<_V9gLB*884P%)J?4P4{rt+RGum z=RZu`c3q&X{7ee(AR8$^v0VO>DJ|KV_!Dc#9zt!d5 zheaILlkbMm%@LsEHa(CZfh~L~3rIbc4*Y=1d&?%bg2>{tQP=33HYbXe!*fJ?UUpgm zl}}SMFT{SZeqRp{*NzFmBbd0f_i^n9GSy?Z!ihP)M|qZ@Td^T@qk95D!r=ko_dS%{&@f?ib6GzNm>;L!wn2>bo*Q0Kn(xbb5 zS%;$=>}$~8?o^3sn;_pyGnjR?Z*t>BjC;Ros^8mmHqPiB?=yvyZ%{ZD|#9Ix5Q`(?H)K>5PH35|+WtX(gtiRs;sO|AYZ1C~z zq21C?GEBqlG{nIZB)4l&Nm|q5mX(#&&JH`AINy`My+qZP0Opafu^y(dsXuOKW(gmE zXP`c@_)Ui`{D4mP%-E;Z!m;jH5CsJ&%2QrZdB=sr$tDT zu^#?yS0`;pjdN6qb0qVbd@x7J0`u-*F_|!LOj7M|F-mg72fO7~5$V8k;?maz zX|N_w97aJ6uf?T+au{bFKZc?Tx-bjN2jGl}bhc)IYE_KlmiT|V>`57D>3^i87f@?tq@P>$3 z@~yG;C)$&{O<~m?r&D?sEQ3Ns?GGBAd2;zb0Y_}B1hlqW z@qw$)gH1Mw&|vaE`x51$a4)21r)sPw07-Z^(!q@a69~lx$cQW~6^uL##*#2R;_CiS z413hPljGyu_P_X(br0t@PEVa%eQ>fJfN)Fo$z3fqK-!PD7^lCD@QGN5crlEbvL+^VBug_HUAt2;l554e#Q;!IE8h7VD_N zlBj`VGzAuPd1kaok!zWajOapX%_NRuX7-;3iomil5?7+3P+qKv{g&GaBF_+fd7$ z{HcD#U8a%&j>~nT&+pRvg`5#!z+PmIa6s&ZhgI=wdue5a+v_#jy7A}BTgwlW0F0fY z$pbk|Tz=M@eVZ$dYIp)xfJq2v*#{Zw zu5l2c%Wdg5ME}l#By_}GA4tiVt;q(MZO|1$Ob9dkO#Vs}9w1BelzWZ?G^qZnQ4mmL z&=XlXrmnZpwjmdpx&WTA2GLVhm{`z0$=?0{GKm+L|5#90n*bYW z8Lt-gb6mdLB%l(Cc!CuFlkxwjqD&H++Q>%8i@BlYMxVKRw|Y914l!p?`Rkhg57t9O zQK{W-oo6xm0P|ktV98nJfXaJf3MC+y0vybLMe7BO!ChZ?>cS$awtGX%OU44|!Nujj z|LcqXkJdw>)qdS)ov9SuLcN^3Kf8F$dKKTFF{52h7NzQ`0k(Q30nuezK zR~>L_Lek%+3;$F2|4+5v|G@yd0MIwGStJ4GoZ2xy@Cz~?&Eq8-``4hc{!53Z|7p+! zl+e1MuC1%TTExy;*2l)!&;RM;|1$@|dFn*{X9eai0O20`K<=h6Py%Fa&Zi2>7MoO} zq5m~}{Qm$Y|NA+PBy_it4T#tD8(JXx%=EiejjsY>aT$M8x2M$df2zg*&^!uXLtA&o zj_G8QAVq6~_+!;sq)O(9fGfejr?3B^S7U?B3?0`~*UOym zJAYY!N|^umwf^s;XUMPlR=1#TU}UJN_fS$gol96@M}I9pkxo%B$ zf)UKgIfUydM@dN;CQgIn`05xXia}tyDh)B1`7gtCs!$pn6f|aVp*c*Vln|YOm4svy zg@6?W5rPnlwEITe5yvLv83-LIRG^9zwrivE^K$VS9RA=Ei#Uw~)k_WCfuuyls8`{& z``qwfG5@)mKNs&!&!&RWsEW*rP_a4|Bm%^W6)3(LybeZZ7h5J%h0$V~Nx<~J{xdpO zacJZ2cTW4X+tde`d*-0yGD0T1!qpnH*$A!r+lxG54Q!&z=;n<>nq}d>D}jvrwsEky z#*Tk*JR0%AvrFbsX(PYZLA-DXJtGq~=-;^IHinUrQuU+X6!AL~!w({fBUiR7_7GLP z6SExQRtnx*Jx^7I5}`7JCkWZ|O@`e|ui0DSnrOvgW_W*;u*u8M9H2?vUL z8}L^lUsFtCFjmeWe#}veQtgXx{C`CAhhI=~hw}y()Z2m)2f5;O#){^|VR|H- zFRFtGL|I4P0H{F!=;(L6ps=Dzd_GdSBz*Ls@G8YqadvwwT9dkl~&9KR3^iyAj1C2<@ zsY;UTM0OKgyeEtJ2a`P@^tgjz^qWdrQ)<)S<8sU0Z(+OF#Hyd1;hGWARE>#t)GXaE zH3eU*b13gS_1}f!!cx_q%?FO*uvU%K-VJb(@eY0H)O?gL+xR5H$o5>k@tyM??Ljb> z6>cs@M$*WX<~#>ivwPzLp@etahqr{3Fg>}m!r?3fpT>~o*F{pGY7gg%>8=jKS8 zPg4NJd*V1TL;}`i^(SjiWkmdkq((3Y<*alMZFsirr4elgD_ZKitYtC^{FoayK4<@=S)yxv)qm$-j>RODm9`*oq=>ld|upExOTp<`Bf8@;Mq?3XG@K(T0&QS z8JDKMX_=EHwdF_jrT$m?>LW;(QYex%2X` z(_I--dJ~yoIlcrIWHEGqlDrEF5r1jiv!32woR`+*LUNE0?$@G4x)Ng~$6pLp;Q_aA z$<+~VqLqKL^~YyEtG1fsAgXm;K8qFIqH7y zYN7tuSPcD$x^c>^0#jU!HRDvHWn2qtyHD3O7{)8h^UK zV!K~WV0YO=WIiirBRh=%Lg#ka#9{6F7XFg=_3NdHFpx_qDk5j+5(E6`_*js&wz&_J+8j+OU7cGVPmtBWZRI= za1+ANEccoDKAP;~sw;dPly~q?P~OBT9jlBOt90sMG%0PYq$FgWEGZ_Rm+kF|WF~7L z%1OW-e=9Xv39N}E0;2X8P#7)@B2M!NdV+;3XplLa^R=?54{+yDgncyr9CZ8+H1ZiSp-~Inm*uAR>UGn7)`JMsW&?Vvvv?ZIiyBZnd^QvftZ%=5pLQVXi~D z=-XatO|}4YRglH@Bz)p~5AB~E1GqGs11!-Q%;kzWIL(4fSn9`GUenkg%I_XRPDYhR z!Vn#UP=PS`X{IIdBd4q^T0ht&#SzQmTX!J)nR8osfhB6t7^aF8i+bQVp%3 zeSoskk)9G(7;A(HApA)|Lq@Peu1Oh1e*lD6>|buL4MK|Z5>JOeufloo8?ZcgVLXif z6+UH2XvM^5#cS@L2I*s6m46OkBkLoM3VX7N*q&r-?i)gQBPy*N8OwW=HE0 z(%K&*xmj6LGMI?#QzWB~lKNiiQPU~>SO!C4`u9Y_G_Zl!SQ)i9&$w&9S+uuRgulz*eiqA~HofdtcBH4AAh<+3v_0TRBGQDI7-VHO22!M1Guo^(& zPME&7m!J)h!@j2-QMiKu6mDu&5kRI?F4`U@1z+rL|fqfRZBt(av& znI1B$XmxY3-N6Wd#$0V+>RrUt^2J5wbFJDkMI(e)K>HQ1S&b(|X3JNio;Zn|bJ$YF znJ$z}YRxV+%w)I{zp%wg0Vuule-P@i~L7ijbtm3hl(3ZGIXz0h3U8*9r zma>}Xd4)tzd}L(%6SVHjx}zXgHD`wb(8*dBTR;U=vGIrian>xYetJ;4sKQ1ZPacA$7N(s;e!RUlo!QR^e- z@mWOmqtHjt@yzw!pda);&hbyLSomG+apzGOPVBSR+Xw#Be2UwH-<8JLR5EbgU`~sJ z3duKKvi5E|rgk1qzAA5hRlLkO;1mN2OkR4T5_ooNiPNBO{)qov_6gb4)fPtgW{q)e zJvuIdCzMkj$@Fs<$p8v!$E!{r(ssiLRn{ubn!;?2u z5j{rz`AbasqD7mnJ46qp$?#vb19hii0gE<4pcNhXQavc&)oxPFYk4l-DG<-Bc8J!ZFMBVQ6z_B_4 z{hs%BEDNv?-ehOZMjef?+ozD;Cb6YaU&bOSl(Hf(%=ngHOAR;RabfBpOlaw|*N!~( zlAjn(^bXF?i|%vNPx|Nae2GH8IDp0faP}_nT@GUSZ5N9BLoy*ftCw6c$YPde{7-rb2 z5JO6D>VXH)EQNT9{Chxu`j`va~TLN(bl97p@oJQyxn6 z*+ds{NO)^6Oi13ia?mirWBfz`eWW;&!&;Ha0Th6GthvCKq%?h^;64}RktA*kMFGbv z*Pa7uqb{7#B}Mv|FWcYqHC`D;7HTj8uL_tfj#4kn-!CSgfpF$&8-B8$;w;ntY!o6- zD9fE{*^&g2$9K9@PKOYwN= zhS`uhtEAjDWiN`GInMh$ae4@SvT}a@h7^&oRG>tr{`0T$Y!fzmJ}Pv0*f^iZC~xgE z>%4M@qGFqzQuF*m3xr8|y(w{ZT@^{S-jONdZK3awkZ-n|c3b!*wuI2z#$Ro#$$>kB z7D|Rw!x{9o!(N1#x_NG2>3QKe;WHs$flc%1V>0}TEZ$4AUHic|n*V^Cb^F3h)sq-82G23?jF>|7t z*7Nh6xTIm9JL28ULADt+ICHr$xN}zXtD)su?8m%2Y*%s z5h@`P#1tSZQx}p~L{r5@FQHo*CbqBzcnJ`_g>IG-X|a6J8SLQ2f~NtKg-%=FBr`W| z_QfaVSC*#c)I_%CCT2E3>I&17q0ym9-?u`@RW_f4$+Z10TbIZ~)h0++C;6<7^I7pl9^Ah<8||f0s#G;3BE+a5d2y`|8HI*rVA!cLYqSD( zvBHLZ+>LSCQmTU7JlYh2{x1M2M&P2(b&(5_8%T zy2*jMzvZxEw>BS0c$Qx|dh(qpb6v`Fohov>s&G0+@j1p!c*KsmMUJ~gPP#{rR$))n zpsUrRB3b5J6QVT6F)^GWiJ(`eIHgGWfSkCkL>R0L8KehYDR6nx@KQnT4dw~x)9F*+ ztU(9XJEs19#JFjtxpw*4R${Em!#pj3?h6wYhJ5f{9bK9%acya8N0HBWoq@JU4s)JXoCirWpjcN zSy70PlV<;PLD0rhNre>}x*!{$;?uIsMZS2EQP(ms{C*1#Z+Wj-Y-3yW(bfG+1$)np z&d*f4Bs~|un@YS>dD3iFZERNetXHjV%xrAT ztV_&oip^dY#l8_QfGKR7yRoX{;g-6E8U-fI(bul8X}!oO{*ap6Ttu8l&F6geW4)v9 zbFMB$*S_*~~%po%9Bfj{0L;vMZ7x`@$sh0)<&_)-BSH&Pe ziV6V1R9vsK>&(DWGNtTDtNvczw8X6+BB ztPc}YeW=@KuI8S*KJXBC4G>U@B>1Y3P@bQfOKiNZMb>|~tiL2O$v2s}pqHW=SEyw` z3C-J`6*N)i4Hr|A*K#9BkUIv82vG7~t1G=y$0(igEDO{Tf2ZxlwyRaBnZvF%Ef?aq z-}lVutHrVvPG4j{3 z2z3drvw86^n+PbzTGm0BN-Xb9{nU-aD#Oz@7$^PEavgn@7nzw9Wdqg&m-467O(Hi6m6q;t?uWs{wg7xn3W-jPXIm0m)tK6ZrjEb>v!w^+;QB zpzP1Vmx#jfNeo}5#=qSfpY9WWtkPd!;*-oiEe_u;KHe>s3$_k^JAuGK>TB|QlRDE# z)o?!GSJyk`8z^1epN$mX0tp%xqL+lM*G#?ERtE*${+iGZvX?J!Rt>gCfOkcd+f*H~ zpnc~J!}}Q-5fMpHCBP(uPvC;1$m#n^TfRSU!NBkN*e5CN#A1%F&kZsJR44LFp0utp zQUSq{<)G8vTo>*4TlgPCjg5zyhQ!!AM@1w%xxiyDRi_2Te~l`MkEv>b`x4iRpDh?; zZN)A8;{SdF(GXXb1<$-4_@&ds>=+5BTOuxyCJvbtPkx&TZk93@beUp_^nw4m{=h1B@jalNw z9R5|<#)-tn5C(_Rg(x|Oa@E^{=k6*&c3FtJVp!1C<9e?{+~4(x$Pxne1V(9$eofMF zS$4D)b_j7wcP@MU_9gtvgCCTm3VS!zDDrW!6+4d7f){x)TI@)i7dZcf`i;7^wC^#rN=Y*r)zx+}wWWib^l zcUn{T4UIESnDxuA0?d<;H~6+{KZj}eQ6}Pw9VdEJ{Fzv!y^4Tnk?Ls?>dE+&mZQ-P zXd}|Ttb%b3geOoK)DIm5C$oZSp@`Ub+hKni~By*JosMBiiyF=Zw!@n73u zk($bU;=z4pbDS#}hLG~@vOM$~`{{gu$wjS)+N4Sidk^B?s*-X=JBkr1VYc>98A9r_ zK^lKM!M!*U!Wu=D>cuoEXgoQ~m)i_H&f~c553|SvsUM@rKcbO)pIQq6d-fvT`MfY& z-l~*sQ@pv~n{2Dk%UH_v-regP40A>Nky$i#2b|im+KslTl!xyKU-3jtIO^{8{}jKosU7Y%VpY|xxnROP zd58bdz;QZ}x1|mHk;~!b*kGLA^alV&mE?}IabSx221FR27O?LtR~7;lGKYlm8Sha`2CJW1c!nmFDgJPO3DYoeXdO%QR7mj$10 z0iPFvtM{hIP4XJt(#A7U!k|_{u(bTsW_s-?Llkt ztRZxnS}(JgH^WcMG!XJRuy0tJ>je$j)j?+8x&t3tzbhsKNMT!vZT&=^tAb+&St2au7e#T7=`f@{h1k~esu?taa)HLa4hFBfFoaKj=-ZX zFKV4eD{9r9;*NQE*Gok4tYC!&}#tohnpz+BYLMh0C4KmbK4B;jLxD?4me z=hbqv-J^w(t_1pHFA@y$I&)>NE{NU?pXuYRMl8SdZE^Rj;;;?IKMV>DvS&gv#|=Fq z9#OXu`a8GiKUss$Mmf9^(c^6PSz<~@8ARkOUTHVJxUq1W9Q-C1(IFQBK{>f|tZe42 z{G~c}sySSTcEDX{-d;W)>o28VG7>rz4VUoBIPe{{pDP8+QU=5HflTz^8RPpyl!Esw zSn04j72%FmqFb829i0!98YGDeztgqNDRd6gW_FVnKP0Kz<9xQnOSdLVw4_S3#QnPV zMQd)k9XMI6C|AEL?li$ZuHY1#LZSxe~s5qG0 zZ;GTkWZRlEX7bL~+cg2|Prd&80R)4)c{9PB{boUg{cn-PAvNHT8V=M#er) zS+y5lL4|urnI0I14m*OC|5@xPt`FV;R1BrroG)K!ETda z)lnn6dA*z|1J)VMKUGDlkZ@0p9I!^~2kmSVhwsA~xe?Ss4AV{O(KeWC`k0PvH?;!t z@a}g}iw^~UplPn|oaP=aZYKL3^=18X55XQu$%&<2 z8rJ3dLY8a9+Ko{Kh`iZu$_I45_;Og{KoY$?Y4HGOp3?oh^K3;mp|Gy`HH*vTw3!79|t z%rVH%GWdf0drIKgFkD=?NlVH5BSNw)tpuILZWNKHmR@5sJcM3s1FSUMvMvt$CK{#= zjh_hTsc1+Q3G1uTQTj@xyOBw#5v53Et_dBf6032#^y;JYO3}aTF@LTXK4A6JDROj) z@A5aL4Em8AJ7Ls9VyKSv1$z{!Q6lFL8qrdHyS{NXkMjL2$*r;rA7f zm^aA!ZgB=5+4DDH4jGPbIqqtjw*>sEOR!&+8*7+~onGu%WBq{Y$_qo#;(LY(~0nJ!&DAp?a8tV)!+pl-#p%JP%YhH+0k6 zA4^9hAiFvjyUWN6JH^Pkw*>A;+N(xQCY0CLKTl2~Qm6gSMYG%vCh}!2&v^SXrVTy7 z0hA%XVgvsm2elWL`l(kw=z@e(?+a~@TfS}L{(!SGcJ+5Y!d;uCcTQmhM>I0QI!trE zt*EJUy)9-cO5NF+|Kdt14Lx6;sz1Ys7-argwEGT`5sZW4yMzHtEZ7A9X4)}2s9*%w zXGLWFxnlP8F)T}(bn@wAK&B!#)fqY>SSgK~E*g?}F2)mX&?%~GS$xWLpUTbl2DCSn zbh~*;>N>HxMOCB?#BOTE$~jLim09RtqK0&5-)l2qtD?dS$E#T z9*6IZ<_v-Okkl0@cyW}fh+R8RZS5j5dFaKdbG6P?o>FerLG?uz>+Ou9*@G4ufA^Np zZfv*M)`iN$H+P8E_59IQ*T_k6ptZyXgVBc|!oaDqYl9+d1C*UESW$XDRs?OGubk4}cBCM2>GO7q zX&>u*=$xD#>6R5J6R=ZlIB`>Mu+zRYwiTUa` z^6tsA+91Op*J|8`wU%@uSe=XRorcp=8Oc(VmVeyweM+8}%V5ux2HA~M*lLoO>Ri_Q z)XW|rLoCRR$+RYSLyEX2KJU#e%W~c!y}xCcK89N|Azu1Jvh)XK>G<*3JIsk}`I5<( z(7d9YICV{Do*W!U#vq|O6?~G%)7@fd87U4WH_<$AW|^#3O5 zLT85cw^lYDx$M=<2itc;QqVr(h)s$rc}7Sk{tGQ-ifJ^u7-ueKuy|T@sUZNC+e9n` z_1*J_$kF!af4(--#nnyFk#@QW7c*osJ&u(5rOR$L1dL&)TZhi5Y%R`dFx9kaUzmI% z{idA(zw8#`JA?1rF1<^X7VasXW8fGYPrMo7JI>o#SY0Jr@Z&(mm`Bu0{;EQw1KZD= z2E>dA)Er)J>Ftr5!U}&PAr|XjJ&)@(SdH&ac4Ul1>d}8}cp#z4yrIR4PWJIX7!xCV zjZ45srUkr$>V<8+8sCZ3a9`XjI#Es3ImWf>m5`m?XOFF_HAeeEax%?B$0lokAZ+Y)=EBq!%^khT}mk{B;#nxO6VN)z~C z>Sk-FrD*r|!;f8D-I(vrsj?gGLo}pf-JRUy%WoqnJ*`}q@rG7r>3xpKbJBzm8Czj& zUS&I*U;Tc;T7OA|_|f-deVJ_tlYal%Lfe%Sfffvj99#+mYR_c8x6t+Xf<#{&-7i$N zwd(6UPB2j3--UViOH9ctE61KU_+I%<)>w9ib0+Mg@z%-AqGDvxru%YD?+d&#rpWw z=Mt>{xNTVU#YQ$NYriZ(Y}VGfaPeN%qbnz~>&ROj3*&{KM^Kbbmo#&p0ZXGeJHP&@ z$U%;qaLJovE7Oz-4>n~ZF2Vb??_09e13_pKwb{;GbbL@+sNjwMMI?mY{CDN$nn>E^ zeaVU=JyS|cHQ1T)d{p{DREh2~$iFT7Mngahjijw4;ZL2xcGEb#O3t7W^m~xe_h(e!XB#SWzK!K1s`;!ivZn+L z(_-YuVZ4Yr@5R1)gLxH<=?21byK&dlyZIsl-VdU|VXdzj==+uGQ_Et$8CL0?g-uVE z)5iad3KjJRTpmxjK2ZGKq!t)~<}F;oCmZM(P}iYDm-F4dUJ(v6MHxJql#r z^5pSCUf=kxrIkvGElzc8R8?V;M|66)MoecJpMO2Kx|ZTLu~c!1TlY}^c1w?V86ozl zt+*Gv6XXzVe}wae4gBGaBb{3j=2v%tx<{89cl6kf&laESc@S_)Wf6`=frz5CL;`a@ zjfoCd=pP(p5FqkYWO&KOR#sZdD#UsUq(iErE6gsXqh1$aE6-SvgLw!r~UtTz>Pqo?m9ClP*k~&vX_d9%CGd2vS4JXKv1VbjJ>6{WcOs`_`TS?V@B1=gOK+A zqhLlIHo?9X+Jn;!n^S@G@DTH-F1(9yAEspt``&f((1iDS!YX2w*ISX78@_xpSR(33 zgb*Okm=N9`GLLvkmFf_b_O8x5R4g(TA6FPph7{Az*5b{y0f z(SmvvueTR%4i&9j8Z4*Gj6R}dJ?I@w@WE=n`hWL&2Ze9h1p%0@R+*{cIb@9WKnizQMM;n_TtdCdJG>T z(l=*w%OZGmrYNy6kfZ;mUBM3i9WG8n$x^(>{&K0mx+Vv?<-OoHT_s<_cVeLJb3$ft z-!<%X6fNN%&kXqm{D&YzWAD>L!mS7G^M3mkpd>xqCun}F50zs&XRLEZk5%O8{9OA4 zi!dMOe{&O3(8(A|^HsdWf)4Ja@Ng6cvvz4SGg@F?^jV0p43xdfu-f@F6Vum}HpBYG z+>{v#5f1{Qg6_;JQ2~jsr*UznMZvv>08oeOgY&4Ebt}=V?jIC4nvf%fj+lM@WDh#` znA?o~yf;oW9N15Qmv4D*8E#};CDlO{{9I(Dqt0?`|9myPlHsu~bFpR}A8<2ACk(0r zEvg@V?atIW1|B7J+{Lb3$TA>W_R_)CL@5R(1!)ERE3+VAoxWY2Iihg8Z2J89rRZnJ z2%Ix3m)#ZLt2|x5-xk*=OZxlsN2efLPtuDV+dEnLe(It;-@=3{Bl5FM<;w+mR2w6t z3ctfY)0EGWqnufnmzNvX7z}5+TP7rA($6`|gUt4=ZC`w(pym$6Ch5G!JwPLEpgnKG zyGfVzrVMSe3u`J36&wzmS30%}ZO|4msD54d)*LF~1~szE)^2Tk)7ZAVVe;w6Pdt=l z|AhB?7BvyS3+Hu$HvNBVijl>t7sO-#)~7@5@eC2+kNAo7u8ov%Io8~>uMk+r5{8EzsoL-2% zCbLZvTv89HWOCGF? zTA5E;(Gmi^eUG}uWcoIY*OLv@^1ba1?0U0dar{4&I&q6N3E$af`}UpSDz6;JkM^<^ zGbH({8=MKw8fBRTa&&T>H+5*wm^g74o&Sx02brsebNDaC5s@Utb5I5PA8D zILU*xqk^-eU#5hw-V-OHnD zs3vopn>9U@EEjS+uUuz?$eEYQT(upXwFY#>;vFnOoiCD;daw7h#!L4qP@ZNWpSqFi z*D6=-kwjY1A)iDuyzbf=N&LgUiH#U$BlhUDez<;Ltry%#&a-FFweA>^+V zUhjVPDbzul&DCj?X!0zx9=RPqIYL1!_5Lu}k>BsEo^Bx~G&ov zQODvlN+KG-ss5&MHFESw5W?}!=XY_1dTG5uL%m{l+ndFS^#?O*#2@#O1{woG>#>TA z4xQE%JrNb;SP5y_l+9u7G>^T{xREt|CNf+WjK7;?G>ve*;!f3Hj9B^*8EJ|8lbmSM zRR9OXvcSyO$tpC#fBT@EgS<==PZn{|>q3$IqMqdjvQfI`a#-@Q*>(WFQs6Bp#){s~ z1p#=*hbN^4J4jrcl|>e++C=s|I%jCGGJpr(X{1|*5Tv{1p=)RuVgNxHX=y1b z0jZ%wx@VAP2x*WKq?@5zB!=dj=RNOt&L6PveO-H9d#!b^U#x&hpXS~P4`V_yK;PqS z`FUg;4mDzSx0V++*uO9ULaPgbsDuWIm@cI@LRmt5;(> zT^#gGb2bC>o|}5;+K+;-d3~m2bz@eGk{eeAPgT({C4 zdrl(WG|A{K4YOXR0aj_0kF9!hkAp_qHz>zvoE4mF%Bx#yNGdS@TiQX&v3@ZEY<)t) zIm6TUxFQck%)84qSK26#jJj+Q8*%pb7#_O;a4mvB#E0VO4{+-VB-nR;& z$jmca;ZoICB&6i;Plk5+255jjim`p3P|j# zQ8SU4uM?ILo9|81Ht+LN9dd6SaQjYJ6|Y$bKx#=t<>2OeKP9)~H3x$t3}vDy0)n}W zbK_%)=G=+?1iWEtA;pL4dmlKHSE)DUVs!m1-ygvt6DD*62##Xf0X>VL_4C2;_`sN_ z90u$XqqH6#k!#gCm`&beI$Zqi0#lW)iBEyS15DF#ephwq_7cqPoB*F{&X$13i0}1~ ztRl%RE@g-?O=_#ix)hEo%G(oO_S45gL54whZd=!9KWaU_yfig5Qc_c6wQ>Qg_3t{K z!}kh#<=`^6?u)hlVU(;?>Y%=O&XeIHR&1&!XZ5$!7E=IGH_Elbh;HNEyNZR&`$V%i_DNTfnUuIFnmyK5h(*+HCFY{4d75Bo|^}0U{;eQMJ6sKC#Ok0y9 z{GnLZx0Ht#%SgIdYPk=+wmZ9>BI#Jg=ijL@I&~+Snv{1*@SX1EPs#&M{I8fyS&cV7 zimuDoLf}$nrsUdXS0x=Q`r+?UmTQr!bv%-s^p!F1xhhKtxs3ewik9XAKjQ=2EWby3 z!t0cN9KNnNJw45ZTE_SAbF08#B~{kl6ACbhUp+AEt>2|Q2N^wK<$=KPH54qd!a}_^ zqS35>Yc#wIMl)kSly`q$nE!PB#dGpFcO@n!W~dI+v%-D36}~a>f`tXy-Q%H^{Y1Mi z=+*@tVf01r1G&Uq&q-ao(>i(y!Sc;)P^h4r*2k;xSi&nRG^1m*Z#r$+ANr;4kW^{Y z>sUIiC?Trt7)K%$yv}efly+R9&r%uhQ6)2kxXHev6^UpvDQ=9t4dkMENOVF{_KaA) zCp>OVi^iRGWPf7K=;O`VE3=maqVfibdGBtBNZ^{ zwqqhw^2WJ_E95^HIe3g!^9ALe2(b!-+bNAVPH|@H^nTd0&iLzE^4q|MJxeCSEXm<_ z4NVbAqM1#uEhS|~WWr|f2b9vaWKd*Swu(RF?nzrk^O04T3#WLe*dNh@i-Gt=bcP_~ zjtLN#GM4>(#z_B94~cNgHm6%;>XnhF3<=*61ML<*Um&@`odA4SUXEE6w0{37RI|H)u< zPxNmq{9CrB8uk|tFRwH5EG^>**psnx&reDubqhE8xbx>Mp{{{}=eDSAC3XoWgB&1! zLDt10J~Oq~T@^#J`LneAw?|`MCer}fa5kXsurVfnK2-Q0>b{G0wJ>9H*rf;xZKW4h zh2DavYIT|=iG$5aSw!9-;2r~Klyr|%1kK+H;M?_mN1MXx8|*9zcRc0jyWR0aiq zzhUf{-m$7_0iY&``x5#>MWZ8Jfl>E5k}e37G499$)m*R*vvBtVvE)ZDC%xQ_1Hd0c zQ^hU!9(K&|0?ESbM>hj_3cr5GtBx_3wpo}NUJignG4R>fzOwC)j2H;Ng^A+;cSNXmD)UJDE;7w zy=-{3brQ8xjnuMf*&6s;Dmc8&c>HIO{}LZ)9p3v#Zj^c^Qebk;C^tv;6O4xC9Id** z-|)Tfv9_4|s`dT@o=Ecxx|wKV_UDtr)C=O&Gvd@T%1W~!&vDSrk5AezY1S!*Oxzw82CeYlM0leJ z0wufezXcl?dFzyD&#$4Y1f6z7tzr~t^g~s}*vMa!7{U=3S$S+84Pl8z?#O+eMQZE! z`5y4y@)<$+0IEldPE0z4*Fo~hMee%bB!X#(De~yrX zrlT7OEv^r-2E7BXq8Sey4jTuhw{$+v)*-Fh=U8oCz1Rxv0qgY?v#|D=hj*KW-z67j zM1HotB=!rauIM|JDZTJtB7w*Xn0ROs|F;YPCbhSyoBNcDTX!hwD1p0|{f`k|4r(I4 zK1WY+pptF?Di1TyYTGHA*Lpp8bm^QG({0 z%E0Z@4GYB$-m6-PLr3LDM|pncLT9#bwqgYojC0{Aryng-Hb<4UGlpT5hGG4wf#P%W z6U`NuOL+7xJ_v$bi9Oy95DvLGdum^5eTw4>t$#;3YF;8cjcrKwv(3m&Zt%k6W?|3+ zT{?hnmQ57@3Mx^*aCDXmbX*!&m7iZMJ;kno1klb-Em)xhHq$10%f7&cE?0nBbGq5+Q2_* z<*NwqOKt^$-==Thh0w(>sps5X<`(%!CLKSj0iWNiz5J=nMWC@7=(*ofSa*Z@qpXIz=4Dw@fDA<49UP1%G( zbcY=DDT=76zSoI=)Zw>9_^yz8gCmO%u{~S*)fp4Wml?U+)VP`jGJOKxZ2WqAXxaAI zWYL&cJH%D9G4r`U6Y-MwIIzv&l)%&yazaKjR}n zoo?@L2g{t=^}767(uK#9OvcRGFRmG-2q@J*kPQ)1^q|sS+*shF;hLo~#*6b$W*^`%q_pNaW38a^x#Y%}=)0@(PGBipT!K<7I9`a7N^Vcv@pt!bH ze~53~g~YseiiUPBj31~JVqGPwH|6pAGvbC+8KZHk3bxpN1D&oISq)jTb_}Y>{>bXAk8slWf0HwTKFjHV@{Ad011mutN1G1X-NMzd*SaL~`oxDZqZ2jgd89w=wIp)V2@j4OzmRSz(~gVriOCwc z%Ax1EbAI#aqi{T4X!5A~c3Jji1JzEa!!KWl+@Tfe?rl0HESWWr;FH?xMN#1y^CaBq znvQRHKn!3#b?6o?Wp3_Hx-Mwi;Jjc4d8D$+%i+4-X+>!({^#pf+YzE*o^jvsy^rGq zcQeYJ_R_bn%c!#HKD@S1&us4-(cUVtX9Ito#=lJIi{#ry-28}jIDkijbRX@WE9nJ z5YulE)dze#VB~BsvH-o9GrGuvqA-&D@rs^TIt!o{>T0~~R^5NKH2w>0ZQ)~A7WIfC zWJK7DHMUU?4rYiv*S)~zZ;yL3K`YYtZL61O0gK}ZSmfC-!`S!>q%FBra<&kyw7aPl z3?#jlO#dV9>!P8GiKJnb2wfPKj+zd4U+~|4)d4(2txGC>JMX=hc$~Cmd)*`JoZf;; zrmM@Y96tm_b}1xlAA4t@&H%Ce*KA#_hX-WEw zo$gH5j3g6{m0_|sf;X8S1Z%$vrTByo^n6$90Bl#*(6#Z_&App(Jl(z+Vw}1lC~EN-*FiOdK|uqgQ#n)mL$7-y}jl-KpWd3A|(`+uj-_0}z=E;#3Cw=2$ZZg`PVN$v&n8Uabcl1ivbv zeVOKkCaW428ZxV4nIK*AKTLE)g@&BU86Dn4dzdhj zwBXTAB(K&x;xh;2{`o|cd#7M2Xy^qb%1dQ%)5UcM<@ye@YvIR9huSO8cGF4R_7Tng z>nuRb>;klN$M`xo@YJ;MDtOAE-V4T&d2bB5wrJd2CtJ3nAcy5prY!&t5SHAO|Iq|| zs#w|f7H54gxN`)1i?-2eD`aKS!%R9`%2aqXDjG+w*~bu2ULA)(@(WzfS3}3lAUAEp z8JAFvJ}Qm||Cd=Ltqn)tAvaU``+?<4)1*C}Z7#zcPPS{Q9ldzZzI2i`N(PoK*CXZ+ z)jlLDdrL!%Tb!*ISs$Noe92t2G?CWi>-9H}K8HTNNcrnU)w#>(r_%Ne>u+gjXNHoo zbw%zqdA_mjD_9GMQK=;-0p-DS{2Bf6m&v_Oc}u{iFMbJC98?-P9!|xoD(%76sye>G zZ-qsQo*$S^?WL|Br&#W!EF;sWZ6e>*_q|yto|fFKuge?=2NGMpi6tq2*=C(p2Bxz^ zW`Ne7Z&8~_twNIDmQPkgj$L&(tKP61jpf>^;gtQ{^&_39t zK5~jG$&|72{~`XWG2ddXBZTPZ~fwgWFU?{O;igY#(d3jd&(HFFpMI4C#X$r+p6aP9ui5c-IjqPU% zBGMMOL_BV&%N>34$1fpd=^_@uKo4Jv z53HMJrA7}<P>8~cd*r(*u)vXcsq9J+SR@@FZZ&EuyBeC zbZT(XEA|Q~Hw?&NEg563?&m9>5viV$Xz0iN?KuP>7-_R(VBH8?ck83}XKMzWZvxQE zBMU&^(B=ntXPReZ09-8W;V~gLzRG~HhQcRZH<1^Y-vc(8$k0OEnJk=$B@In&D}H5> zf4opQ**j`bn9=yorKnEoU9e9w08`NxZAk4vFAzuESbt?9?T{;FAE zc~Gn{>s<2w&B(l+Zrj*5_iF8)R(PYA+p=@A|7^)QGn+S>@?=ak**1eG~r)f3ppKnbHB~2P_rAlRpbXetA1kd9T>E~~k=}vs809RB1UsJ%r)K4oSPMk^# zk9nZS1kNyf%_Mip65sbJiGp61g1I+UZ7@t%90J+``b-W46n@*oRs4PNnd5*c zZkC2RI3I$pEbIO^XhP~iXC>@0K6hmizt!2(3wW?!GdYdXR$O@xji>w+!EtHHd}^}g zQA3X-s&sXWELg>*#I&}|2eq5%SUM|TQw6_)S?2luqsvqkf|MbgdO+9Fk#k2%tWtdb z)xa9-Z4M@g2BTTRFXxw-L{BN@21I^!3+)S(uBa5R5#OjC26*$OOe z1!3xekG#p?q2J3H+c#`IJIXa@#m^54U%T=z-AVrtO`g%-0?f*@0S2We)R|VoIF~g4 zRH%Ojn+iAi)VkYE>nA7-Z&nD+L^D9mgD4XMMi@S3tf1a>?6`W)j;_VWKDaovFUGev zk(A+>aT-dyjRYTl9k9-GptSNe7Me3YYD`@){1o>PTP#VdrMLdvZ11K1`b+&|Y72Wt zLnkUjCmLNFvXsiBykcZrqPMp19u%;ic{eGoJjZ+-a>QdXr-jyKUkh7!BO*ULo0!2y_3bi-ANaR&;)N{q+!6$S+TD_ZCK?u#UYsN+LU`MmYF+@#xzF^yc&tIuWCLq+a|% zod$Fw?Gps9k$|%M$&BtfrPq=)(4hQdAX@LS`D* z=*XVanFy?93VT@iNLdHS6I%40iq>GJ?fptjhethNQ^3KK<8JK?DL#HJ%|ABp`>_L$ zVT|Y~@C%zi4n`%&O&025c5~5q^!NLZ?y>6X9y32#SCQcP^N)f*BsNg?LHCH0Pq-u# z(fV9+CTq$sK7*J(Q~9->IB~-s53e&P%;#sUrd|6r%LPiyyIVnQ$OuQEY-7Wto)@d*ix!_6kR zGblbIe3ebTi8+K=4PgLKOUj}d@ktrTdSQowIWwGiD%>TH5laRnhvPS06;x%# zq5cXt%?W#%Ai?4**j1r@kgqKE@3L-dW>6(olaZSS*h9jLDO*7{#QD#PxKuc`zC8hR zU2ZxT0JuQU_}?1r$OhJtCM;M6UhQwJ#B0u#yi~PS%3gh=5I~6o=&nvT0J}J^X6Ru_ z+M@DN7{f;jEw%MC2D-EQzug)4C3x4I3hN9U6uM+vUJ)4g5?<3pM|^lL8o78 zG|vTRd3uOxijN{R$M3q11rNTjA^*%ZyR_=9=0c5nuQgeF9dv)NEX7dpT+rWtmfUU~ zi@e}ax1E*KM=>D{JjM$<@i$9>bnpkde~-W7J{4p(q$2pOMM&QA5qS#i8l3uKK+ic8 zPf;mgc2xif`p5nan}ZU2&Kf(z4tt3zN0Bl<#X6?1aU0-EB13F)cz?8_t$sp(l)}|l zcQy%{(88op-{?r+r;#iXTF<(})-lD%7*5FhKk_N$4@&ssBrxuX#*yVIW5j+SB*YWw m1j(BasE@Ez3Ab?FKJ9ae%e#B&(2MqPexjzVrBtH;3jKdE{`cMh literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/cold/before/read/page-008.xml b/corpus/recycle-bin-view/cold/before/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..b4b88881bde71a256989378767de550cf8bf3910 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/recycle-bin-view/cold/before/read/payloads.json b/corpus/recycle-bin-view/cold/before/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/recycle-bin-view/cold/before/run.json b/corpus/recycle-bin-view/cold/before/run.json new file mode 100644 index 0000000000000000000000000000000000000000..df7b142efb06b6bb7cd56c7d733ccd255d1eb38f --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-notebook-features/recycle-export/before", + "expected_pages": -1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/recycle-bin-view/cold/before/scripts/cold.ps1 b/corpus/recycle-bin-view/cold/before/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/recycle-bin-view/cold/before/scripts/read.ps1 b/corpus/recycle-bin-view/cold/before/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/recycle-bin-view/cold/before/source.json b/corpus/recycle-bin-view/cold/before/source.json new file mode 100644 index 0000000000000000000000000000000000000000..725feee3fcc9f2e9b9a236f07d6731899f794f53 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/source.json @@ -0,0 +1,56 @@ +[ + { + "path": "New Section 1.one", + "bytes": 6024, + "sha256": "6510443f5eaac454107799ce05166f1481397a2ade00105a810a4922f1a1d1a5", + "mtime_ns": 1790878536381575386 + }, + { + "path": "OneNote_RecycleBin/Back.one", + "bytes": 6072, + "sha256": "7456ebd650898521e31b0c575e95d9247c7d3513dac736c0fd260996840089f4", + "mtime_ns": 1790878536887022715 + }, + { + "path": "OneNote_RecycleBin/Copied.one", + "bytes": 6072, + "sha256": "32d49b0a546b63f785927beab2c2322e7a099114a7a14df20387afe08de7202d", + "mtime_ns": 1790878536938612540 + }, + { + "path": "OneNote_RecycleBin/Emptied.one", + "bytes": 6120, + "sha256": "f9023245ad7907bfe5146a8af40e8a2898b7ced31eb68d8da931986c3bd61b62", + "mtime_ns": 1790878537062700352 + }, + { + "path": "OneNote_RecycleBin/OneNote_DeletedPages.one", + "bytes": 10816, + "sha256": "1290e82b1827fd302cd19fe007eff5aef8d7d9ed577d830bdb664a495249b3fb", + "mtime_ns": 1790878536875973134 + }, + { + "path": "OneNote_RecycleBin/Open Notebook.onetoc2", + "bytes": 5880, + "sha256": "95df8154a57d6d202e75fa2c9514ab89ee7bb232ffc2865e24c216c6ebb65b07", + "mtime_ns": 1790878537079049557 + }, + { + "path": "OneNote_RecycleBin/Purged.one", + "bytes": 6072, + "sha256": "0f62253a5ef9b41cfbb8246dc97e8d1968789d5a1e035b9f48b803d8b7a8b44e", + "mtime_ns": 1790878536980735991 + }, + { + "path": "OneNote_RecycleBin/Restored.one", + "bytes": 6120, + "sha256": "7d1487ed8c558adc48ffc878c1d9f73bc1ff00fa03e71671d478cc45bfe9a6e9", + "mtime_ns": 1790878537021413776 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 10656, + "sha256": "812827df8f4cb6d2425db9453ee2b93e4b600b41c858c38d28bc9b5e879c00f2", + "mtime_ns": 1790878537095054096 + } +] diff --git a/corpus/recycle-bin-view/cold/before/teardown.json b/corpus/recycle-bin-view/cold/before/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/recycle-bin-view/cold/before/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/rtl-page/README.md b/corpus/rtl-page/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b330bcca7df443f8b46e76987c8f0f34cfcb784d --- /dev/null +++ b/corpus/rtl-page/README.md @@ -0,0 +1,19 @@ +# Editing a right-to-left page + +OneNote 2010 keeps a right-to-left page's positions in the same left-to-right frame +as any page, from a margin origin that `corpus/m6/native-page-direction-03` stores at +x 10763.25: native XML x is stored x minus the origin minus 36. It opens the page +scrolled to the right end of its content and keeps the view's right edge when the +window resizes. A click on blank page puts an outline's left edge on the grid +anchored at the margin origin, as on any page; only an outline laid out wider than +its stored width keeps its right edge. A new drawing stores page-frame strokes with +a zero offset (Win7 lab, 2026-10-01). + +`candidate/` is the output of `crates/canvas/tests/rtl_page.rs` on that page through +the page view: it opens at the drawings' right edge, a click and typing add an outline, +a pen stroke adds a drawing, and a header drag moves the positioned outline two grid +columns right, each published as a revision. `cold/` is a fresh OneNote 2010 read of +it: the new outline at x 126, the moved one at 180, the stroke where the pen went. +`tools/test_rtl_page.py` checks this without a VM. Regenerate with +`SNOWBOUND_RTL_EXPORT` set to a new absolute directory while running the test, then +cold-open it with `tools/native_runner.py OUTPUT COLD --expected-pages 1 --collect-notebook --screenshots`. diff --git a/corpus/rtl-page/candidate/Open Notebook.onetoc2 b/corpus/rtl-page/candidate/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..1671a68b860a5a00e6f6eba976a3e677c5c37834 GIT binary patch literal 1612 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 GPw{_>cl#s& literal 0 HcmV?d00001 diff --git a/corpus/rtl-page/cold/commands.jsonl b/corpus/rtl-page/cold/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..afdfd1bb8d034dc5f0ac3a5f63232a6ad3405926 --- /dev/null +++ b/corpus/rtl-page/cold/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-BE5B6549 -ExpectedPages 1 -Pdf -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/rtl-page/cold/machine.json b/corpus/rtl-page/cold/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..e8dcb7cdf9954aef9eefd6d431bbeb503694f500 --- /dev/null +++ b/corpus/rtl-page/cold/machine.json @@ -0,0 +1 @@ +{"name": "m6-be5b6549", "hostname": "ONE-M6-BE5B6549"} diff --git a/corpus/rtl-page/cold/notebook/Open Notebook.onetoc2 b/corpus/rtl-page/cold/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..f9d1f722b71acd7a4e3149b56d62fd6a98b3d5b2 GIT binary patch literal 3780 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 Hp5p%i%%J^v literal 0 HcmV?d00001 diff --git a/corpus/rtl-page/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/rtl-page/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/rtl-page/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/rtl-page/cold/read/environment.json b/corpus/rtl-page/cold/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..a69d14102ae21a47278df6da17ac0d2010efcc46 --- /dev/null +++ b/corpus/rtl-page/cold/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-BE5B6549", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/rtl-page/cold/read/hierarchy.xml b/corpus/rtl-page/cold/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..e601bcb6d42cb752c7b58396d16193b7cec25bf6 --- /dev/null +++ b/corpus/rtl-page/cold/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/rtl-page/cold/read/page-000.navigation.json b/corpus/rtl-page/cold/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..2f394e7eaf1defcfe3e06e321b5af76be4f84054 --- /dev/null +++ b/corpus/rtl-page/cold/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/rtl-page/cold/read/page-000.png b/corpus/rtl-page/cold/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..974f402667fc6bdbab743137c45686a0b08cd9b3 GIT binary patch literal 43273 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 z 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 Zy@k~J_J~jXK&S6ws3>U2f0eV0{68w9U~vEd literal 0 HcmV?d00001 diff --git a/corpus/rtl-page/cold/read/page-000.xml b/corpus/rtl-page/cold/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f33d928544f484c179bc4e80abe15119babd27a3 --- /dev/null +++ b/corpus/rtl-page/cold/read/page-000.xml @@ -0,0 +1,31 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII=APMBHQPIAVABYCoAGh+LQnBFhHWAvtBF2QT6h5Uy8uwXQbjAFr/zK/R63rsTi+Ves0icm6ElWrdR +Er/scczMIrFBiQ67EyzueqFYz1SK5pfFT48G+LrS4ZsixGZtpw2yWEmaHU5ANAZsEAMGSBRE+Zx9 +BQgLZU9mZ2hkaRkUMggAgB4CIeLiQTMIAPAQAovF4kFkAxVGAEAKXBWC/xca9f4uMc5SVKSpSIL/ +AFTB/gCn3AFgAAUURgDAAAAJBAUURgAAAAASABEgzCikRHwBF0ik6a3tvqHwOgo/QCO0AoyWs9A7 +gAMVRgBACj9AI0bCHMUqWCWg + diff --git a/corpus/rtl-page/cold/read/payloads.json b/corpus/rtl-page/cold/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..920a376287fcf451b11c15a27a162ecd21d9a32c --- /dev/null +++ b/corpus/rtl-page/cold/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{B2FC7E18-A51C-4707-923A-CC9918928E18}{11}{B0}", + "kind": "InsertedFile", + "page": "{3BB37A5E-7DDE-4484-94A3-0EC09BBE088D}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/rtl-page/cold/run.json b/corpus/rtl-page/cold/run.json new file mode 100644 index 0000000000000000000000000000000000000000..4fe1789972092ae0fe28df07c087eb412d74aeca --- /dev/null +++ b/corpus/rtl-page/cold/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/private/tmp/snowbound-rtl/candidate", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "collect_notebook": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "22bc760f955ef59bb5f0ccfd55271f8d868674084127fbe219e1048bd3777f35" + } +} diff --git a/corpus/rtl-page/cold/scripts/cold.ps1 b/corpus/rtl-page/cold/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/rtl-page/cold/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/rtl-page/cold/scripts/read.ps1 b/corpus/rtl-page/cold/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a42366b32e8baaf13dae92e9472cae7a071220cc --- /dev/null +++ b/corpus/rtl-page/cold/scripts/read.ps1 @@ -0,0 +1,144 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $lastChange = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $lastChange = $previous + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8) + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + # A paragraph's file is named by its paragraph, one on the page by itself. + $owner = if ($file.ParentNode.LocalName -eq 'Page') { $file } else { $file.ParentNode } + $payloads += @{ page = $id; object = $owner.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/rtl-page/cold/source.json b/corpus/rtl-page/cold/source.json new file mode 100644 index 0000000000000000000000000000000000000000..143ea1781c94c5827a7d68e3b8efa49102dfb8d8 --- /dev/null +++ b/corpus/rtl-page/cold/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "3064cce91ed16ee1b2ff088d096fbd19492a6802a2f45a94447ccad490d8c452", + "mtime_ns": 1790841446325464192 + }, + { + "path": "synthetic.one", + "bytes": 45760, + "sha256": "7ee4b534028071dde4ced7e24109ed381c96bb3198728eb27b5d7b59de2c7a5d", + "mtime_ns": 1790841446324673647 + } +] diff --git a/corpus/rtl-page/cold/teardown.json b/corpus/rtl-page/cold/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/rtl-page/cold/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/crates/canvas/Cargo.toml b/crates/canvas/Cargo.toml index d96a8c6f405146d8a63bf188521aeca85e63664b..50e4d9b00a870c70e2cfdd293b53375236accf0d 100644 --- a/crates/canvas/Cargo.toml +++ b/crates/canvas/Cargo.toml @@ -46,6 +46,10 @@ wgpu.workspace = true name = "render_page" required-features = ["gpu"] +[[example]] +name = "reading_inventory" +required-features = ["gpu"] + [[example]] name = "print_pdf" required-features = ["pdf"] diff --git a/crates/canvas/examples/reading_inventory.rs b/crates/canvas/examples/reading_inventory.rs new file mode 100644 index 0000000000000000000000000000000000000000..af47b8321106ec710cdb2c4f4da0478ef37b2556 --- /dev/null +++ b/crates/canvas/examples/reading_inventory.rs @@ -0,0 +1,382 @@ +//! How many pages a reading view reflows into a phone's column, across the active pages of +//! every distinct section under the given directories, as Markdown; with `--json FILE`, one +//! line per page with its blocks in reading order. `--render SECTION INDEX PREFIX` draws page +//! INDEX of SECTION whole (`PREFIX-page.png`) and reflowed (`PREFIX-column.png`). +//! +//! `cargo run --release -p canvas --features gpu --example reading_inventory -- [--column 230] corpus` + +use canvas::{ + gpu::{Paper, Viewport, page::PageScene}, + layout::TextEngine, + reading::{self, Kept, Kind, Refusal, Verdict}, +}; +use draw::Renderer; +use onestore::{Arena, Section, page::Page}; +use std::{ + collections::{BTreeMap, BTreeSet, hash_map::DefaultHasher}, + fmt::Write as _, + hash::{Hash, Hasher}, + io::Write as _, + path::{Path, PathBuf}, + time::Duration, +}; + +/// Host points per page point at the iOS app's 100%: OneNote's 96 dpi enlarged 15%. +const POINT: f32 = 96.0 / 72.0 * 1.15; + +fn sections(directory: &Path, out: &mut Vec) { + let Ok(entries) = std::fs::read_dir(directory) else { + return; + }; + let mut entries: Vec = entries.flatten().map(|entry| entry.path()).collect(); + entries.sort(); + for path in entries { + if path.is_dir() { + sections(&path, out); + } else if path.extension().is_some_and(|e| e == "one") { + out.push(path); + } + } +} + +fn label(verdict: &Verdict) -> String { + match verdict { + Verdict::Fits => "fits".into(), + Verdict::Reflows => "reflows".into(), + Verdict::Partial(kept) => format!( + "partial: {}", + kept.iter() + .map(|k| kept_name(*k)) + .collect::>() + .join(", ") + ), + Verdict::Refused(refusal) => format!( + "refused: {}", + match refusal { + Refusal::RightToLeft => "right to left", + Refusal::Drawn => "mostly ink", + Refusal::Arranged => "mostly overlapping", + } + ), + } +} + +fn kept_name(kept: Kept) -> &'static str { + match kept { + Kept::Asides => "asides", + Kept::SideBySide => "side by side", + Kept::Group => "overlap kept whole", + Kept::Wide => "wider than the column", + } +} + +fn kind_name(kind: Kind) -> &'static str { + match kind { + Kind::Text => "text", + Kind::Picture => "picture", + Kind::File => "file", + Kind::Drawing => "drawing", + Kind::Group => "group", + } +} + +fn open(path: &Path) -> Option> { + let image = std::fs::read(path).ok()?; + let arena = Arena::default(); + let mut section = Section::open(&arena, image).ok()?; + let pages = section.pages().ok()?; + Some( + pages + .into_iter() + .filter_map(|(space, title, _)| section.page(space).ok().map(|page| (title, page))) + .collect(), + ) +} + +fn main() -> Result<(), Box> { + let mut args: Vec = std::env::args().skip(1).collect(); + let mut column = 230.0; + let mut json = None; + if let Some(at) = args.iter().position(|a| a == "--column") { + column = args[at + 1].parse()?; + args.drain(at..at + 2); + } + if let Some(at) = args.iter().position(|a| a == "--json") { + json = Some(std::fs::File::create(&args[at + 1])?); + args.drain(at..at + 2); + } + let mut engine = TextEngine::default(); + if args.first().is_some_and(|a| a == "--render") { + let [_, section, index, prefix] = &args[..] else { + return Err("--render SECTION INDEX PREFIX".into()); + }; + let pages = open(Path::new(section)).ok_or("section does not open")?; + let (_, page) = pages + .into_iter() + .nth(index.parse()?) + .ok_or("no such page")?; + let read = reading::read(&page, column, &mut engine)?; + let mut gpu = Gpu::new()?; + gpu.whole(&page, &mut engine, &format!("{prefix}-page.png"))?; + if let Some(reflowed) = &read.page { + gpu.column( + reflowed, + column, + &mut engine, + &format!("{prefix}-column.png"), + )?; + } + println!("{}", label(&read.verdict)); + return Ok(()); + } + let mut seen = BTreeSet::new(); + let mut distinct = BTreeSet::new(); + let mut verdicts: BTreeMap> = BTreeMap::new(); + let (mut pages, mut failed) = (0, 0); + for root in &args { + let mut paths = Vec::new(); + sections(Path::new(root), &mut paths); + for path in paths { + let Ok(bytes) = std::fs::read(&path) else { + continue; + }; + let mut hasher = DefaultHasher::new(); + bytes.hash(&mut hasher); + if !seen.insert(hasher.finish()) { + continue; + } + let Some(section) = open(&path) else { + continue; + }; + for (index, (title, page)) in section.into_iter().enumerate() { + // Fixtures repeat pages across their runs; each page counts once. + let mut hasher = DefaultHasher::new(); + serde_json::to_string(&page)?.hash(&mut hasher); + if !distinct.insert(hasher.finish()) { + continue; + } + pages += 1; + let place = format!("{} #{index} — {title}", path.display()); + let read = match reading::read(&page, column, &mut engine) { + Ok(read) => read, + Err(_) => { + failed += 1; + continue; + } + }; + let verdict = label(&read.verdict); + if let Some(json) = &mut json { + let blocks: Vec<_> = read + .blocks + .iter() + .map(|b| serde_json::json!({"kind": kind_name(b.kind), "members": b.members.len(), "bounds": b.bounds})) + .collect(); + let line = serde_json::json!({ + "section": path.display().to_string(), "index": index, "title": title, + "verdict": verdict, "offered": read.verdict.offered(), "blocks": blocks, + }); + writeln!(json, "{line}")?; + } + verdicts.entry(verdict).or_default().push(place); + } + } + } + let mut out = String::new(); + writeln!(out, "# Reading view eligibility\n")?; + writeln!( + out, + "{} distinct sections, {pages} distinct pages ({failed} failed to lay out), column {column} pt ({:.0} pt on screen at 100%).\n", + seen.len(), + column * POINT + )?; + writeln!( + out, + "| Verdict | Pages | Share | Examples |\n| --- | ---: | ---: | --- |" + )?; + let mut rows: Vec<_> = verdicts.iter().collect(); + rows.sort_by_key(|row| std::cmp::Reverse(row.1.len())); + for (verdict, places) in rows { + let examples: Vec = places.iter().take(3).map(|p| format!("`{p}`")).collect(); + writeln!( + out, + "| {verdict} | {} | {:.1}% | {} |", + places.len(), + 100.0 * places.len() as f64 / pages.max(1) as f64, + examples.join("
    ").replace('|', "\\|") + )?; + } + print!("{out}"); + Ok(()) +} + +struct Gpu { + renderer: Renderer, +} + +impl Gpu { + fn new() -> Result> { + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::new_without_display_handle()); + let adapter = pollster::block_on(instance.request_adapter(&Default::default()))?; + let (device, queue) = pollster::block_on(adapter.request_device(&Default::default()))?; + Ok(Self { + renderer: Renderer::new(device, queue, wgpu::TextureFormat::Rgba8UnormSrgb), + }) + } + + /// The whole page, 804 pixels across: a phone's width at 2x. + fn whole( + &mut self, + page: &Page, + engine: &mut TextEngine, + path: &str, + ) -> Result<(), Box> { + let (scene, bounds) = scene(page, engine)?; + let [x0, y0, x1, y1] = bounds; + let scale = 780.0 / (x1 - x0); + let height = (((y1 - y0) * scale) as u32 + 24).min(4000); + self.draw( + scene, + Viewport { + size: [804, height], + scale, + origin: [12.0 - x0 * scale, 12.0 - y0 * scale], + }, + path, + ) + } + + /// The reflowed page as the phone shows it at 100%, 34 points of tag room on its left. + fn column( + &mut self, + page: &Page, + column: f32, + engine: &mut TextEngine, + path: &str, + ) -> Result<(), Box> { + let (scene, [x0, y0, _, y1]) = scene(page, engine)?; + let scale = 2.0 * POINT; + let _ = column; + let height = (((y1 - y0) * scale) as u32 + 48).min(6000); + self.draw( + scene, + Viewport { + size: [804, height], + scale, + origin: [68.0 - x0 * scale, 24.0 - y0 * scale], + }, + path, + ) + } + + fn draw( + &mut self, + mut scene: PageScene, + viewport: Viewport, + path: &str, + ) -> Result<(), Box> { + scene.settle(None, viewport.scale, Paper::WHITE); + let mut primitives = Vec::new(); + scene.append_primitives(&mut primitives, [0.0; 2], Paper::WHITE)?; + let size = viewport.size; + let device = self.renderer.device().clone(); + let target = device.create_texture(&wgpu::TextureDescriptor { + label: None, + size: wgpu::Extent3d { + width: size[0], + height: size[1], + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8UnormSrgb, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }); + let row_bytes = (size[0] * 4).next_multiple_of(wgpu::COPY_BYTES_PER_ROW_ALIGNMENT); + let buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: None, + size: u64::from(row_bytes) * u64::from(size[1]), + usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, + mapped_at_creation: false, + }); + self.renderer + .draw( + &target.create_view(&Default::default()), + size, + [1.0; 4], + &[viewport.layer(&primitives)], + ) + .map_err(|e| format!("{e:?}"))?; + let mut encoder = device.create_command_encoder(&Default::default()); + encoder.copy_texture_to_buffer( + target.as_image_copy(), + wgpu::TexelCopyBufferInfo { + buffer: &buffer, + layout: wgpu::TexelCopyBufferLayout { + offset: 0, + bytes_per_row: Some(row_bytes), + rows_per_image: Some(size[1]), + }, + }, + wgpu::Extent3d { + width: size[0], + height: size[1], + depth_or_array_layers: 1, + }, + ); + self.renderer.queue().submit([encoder.finish()]); + let (sender, receiver) = std::sync::mpsc::channel(); + buffer.map_async(wgpu::MapMode::Read, .., move |result| { + let _ = sender.send(result); + }); + device.poll(wgpu::PollType::Wait { + submission_index: None, + timeout: Some(Duration::from_secs(10)), + })?; + receiver.recv_timeout(Duration::from_secs(10))??; + let mapped = buffer.get_mapped_range(..)?; + let pixels: Vec = mapped + .chunks_exact(row_bytes as usize) + .flat_map(|row| row[..size[0] as usize * 4].iter().copied()) + .collect(); + let mut encoder = png::Encoder::new(std::fs::File::create(path)?, size[0], size[1]); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + encoder.write_header()?.write_image_data(&pixels)?; + Ok(()) + } +} + +/// The page's scene, pictures decoded, and its content's bounds with the title. +fn scene( + page: &Page, + engine: &mut TextEngine, +) -> Result<(PageScene, [f32; 4]), Box> { + let editor = canvas::editor::CanvasEditor::from_page(page.clone(), engine)?; + let mut bounds = [ + f32::INFINITY, + f32::INFINITY, + f32::NEG_INFINITY, + f32::NEG_INFINITY, + ]; + for outline in editor.outlines() { + let b = outline.bounds(); + bounds = [ + bounds[0].min(b.x0 as f32), + bounds[1].min(b.y0 as f32), + bounds[2].max(b.x1 as f32), + bounds[3].max(b.y1 as f32), + ]; + } + for block in reading::read(page, f32::INFINITY, engine)?.blocks { + let b = block.bounds; + bounds = [ + bounds[0].min(b[0]), + bounds[1].min(b[1]), + bounds[2].max(b[2]), + bounds[3].max(b[3]), + ]; + } + Ok((PageScene::new(page.clone(), engine)?, bounds)) +} diff --git a/crates/canvas/examples/unsupported_inventory.rs b/crates/canvas/examples/unsupported_inventory.rs index 1eddfb8e8978911e343a06355216be265ac1522e..3f2694a6de4f8757a6420f970d29e7a04810800d 100644 --- a/crates/canvas/examples/unsupported_inventory.rs +++ b/crates/canvas/examples/unsupported_inventory.rs @@ -544,7 +544,38 @@ fn page(engine: &mut TextEngine, page: Page, place: &str, inventory: &mut Invent probe(&mut editor, engine, inventory, place); } -fn section(engine: &mut TextEngine, path: &Path, root: &Path, inventory: &mut Inventory) { +/// The passwords the roots' `manifest.json` files record for their protected sections. +fn passwords(directory: &Path, out: &mut Vec) { + let Ok(entries) = std::fs::read_dir(directory) else { + return; + }; + for path in entries.flatten().map(|entry| entry.path()) { + if path.is_dir() { + passwords(&path, out); + } else if path.file_name().is_some_and(|name| name == "manifest.json") + && let Ok(bytes) = std::fs::read(&path) + && let Ok(manifest) = serde_json::from_slice::(&bytes) + { + let named = manifest["native"] + .as_object() + .into_iter() + .flat_map(|map| map.values()); + out.extend( + std::iter::once(&manifest["password"]) + .chain(named) + .filter_map(|password| password.as_str().map(str::to_owned)), + ); + } + } +} + +fn section( + engine: &mut TextEngine, + path: &Path, + root: &Path, + passwords: &[String], + inventory: &mut Inventory, +) { let Ok(image) = std::fs::read(path) else { return; }; @@ -554,7 +585,15 @@ fn section(engine: &mut TextEngine, path: &Path, root: &Path, inventory: &mut In .display() .to_string(); let arena = Arena::default(); - let mut section = match Section::open(&arena, image) { + // A protected section opens under the password its fixture records. + let key = passwords + .iter() + .find_map(|password| onestore::protected::Key::open(&image, password).ok()); + let opened = match &key { + Some(key) => Section::unlock(&arena, image, key).map_err(onestore::Error::from), + None => Section::open(&arena, image), + }; + let mut section = match opened { Ok(section) => section, Err(error) => { inventory.add( @@ -612,6 +651,10 @@ fn main() { let mut inventory = Inventory::default(); let mut seen = BTreeSet::new(); let mut duplicates = 0; + let mut known = Vec::new(); + for root in &roots { + passwords(root, &mut known); + } for root in &roots { let mut paths = Vec::new(); sections(root, &mut paths); @@ -625,7 +668,7 @@ fn main() { duplicates += 1; continue; } - section(&mut engine, &path, root, &mut inventory); + section(&mut engine, &path, root, &known, &mut inventory); } } println!("# Unsupported content inventory\n"); diff --git a/crates/canvas/src/conflict.rs b/crates/canvas/src/conflict.rs index d3186859dc696e4018a036a4c179674a394b631d..0a7c00eb0f1f6050d168854561613f613c188080 100644 --- a/crates/canvas/src/conflict.rs +++ b/crates/canvas/src/conflict.rs @@ -1,5 +1,6 @@ //! Conflict pages and page versions as OneNote shows them. +use crate::document::descendants; use onestore::{ ExGuid, page::{Page, PageObject, PageParagraph, ParagraphContent}, @@ -21,9 +22,19 @@ pub fn highlighted(page: Page, objects: &[ExGuid]) -> Page { /// banded as OneNote shows it; all of it without one. pub fn changes(version: Page, older: Option<&Page>) -> Page { let texts = |page: &Page| { - let mut texts = Vec::new(); - each_text(page, &mut |id, text| texts.push((id, text.to_owned()))); - texts + page.objects + .iter() + .flat_map(|object| match object { + PageObject::Outline(outline) => std::slice::from_ref(outline), + PageObject::Title(title) => title.outlines.as_slice(), + _ => &[], + }) + .flat_map(|outline| descendants(&outline.paragraphs, None)) + .filter_map(|(_, _, node)| match &node.content { + ParagraphContent::Text(text) => Some((text.id, text.text.text().to_owned())), + _ => None, + }) + .collect::>() }; let before = older.map(texts).unwrap_or_default(); let changed: Vec = texts(&version) @@ -34,33 +45,6 @@ pub fn changes(version: Page, older: Option<&Page>) -> Page { banded(version, &changed, CHANGED) } -fn each_text(page: &Page, f: &mut impl FnMut(ExGuid, &str)) { - fn walk(paragraphs: &[PageParagraph], f: &mut impl FnMut(ExGuid, &str)) { - for paragraph in paragraphs { - match ¶graph.content { - ParagraphContent::Table(table) => { - for cell in table.rows.iter().flat_map(|row| &row.cells) { - walk(&cell.paragraphs, f); - } - } - ParagraphContent::Text(text) => f(text.id, text.text.text()), - _ => {} - } - } - } - for object in &page.objects { - match object { - PageObject::Outline(outline) => walk(&outline.paragraphs, f), - PageObject::Title(title) => { - for outline in &title.outlines { - walk(&outline.paragraphs, f); - } - } - _ => {} - } - } -} - fn banded(mut page: Page, objects: &[ExGuid], color: u32) -> Page { fn mark(paragraphs: &mut [PageParagraph], objects: &[ExGuid], color: u32) { for paragraph in paragraphs { diff --git a/crates/canvas/src/date.rs b/crates/canvas/src/date.rs index 0ef98c2460670404ca1450e061750bd06efe0dd9..477f03402c9a22f5e0f1f8378c0a057e4d279865 100644 --- a/crates/canvas/src/date.rs +++ b/crates/canvas/src/date.rs @@ -32,7 +32,7 @@ impl PageDate { &self.layout } - pub fn fields(&self) -> impl Iterator { + pub(crate) fn fields(&self) -> impl Iterator { let swapped = self .source .paragraphs diff --git a/crates/canvas/src/document.rs b/crates/canvas/src/document.rs index cb9899ddfe5856f2f80e0590618fc548843499f2..e29df4feb16ae6879a145678e4f199942d074d2e 100644 --- a/crates/canvas/src/document.rs +++ b/crates/canvas/src/document.rs @@ -26,11 +26,11 @@ pub struct TextDocument { #[derive(Clone, Debug, PartialEq)] pub(crate) struct DocumentEdit { /// Cell identity, or None for the document root. - pub container: Option, - pub range: Range, - pub replacement: Vec, + pub(crate) container: Option, + pub(crate) range: Range, + pub(crate) replacement: Vec, /// Width patches address surviving tables outside the replacement subtree. - pub columns: BTreeMap>, + pub(crate) columns: BTreeMap>, } pub(crate) fn node(text: Paragraph, format: Format) -> Result { @@ -757,7 +757,7 @@ impl TextDocument { Err(EditError::InvalidRange) } - pub fn slice(&self, range: Range) -> Result, EditError> { + pub(crate) fn slice(&self, range: Range) -> Result, EditError> { if range.start > range.end { return Err(EditError::InvalidRange); } diff --git a/crates/canvas/src/editor.rs b/crates/canvas/src/editor.rs index 41d0f75a8a86709d7f77d612090af2febf4b8222..84f35790368b72e7be2f625f330dc1c340b697e8 100644 --- a/crates/canvas/src/editor.rs +++ b/crates/canvas/src/editor.rs @@ -100,10 +100,7 @@ pub struct Awaited { } /// A new picture of encoded `bytes`, `size` points large. -pub(crate) fn picture( - bytes: Vec, - size: [f32; 2], -) -> Result { +pub fn picture(bytes: Vec, size: [f32; 2]) -> Result { Ok(onestore::page::Image { id: onestore::page::text::new_id()?, layout: onestore::document::Layout { @@ -187,6 +184,7 @@ struct PageHeader { identity: Option<[u8; 16]>, created: Option, margin_origin: [f32; 2], + rtl: bool, color: Option, rule_lines: Option, areas: Vec, @@ -378,7 +376,7 @@ impl TextOutline { } pub fn origin(&self) -> [f32; 2] { - [self.layout.x.unwrap_or(0.0), self.layout.y.unwrap_or(0.0)] + crate::origin(&self.layout) } pub fn wrap_width(&self) -> f32 { @@ -509,7 +507,7 @@ impl TextOutline { } /// All the outline's shown text. - pub fn whole(&self) -> Selection { + pub(crate) fn whole(&self) -> Selection { let paragraph = self.source_index(self.shaped.paragraphs.len() - 1); let last = self.document.paragraph(paragraph).unwrap(); [ @@ -587,7 +585,11 @@ impl TextOutline { /// Where a mark under UTF-16 `range` of paragraph `index` runs, outline-local: each /// line's left, right and baseline. - pub fn underlines(&self, index: usize, range: Range) -> Result, EditError> { + pub(crate) fn underlines( + &self, + index: usize, + range: Range, + ) -> Result, EditError> { let paragraph = self.paragraph_layout(index)?; let selection = ParagraphSelection::new( paragraph.cursor(range.start, Affinity::Downstream)?, @@ -935,39 +937,15 @@ impl CanvasEditor { width: f32, ) -> Result { let outline = TextOutline::new(engine, document, width, [0.0; 2])?; - let (outlines, active) = if outline.is_empty() { - ( - Vec::new(), - Focus::Caret { - outline: Box::new(outline), - index: 0, - }, - ) - } else { - (vec![outline], Focus::Outline(0)) - }; - Ok(Self { - outlines, - definitions: BTreeMap::new(), - objects: Vec::new(), - date: None, - header: PageHeader::default(), - active, - undo: Vec::new(), - redo: Vec::new(), - composition: None, - preferred_x: None, - pending: None, - ops: Ok(Vec::new()), - stored: None, - whole: None, - typing: None, - recording: None, - ink_drag: None, - provisional: BTreeMap::new(), - default_font: DefaultFont::default(), - styles: BTreeMap::new(), - }) + let empty = outline.is_empty(); + let mut editor = Self::from_text_outlines(vec![outline], BTreeMap::new(), None)?; + if empty { + editor.active = Focus::Caret { + outline: Box::new(editor.outlines.pop().unwrap()), + index: 0, + }; + } + Ok(editor) } pub fn from_page(mut page: Page, engine: &mut TextEngine) -> Result { @@ -1014,6 +992,7 @@ impl CanvasEditor { identity: page.identity, created: page.created, margin_origin: page.margin_origin, + rtl: page.rtl, color: page.color, rule_lines: page.rule_lines, areas, @@ -1317,6 +1296,7 @@ impl CanvasEditor { .map(PageDate::timestamp) .or(self.header.created), margin_origin: self.header.margin_origin, + rtl: self.header.rtl, color: self.header.color, rule_lines: self.header.rule_lines, objects, @@ -1516,7 +1496,8 @@ impl CanvasEditor { .collect() } - pub fn from_outlines( + #[cfg(test)] + pub(crate) fn from_outlines( engine: &mut TextEngine, outlines: Vec, definitions: BTreeMap, @@ -1631,14 +1612,15 @@ impl CanvasEditor { return false; } self.finish_composition(); - let mut entries = Vec::new(); + let depth = self.undo.len(); if paper { - entries.push(self.paper(color, rule_lines)); + let entry = self.paper(color, rule_lines); + self.undo.push(entry); } if let Some(art) = art { for index in backgrounds.into_iter().rev() { let image = self.remove_picture(index); - entries.push(History::Picture { + self.undo.push(History::Picture { index, image: Some(Box::new(image)), }); @@ -1646,19 +1628,13 @@ impl CanvasEditor { // Art lies under everything else on the page. for image in art.into_iter().rev() { self.add_picture(0, image); - entries.push(History::Picture { + self.undo.push(History::Picture { index: 0, image: None, }); } } - self.undo.push(match entries.len() { - 1 => entries.pop().unwrap(), - _ => History::Group { - entries, - page: false, - }, - }); + self.group(depth, false); self.redo.clear(); true } @@ -1748,7 +1724,6 @@ impl CanvasEditor { } } - /// Provisional input geometry outside the document's outline collection. /// The caret a run of typing left while typing there still joins the run: the word /// before it is still being written. pub fn typing(&self) -> Option<(ExGuid, TextPosition)> { @@ -1759,6 +1734,7 @@ impl CanvasEditor { .then_some((outline, at)) } + /// Provisional input geometry outside the document's outline collection. pub fn caret_outline(&self) -> Option<&TextOutline> { match &self.active { Focus::Caret { outline, .. } => Some(outline), @@ -2020,9 +1996,8 @@ impl CanvasEditor { return Some(([x0, y0], [x1 - x0, y1 - y0])); } if let Some(image) = self.image(id) { - let layout = &image.layout; return Some(( - [layout.x.unwrap_or(0.0), layout.y.unwrap_or(0.0)], + crate::origin(&image.layout), crate::outline::image_size(image)?, )); } @@ -2034,7 +2009,7 @@ impl CanvasEditor { } /// Whether the picture sits in an outline's flow, where only its size can change. - pub fn image_in_outline(&self, id: ExGuid) -> bool { + pub(crate) fn image_in_outline(&self, id: ExGuid) -> bool { self.outline_picture(id).is_some() } @@ -2052,7 +2027,7 @@ impl CanvasEditor { } /// The address picture `id` links to, in an outline or on the page. - pub fn picture_link(&self, id: ExGuid) -> Option<&str> { + pub(crate) fn picture_link(&self, id: ExGuid) -> Option<&str> { let image = match self.image(id) { Some(image) => image, None => match &self.outline_picture(id)?.3.content { @@ -2064,7 +2039,7 @@ impl CanvasEditor { } /// The file a paragraph holds or the page shows, which the host opens and saves. - pub fn attachment(&self, id: ExGuid) -> Option<&onestore::page::Attachment> { + pub(crate) fn attachment(&self, id: ExGuid) -> Option<&onestore::page::Attachment> { if let Some((file, _)) = self.page_file(id) { return Some(file); } @@ -2083,15 +2058,14 @@ impl CanvasEditor { } /// Where a file draws with its name, in page coordinates. - pub fn attachment_rect(&self, id: ExGuid) -> Option<[f32; 4]> { + pub(crate) fn attachment_rect(&self, id: ExGuid) -> Option<[f32; 4]> { if let Some((_, rect)) = self.page_file(id) { return Some(rect); } let (outline, ..) = self.outline_picture(id)?; let outline = self.outlines.iter().find(|item| item.id == outline)?; - let [x0, y0, x1, y1] = outline.shaped.objects.iter().find(|o| o.id == id)?.bounds(); - let [x, y] = outline.origin(); - Some([x + x0, y + y0, x + x1, y + y1]) + let bounds = outline.shaped.objects.iter().find(|o| o.id == id)?.bounds(); + Some(crate::translated(bounds, outline.origin())) } /// Replaces a picture paragraph through the outline's text history. @@ -2231,7 +2205,7 @@ impl CanvasEditor { /// Leaves a picture as OneNote's Left and Right arrows do: the caret goes to the end of the /// text outline before it in page order, or to the start of the one after. False when there /// is none. - pub fn step_from_image( + pub(crate) fn step_from_image( &mut self, engine: &mut TextEngine, id: ExGuid, @@ -2394,15 +2368,7 @@ impl CanvasEditor { break; } } - let entries = self.undo.split_off(depth); - if entries.len() > 1 { - self.undo.push(History::Group { - entries, - page: false, - }); - } else { - self.undo.extend(entries); - } + self.group(depth, false); result.map(|()| awaited) } @@ -2414,7 +2380,11 @@ impl CanvasEditor { at: Awaited, image: onestore::page::Image, ) -> Result { - let Some(outline) = self.outlines.iter().find(|outline| outline.id == at.outline) else { + let Some(outline) = self + .outlines + .iter() + .find(|outline| outline.id == at.outline) + else { return Ok(false); }; let Some((container, index, node)) = descendants(outline.document.nodes(), None) @@ -2605,6 +2575,12 @@ impl CanvasEditor { self.header.margin_origin } + /// Whether the page runs right to left, which OneNote 2010 opens scrolled to its right + /// end. + pub fn rtl(&self) -> bool { + self.header.rtl + } + pub fn resize(&mut self, engine: &mut TextEngine, width: f32) -> Result<(), EditorError> { let outline = self.active_outline(); if outline.layout.reserved_width.or(outline.layout.max_width) == Some(width) @@ -2760,7 +2736,7 @@ impl CanvasEditor { } /// Selects outline `id` as an object, as a click on its handle does. - pub fn select_outline(&mut self, id: ExGuid) -> Result<(), EditError> { + pub(crate) fn select_outline(&mut self, id: ExGuid) -> Result<(), EditError> { self.focus_outline(id)?; let whole = self.active_outline().whole(); self.select(whole)?; @@ -2793,20 +2769,38 @@ impl CanvasEditor { Ok(()) } - /// Runs `edit` as one undo step. + /// Makes the history entries past `depth` one undo step, `page` when they edited OneNote's + /// page selection; false when there are none. Groups among them are flattened into it. + fn group(&mut self, depth: usize, mut page: bool) -> bool { + let mut entries = Vec::new(); + for entry in self.undo.split_off(depth) { + match entry { + History::Group { + entries: inner, + page: selected, + } => { + page |= selected; + entries.extend(inner); + } + entry => entries.push(entry), + } + } + match entries.len() { + 0 => return false, + 1 if !page => self.undo.extend(entries), + _ => self.undo.push(History::Group { entries, page }), + } + true + } + + /// Runs `edit`, an edit of OneNote's page selection, as one undo step. fn grouped( &mut self, edit: impl FnOnce(&mut Self) -> Result, ) -> Result { let depth = self.undo.len(); let result = edit(self); - let entries = self.undo.split_off(depth); - if !entries.is_empty() { - self.undo.push(History::Group { - entries, - page: true, - }); - } + self.group(depth, true); result } @@ -2828,13 +2822,7 @@ impl CanvasEditor { } let depth = self.undo.len(); let result = self.delete(engine, false).and_then(|_| edit(self, engine)); - let entries = self.undo.split_off(depth); - if !entries.is_empty() { - self.undo.push(History::Group { - entries, - page: false, - }); - } + self.group(depth, false); result.map(Some) } @@ -2858,27 +2846,8 @@ impl CanvasEditor { }); let depth = self.undo.len() - usize::from(joins); let result = edit(self); - let (mut run, mut page) = (Vec::new(), false); - for entry in self.undo.split_off(depth) { - match entry { - History::Group { - entries, - page: selected, - } => { - page |= selected; - if run.is_empty() { - run = entries; - } else { - run.extend(entries); - } - } - entry => run.push(entry), - } - } - match run.len() { - 0 => return result, - 1 if !page => self.undo.extend(run), - _ => self.undo.push(History::Group { entries: run, page }), + if !self.group(depth, false) { + return result; } if result.is_ok() { let caret = self.selection().positions[1]; @@ -2957,7 +2926,7 @@ impl CanvasEditor { }) } - pub fn select_at(&mut self, x: f32, y: f32, extend: bool) -> Result<(), EditError> { + pub(crate) fn select_at(&mut self, x: f32, y: f32, extend: bool) -> Result<(), EditError> { let mut selection = self.selection_at(x, y, SelectionUnit::Grapheme)?; if extend { selection.positions[0] = self.selection().positions[0]; @@ -3448,12 +3417,12 @@ impl CanvasEditor { Ok(()) } - pub fn selection_rects(&self) -> Result, EditError> { + pub(crate) fn selection_rects(&self) -> Result, EditError> { self.active_outline() .range_rects(self.active_outline().selection) } - pub fn marked_rects(&self) -> Result, EditError> { + pub(crate) fn marked_rects(&self) -> Result, EditError> { match &self.composition { Some(composition) => self.active_outline().range_rects(Selection { positions: [composition.range.start, composition.range.end], @@ -3506,7 +3475,11 @@ impl CanvasEditor { /// Replaces the selection with `text` in the formatting of the text it replaces, as a /// spelling correction does. - pub fn correct(&mut self, engine: &mut TextEngine, text: &str) -> Result<(), EditorError> { + pub(crate) fn correct( + &mut self, + engine: &mut TextEngine, + text: &str, + ) -> Result<(), EditorError> { let [anchor, focus] = self.selection().positions; let end = anchor.max(focus); let format = self @@ -3752,7 +3725,7 @@ impl CanvasEditor { /// Alt+Shift+Up or Down: swaps the selected paragraphs, with their children, and the /// sibling above or below with its children. Does nothing past the first or last sibling. - pub fn move_paragraphs( + pub(crate) fn move_paragraphs( &mut self, engine: &mut TextEngine, up: bool, @@ -3994,7 +3967,7 @@ impl CanvasEditor { /// Takes up `parked`, the editor this page had when it was last left, history and all, /// in place of this one: what storage changed since reaches it as `refresh` would. - pub fn resume( + pub(crate) fn resume( &mut self, mut parked: CanvasEditor, engine: &mut TextEngine, @@ -4928,9 +4901,6 @@ impl CanvasEditor { } } -/// Where `position` in `old` lies in `new`, the same outline changed elsewhere: in the same -/// paragraph, past what changed in its text when it lies after it; at the start of the -/// paragraph now at its place when that one is gone. /// Whether `content` is picture or file `id`. fn holds(content: &ParagraphContent, id: ExGuid) -> bool { match content { @@ -4940,6 +4910,9 @@ fn holds(content: &ParagraphContent, id: ExGuid) -> bool { } } +/// Where `position` in `old` lies in `new`, the same outline changed elsewhere: in the same +/// paragraph, past what changed in its text when it lies after it; at the start of the +/// paragraph now at its place when that one is gone. fn follow(old: &TextDocument, new: &TextDocument, position: TextPosition) -> TextPosition { let found = old.leaf(position.paragraph).and_then(|(_, _, node)| { let paragraph = new @@ -6447,6 +6420,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -6558,6 +6532,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -6656,6 +6631,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -6720,6 +6696,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -6840,6 +6817,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -6959,6 +6937,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -7060,6 +7039,7 @@ mod tests { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -10623,4 +10603,34 @@ mod tests { [[(0, 0), (0, 5)]; 6] ); } + + #[test] + fn pasting_over_the_page_selection_is_one_step_that_undo_selects_again() { + let mut engine = TextEngine::default(); + let lines = ["One", "Two"].map(|line| Paragraph::new(line.into(), Format::default())); + let mut editor = CanvasEditor::new( + &mut engine, + TextDocument::new(lines.to_vec()).unwrap(), + 400.0, + ) + .unwrap(); + editor.select_page().unwrap(); + editor + .paste_pieces( + &mut engine, + vec![ + Piece::Text("Pasted".into()), + Piece::Picture(vec![0; 8], [10.0; 2]), + ], + 0x409, + ) + .unwrap(); + assert_eq!(editor.history_depth(), [1, 0]); + let _ = editor.take_ops(); + let mut remote = editor.page().unwrap(); + remote.color = Some(0x00ff_ffff); + editor.refresh(remote, &mut engine).unwrap(); + assert!(editor.undo(&mut engine).unwrap()); + assert_eq!(editor.whole(), Some(Whole::Page)); + } } diff --git a/crates/canvas/src/editor/equation.rs b/crates/canvas/src/editor/equation.rs index d76775c96e8565819d09180990165e5eeb9cffe2..af683cfe03fbdd17e1cbc84f5f7c161c6cd24a35 100644 --- a/crates/canvas/src/editor/equation.rs +++ b/crates/canvas/src/editor/equation.rs @@ -186,7 +186,7 @@ impl CanvasEditor { } /// Whether the caret is in an equation, which Linear and Professional act on. - pub fn in_equation(&self) -> bool { + pub(crate) fn in_equation(&self) -> bool { self.caret_zone().is_some() } @@ -270,15 +270,7 @@ impl CanvasEditor { } Ok(()) })(); - let entries = self.undo.split_off(depth); - match entries.len() { - 0 => {} - 1 => self.undo.extend(entries), - _ => self.undo.push(History::Group { - entries, - page: false, - }), - } + self.group(depth, false); result } diff --git a/crates/canvas/src/editor/format.rs b/crates/canvas/src/editor/format.rs index af9e92437a5a14f3ae0878c601b2dbba243150cc..507d67a4ca6198effee9ba5d182af137ae604b05 100644 --- a/crates/canvas/src/editor/format.rs +++ b/crates/canvas/src/editor/format.rs @@ -208,8 +208,8 @@ impl DefaultFont { subscript: Some(false), font: Some(self.face.clone()), font_size: Some(self.size), - color: Some(self.color.unwrap_or(0xff00_0000)), - highlight: Some(0xff00_0000), + color: Some(self.color.unwrap_or(AUTOMATIC)), + highlight: Some(AUTOMATIC), space_before: Some(0.0), space_after: Some(0.0), line_spacing: Some(0.0), @@ -293,7 +293,7 @@ impl NoteTag { } /// The definition OneNote stores for the tag at place `action_type` in the list. - pub fn definition(&self, action_type: u16) -> Definition { + pub(crate) fn definition(&self, action_type: u16) -> Definition { Definition { kind: Kind::TagDefinition { label: Some(self.label.clone()), @@ -453,18 +453,18 @@ fn covered( }) } -pub(super) fn leaves_mut(nodes: &mut [PageParagraph], change: &mut impl FnMut(&mut PageParagraph)) { +pub(super) fn leaves_mut(nodes: &mut [PageParagraph]) -> Vec<&mut PageParagraph> { + let mut leaves = Vec::new(); for node in nodes { - match &mut node.content { - ParagraphContent::Text(_) => change(node), - ParagraphContent::Table(table) => { - for cell in table.rows.iter_mut().flat_map(|row| &mut row.cells) { - leaves_mut(&mut cell.paragraphs, change); - } + if node.text().is_some() { + leaves.push(node); + } else if let ParagraphContent::Table(table) = &mut node.content { + for cell in table.rows.iter_mut().flat_map(|row| &mut row.cells) { + leaves.extend(leaves_mut(&mut cell.paragraphs)); } - _ => {} } } + leaves } /// `text` with `change` applied to the formats of bytes `range`, or to its only format when empty. @@ -753,6 +753,7 @@ impl CanvasEditor { | Formatting::Tag(..) | Formatting::RemoveTags | Formatting::Check + | Formatting::Style(_) if title => { return Ok(()); @@ -763,7 +764,7 @@ impl CanvasEditor { } Formatting::Align(alignment) => { let bases = bases(&replacement)?; - leaves_mut(&mut replacement, &mut |node| { + for node in leaves_mut(&mut replacement) { if ranges.remove(&node.id).is_some() { let value = match alignment { Alignment::Left => bases[&node.id].alignment.map(|_| 0), @@ -775,7 +776,7 @@ impl CanvasEditor { format.alignment = value; }); } - }); + } } Formatting::Bullets | Formatting::Numbering | Formatting::List(_) => { let style = match command { @@ -821,7 +822,7 @@ impl CanvasEditor { self.definitions.insert(id, definition); lists.insert(node, id); } - leaves_mut(&mut replacement, &mut |node| { + for node in leaves_mut(&mut replacement) { if ranges.remove(&node.id).is_some() { if remove { node.lists.clear(); @@ -829,50 +830,40 @@ impl CanvasEditor { node.lists = vec![*id]; } } - }); + } } Formatting::Tag(tag, action_type) => { let definition = tag.definition(*action_type); - let existing = self - .definitions - .iter() - .find(|(_, other)| other.kind == definition.kind); - let id = match existing { - Some((id, _)) => *id, - None => { - let id = new_id()?; - self.definitions.insert(id, definition.clone()); - id - } - }; + let id = self.define_tag(&definition)?; let has = |node: &PageParagraph| { tags(node).any(|tag| self.tag_kind(tag) == Some(&definition.kind)) }; let remove = covered(&replacement, ends).all(|(node, _)| has(node)); let created = time32(); - leaves_mut(&mut replacement, &mut |node| { + for node in leaves_mut(&mut replacement) { if ranges.remove(&node.id).is_none() || !remove && has(node) { - return; + continue; } let ParagraphContent::Text(text) = &mut node.content else { unreachable!() }; let added = (!remove).then_some((id, tag.shape, created)); self.retag([&mut node.tags, &mut text.tags], &definition.kind, added); - }); + } } - Formatting::RemoveTags => leaves_mut(&mut replacement, &mut |node| { - if ranges.remove(&node.id).is_some() { - node.tags.clear(); - node.text_mut().unwrap().tags.clear(); + Formatting::RemoveTags => { + for node in leaves_mut(&mut replacement) { + if ranges.remove(&node.id).is_some() { + node.tags.clear(); + node.text_mut().unwrap().tags.clear(); + } } - }), - Formatting::Check => self.check(&mut replacement, ranges, ends), - Formatting::Style(_) if title => return Ok(()), + } + Formatting::Check => self.check(&mut replacement, &ranges), Formatting::Style(definition) => { let olds = bases(&replacement)?; let style = self.define_style(definition)?; - leaves_mut(&mut replacement, &mut |node| { + for node in leaves_mut(&mut replacement) { if ranges.remove(&node.id).is_some() { node.style = Some(style); let old = &olds[&node.id]; @@ -899,7 +890,7 @@ impl CanvasEditor { }; }); } - }); + } } Formatting::Toggle(_) | Formatting::Font(_) @@ -971,7 +962,7 @@ impl CanvasEditor { self.pending = Some((id, caret, format)); return Ok(()); } - leaves_mut(&mut replacement, &mut |node| { + for node in leaves_mut(&mut replacement) { if let Some(range) = ranges.remove(&node.id) { let base = &bases[&node.id]; let text = &mut node.text_mut().unwrap().text; @@ -984,7 +975,7 @@ impl CanvasEditor { }); } } - }); + } } } if self.active_outline().document.container(container)?[range.clone()] == replacement[..] { @@ -1018,6 +1009,20 @@ impl CanvasEditor { Ok(id) } + /// The page's definition of the tag `definition` describes, made where it has none. + fn define_tag(&mut self, definition: &Definition) -> Result { + if let Some((id, _)) = self + .definitions + .iter() + .find(|(_, other)| other.kind == definition.kind) + { + return Ok(*id); + } + let id = new_id()?; + self.definitions.insert(id, definition.clone()); + Ok(id) + } + /// A paragraph style named `name`: the page's in its theme's formatting, else the page's /// first of that name, else the theme's made on the page; Normal falls back to the /// Default font's. None where nothing names it. @@ -1100,7 +1105,7 @@ impl CanvasEditor { let ranges = covered(&replacement, ends) .map(|(node, range)| (node.id, range)) .collect(); - self.check(&mut replacement, ranges, ends); + self.check(&mut replacement, &ranges); let selection = outline.selection; self.commit( engine, @@ -1176,19 +1181,7 @@ impl CanvasEditor { match command { Formatting::Tag(tag, action_type) => { let definition = tag.definition(*action_type); - let existing = self - .definitions - .iter() - .find(|(_, other)| other.kind == definition.kind) - .map(|(id, _)| *id); - let defined = match existing { - Some(id) => id, - None => { - let id = new_id()?; - self.definitions.insert(id, definition.clone()); - id - } - }; + let defined = self.define_tag(&definition)?; let has = tags .iter() .any(|tag| self.tag_kind(tag) == Some(&definition.kind)); @@ -1284,7 +1277,8 @@ impl CanvasEditor { ); } - /// Checks the check boxes among `tags`, or clears them once all are checked. + /// Checks the check boxes among `tags`, or clears them once all are checked; OneNote keeps + /// a cleared box's completion time as zero. fn toggle_checks(&self, mut tags: Vec<&mut Tag>) { let checkable = |tag: &Tag| { matches!( @@ -1307,39 +1301,19 @@ impl CanvasEditor { } /// Checks the check boxes of the `covered` paragraphs, or clears them once all are - /// checked; OneNote keeps a cleared box's completion time as zero. - fn check( - &self, - replacement: &mut [PageParagraph], - mut covered: BTreeMap>, - ends: Ends, - ) { - let checkable = |tag: &Tag| { - matches!( - self.tag_kind(tag), - Some(Kind::TagDefinition { shape: Some(shape), .. }) - if crate::outline::checkable(*shape) - ) - }; - let checked = self::covered(replacement, ends) - .flat_map(|(node, _)| tags(node)) - .filter(|tag| checkable(tag)) - .all(|tag| tag.status & 1 != 0); - let completed = if checked { Some(0) } else { time32() }; - leaves_mut(replacement, &mut |node| { - if covered.remove(&node.id).is_none() { - return; - } - let ParagraphContent::Text(text) = &mut node.content else { - unreachable!() - }; - for tag in node.tags.iter_mut().chain(&mut text.tags) { - if checkable(tag) && (tag.status & 1 != 0) == checked { - tag.status ^= 1; - tag.completed = completed; - } - } - }); + /// checked. + fn check(&self, replacement: &mut [PageParagraph], covered: &BTreeMap>) { + let tags = leaves_mut(replacement) + .into_iter() + .filter(|node| covered.contains_key(&node.id)) + .flat_map(|node| { + let ParagraphContent::Text(text) = &mut node.content else { + unreachable!() + }; + node.tags.iter_mut().chain(&mut text.tags) + }) + .collect(); + self.toggle_checks(tags); } } diff --git a/crates/canvas/src/editor/ink.rs b/crates/canvas/src/editor/ink.rs index 2045df5a565d715061bb4f3add8d7e32a9de78c1..5d0b753f07679806706820575086b535eb6454e8 100644 --- a/crates/canvas/src/editor/ink.rs +++ b/crates/canvas/src/editor/ink.rs @@ -35,7 +35,7 @@ impl Pen { } } - pub const fn highlighter(color: u32) -> Self { + pub(crate) const fn highlighter(color: u32) -> Self { Self { width: 70.0, color: Some(color), @@ -130,25 +130,8 @@ impl CanvasEditor { let page::Content::Ink(ink) = &self.objects[index] else { continue; }; - let offset = page::ink_offset(ink); - let touched = |stroke: &InkStroke| { - let reach = reach + stroke.width.max(stroke.height) / 2.0; - let mut points = stroke - .points - .iter() - .map(|p| [p[0] + offset[0], p[1] + offset[1]]); - let Some(mut previous) = points.next() else { - return false; - }; - if segments_distance([previous, previous], [from, to]) <= reach { - return true; - } - points.any(|point| { - let near = segments_distance([previous, point], [from, to]) <= reach; - previous = point; - near - }) - }; + let offset = crate::origin(&ink.layout); + let touched = |stroke: &InkStroke| stroke_near(stroke, offset, [from, to], reach); let (kept, erased): (Vec, Vec) = ink .strokes .iter() @@ -216,13 +199,13 @@ impl CanvasEditor { /// The page's drawings, on top first, with most of their points inside `lasso`, a /// closed path in page points. - pub fn ink_within(&self, lasso: &[[f32; 2]]) -> Vec { + pub(crate) fn ink_within(&self, lasso: &[[f32; 2]]) -> Vec { self.objects .iter() .rev() .filter_map(|object| match object { page::Content::Ink(ink) => { - let offset = page::ink_offset(ink); + let offset = crate::origin(&ink.layout); let points = points(ink); let inside = points .iter() @@ -236,28 +219,11 @@ impl CanvasEditor { } /// The drawing on top whose strokes pass within `reach` of `point`. - pub fn ink_at(&self, point: [f32; 2], reach: f32) -> Option { + pub(crate) fn ink_at(&self, point: [f32; 2], reach: f32) -> Option { self.objects.iter().rev().find_map(|object| match object { page::Content::Ink(ink) => { - let offset = page::ink_offset(ink); - let near = |stroke: &InkStroke| { - let reach = reach + stroke.width.max(stroke.height) / 2.0; - let mut points = stroke - .points - .iter() - .map(|p| [p[0] + offset[0], p[1] + offset[1]]); - let first = points.next(); - first.is_some_and(|first| { - let mut previous = first; - segments_distance([first, first], [point, point]) <= reach - || points.any(|p| { - let near = - segments_distance([previous, p], [point, point]) <= reach; - previous = p; - near - }) - }) - }; + let offset = crate::origin(&ink.layout); + let near = |stroke: &InkStroke| stroke_near(stroke, offset, [point, point], reach); (ink.strokes.iter().any(near) || ink.groups.iter().any(|g| group_touched(g, &near))) .then_some(ink.id) } @@ -271,11 +237,8 @@ impl CanvasEditor { self.objects .iter() .filter_map(|object| match object { - page::Content::Ink(ink) if ids.contains(&ink.id) => { - let [dx, dy] = self.ink_drag_offset(ink.id); - page::ink_bounds(ink) - .map(|[x0, y0, x1, y1]| [x0 + dx, y0 + dy, x1 + dx, y1 + dy]) - } + page::Content::Ink(ink) if ids.contains(&ink.id) => page::ink_bounds(ink) + .map(|bounds| crate::translated(bounds, self.ink_drag_offset(ink.id))), _ => None, }) .reduce(|a, b| { @@ -290,7 +253,7 @@ impl CanvasEditor { /// Shows drawings dragged `delta` from where they lie, without storing it, until the /// drag ends with `move_ink` or `None`. - pub fn drag_ink(&mut self, drag: Option<(Vec, [f32; 2])>) { + pub(crate) fn drag_ink(&mut self, drag: Option<(Vec, [f32; 2])>) { self.ink_drag = drag; } @@ -427,6 +390,25 @@ impl CanvasEditor { } } +/// Whether `stroke`, of a drawing at `offset`, passes within `reach` of segment `path`, its pen's +/// width included. +fn stroke_near(stroke: &InkStroke, offset: [f32; 2], path: [[f32; 2]; 2], reach: f32) -> bool { + let reach = reach + stroke.width.max(stroke.height) / 2.0; + let mut points = stroke + .points + .iter() + .map(|p| [p[0] + offset[0], p[1] + offset[1]]); + let Some(mut previous) = points.next() else { + return false; + }; + segments_distance([previous, previous], path) <= reach + || points.any(|point| { + let near = segments_distance([previous, point], path) <= reach; + previous = point; + near + }) +} + fn group_touched(ink: &Ink, touched: &impl Fn(&InkStroke) -> bool) -> bool { ink.strokes.iter().any(touched) || ink.groups.iter().any(|group| group_touched(group, touched)) } diff --git a/crates/canvas/src/editor/link.rs b/crates/canvas/src/editor/link.rs index add6d2a2c7d587803ae4476380fcb888d4b34be8..d765e7328306bf5ba6b6542ea2c0da2bf375d349 100644 --- a/crates/canvas/src/editor/link.rs +++ b/crates/canvas/src/editor/link.rs @@ -3,18 +3,18 @@ //! typed and ended by a space or Enter becomes a link of its own text, typing after a label //! is plain text, and Remove Link leaves the label as plain text. -use super::format::{leaves_mut, restyle, selected}; +use super::format::restyle; use super::*; /// A link in a paragraph, in UTF-16 offsets of its stored text. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Link { - pub paragraph: usize, + pub(crate) paragraph: usize, /// The hidden field code naming the address, before the label; none where the label is /// its own address. - pub code: Option>, + pub(crate) code: Option>, pub label: Range, - pub target: String, + pub(crate) target: String, } impl Link { @@ -193,7 +193,7 @@ impl CanvasEditor { /// The address of the link drawn under document point `point` of outline `id`, which a /// click opens as OneNote's does. - pub fn link_under(&self, id: ExGuid, [x, y]: [f32; 2]) -> Option { + pub(crate) fn link_under(&self, id: ExGuid, [x, y]: [f32; 2]) -> Option { let outline = self.visible_outlines().find(|outline| outline.id == id)?; let index = outline.paragraph_at(x, y).ok()?; let paragraph = &outline.shaped.paragraphs[index]; @@ -414,7 +414,7 @@ impl CanvasEditor { } /// Select Link: the label of the link at the caret. - pub fn select_link(&mut self) -> Result { + pub(crate) fn select_link(&mut self) -> Result { let [anchor, focus] = self.active_outline().selection.positions; let Some(link) = self.link_at(anchor.min(focus)) else { return Ok(false); @@ -491,25 +491,20 @@ impl CanvasEditor { text: Paragraph, selection: Selection, ) -> Result<(), EditorError> { - let document = &self.active_outline().document; - let at = TextPosition { - paragraph, - offset: 0, - }; - let (container, range, [(id, _), _]) = selected(document, [at; 2].into())?; - let mut replacement = document.container(container)?[range.clone()].to_vec(); - leaves_mut(&mut replacement, &mut |node| { - if node.id == id { - node.text_mut().unwrap().text = text.clone(); - } - }); + let (container, index, node) = self + .active_outline() + .document + .leaf(paragraph) + .ok_or(EditError::InvalidRange)?; + let mut node = node.clone(); + node.text_mut().unwrap().text = text; self.commit( engine, DocumentEdit { columns: BTreeMap::new(), container, - range, - replacement, + range: index..index + 1, + replacement: vec![node], }, selection, ) diff --git a/crates/canvas/src/editor/ops.rs b/crates/canvas/src/editor/ops.rs index 0860c4102ec7da943753d0d5ef1a71cce28515a6..803123ce38e89b0508838b86492241e45de88ee0 100644 --- a/crates/canvas/src/editor/ops.rs +++ b/crates/canvas/src/editor/ops.rs @@ -285,7 +285,6 @@ pub(super) fn layout_ops(id: ExGuid, old: &Layout, new: &Layout) -> Lowered { Ok(ops) } -/// A page picture's stored position, size and description. /// The op giving `target` `tags`, with the definitions they name. pub(super) fn tags( target: ExGuid, @@ -306,6 +305,7 @@ pub(super) fn tags( }] } +/// A page picture's stored position, size and description. pub(super) fn picture_layout(image: &onestore::page::Image) -> Vec { vec![PageOp::Picture { picture: image.id, @@ -404,25 +404,17 @@ impl CanvasEditor { return layout_ops(outline.id, &old, &moved(&outline.layout)); } for object in &self.objects { - match object { - page::Content::Image(image) if image.id == placement.id => return picture(image), - page::Content::Ink(ink) if ink.id == placement.id => { - return layout_ops(ink.id, &old, &moved(&ink.layout)); + if let Some(image) = object.picture().filter(|image| image.id == placement.id) { + return picture(image); + } + match (object, object.layout()) { + (page::Content::ReadOnly(object), Some((id, _))) + if id == placement.id && !matches!(object.source, PageObject::Outline(_)) => + { + return Err(refused("Unsupported objects cannot be moved")); } - page::Content::File { source, .. } if source.id == placement.id => { - return layout_ops(source.id, &old, &moved(&source.layout)); - } - page::Content::Outline { source, .. } if source.id == placement.id => { - return layout_ops(source.id, &old, &moved(&source.layout)); - } - page::Content::ReadOnly(object) if object.source.id() == placement.id => { - return match &object.source { - PageObject::Outline(source) => { - layout_ops(source.id, &old, &moved(&source.layout)) - } - PageObject::Image(image) => picture(image), - _ => Err(refused("Unsupported objects cannot be moved")), - }; + (_, Some((id, layout))) if id == placement.id => { + return layout_ops(id, &old, &moved(layout)); } _ => {} } @@ -467,6 +459,7 @@ impl CanvasEditor { identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects, diff --git a/crates/canvas/src/editor/page.rs b/crates/canvas/src/editor/page.rs index dd0b87d96f241f0c04141c58ac7da1a204974647..407cffec76e14c78b84c9b41399f9eda87ae26af 100644 --- a/crates/canvas/src/editor/page.rs +++ b/crates/canvas/src/editor/page.rs @@ -10,19 +10,19 @@ use std::collections::BTreeMap; /// A title object's own state, plus the child origins `build` replaces with page coordinates. pub(crate) struct TitleArea { - pub id: onestore::ExGuid, - pub date: Option, - pub layout: onestore::document::Layout, - pub origins: BTreeMap; 2]>, + pub(crate) id: onestore::ExGuid, + pub(crate) date: Option, + pub(crate) layout: onestore::document::Layout, + pub(crate) origins: BTreeMap; 2]>, } pub(crate) struct Import { - pub objects: Vec, - pub outlines: Vec, - pub date: Option, - pub areas: Vec, + pub(crate) objects: Vec, + pub(crate) outlines: Vec, + pub(crate) date: Option, + pub(crate) areas: Vec, /// The paragraph each outline holding no text shows after its objects, not stored. - pub provisional: BTreeMap, + pub(crate) provisional: BTreeMap, } pub(crate) enum Content { @@ -95,9 +95,8 @@ impl Content { let Self::File { source, layout } = self else { return None; }; - let [x, y] = [source.layout.x, source.layout.y].map(|v| v.unwrap_or(0.0)); - let [x0, y0, x1, y1] = layout.bounds(); - Some((source, [x + x0, y + y0, x + x1, y + y1])) + let origin = crate::origin(&source.layout); + Some((source, crate::translated(layout.bounds(), origin))) } /// A tagged picture or file: its identity, note tags and bounds in page points. @@ -106,7 +105,7 @@ impl Content { ) -> Option<(onestore::ExGuid, &[onestore::document::Tag], [f32; 4])> { let (id, tags, bounds) = match self { Self::Image(image) => { - let [x, y] = [image.layout.x, image.layout.y].map(|v| v.unwrap_or(0.0)); + let [x, y] = crate::origin(&image.layout); let [width, height] = crate::outline::image_size(image)?; (image.id, &image.tags, [x, y, x + width, y + height]) } @@ -143,14 +142,11 @@ impl ReadOnlyObject { [0.0; 2] }; let layout = source.layout(); - let x = layout.x.unwrap_or(0.0) + offset[0]; - let y = layout.y.unwrap_or(0.0) + offset[1]; let width = layout.max_width.unwrap_or(160.0); let height = layout.max_height.unwrap_or(42.0); - if [x, y, width, height].iter().any(|v| !v.is_finite()) || width <= 0.0 || height <= 0.0 { + if ![width, height].iter().all(|v| v.is_finite() && *v > 0.0) { return Err(EditorError::InvalidGeometry); } - let width = width.max(160.0); let label = engine.layout( &Paragraph::new( message.into(), @@ -160,21 +156,21 @@ impl ReadOnlyObject { ..Default::default() }, ), - width - 16.0, + width.max(160.0) - 16.0, )?; - let height = height.max(label.height() + 16.0); - let rect = [x, y, x + width, y + height]; - if rect.iter().any(|v| !v.is_finite()) { - return Err(EditorError::InvalidGeometry); - } - Ok(Box::new(Self { + let object = Box::new(Self { source, message, label, offset, - })) + }); + if object.rect().iter().any(|v| !v.is_finite()) { + return Err(EditorError::InvalidGeometry); + } + Ok(object) } - pub fn rect(&self) -> [f32; 4] { + + pub(crate) fn rect(&self) -> [f32; 4] { let layout = self.source.layout(); let x = layout.x.unwrap_or(0.0) + self.offset[0]; let y = layout.y.unwrap_or(0.0) + self.offset[1]; @@ -206,10 +202,7 @@ pub(crate) fn build( for object in std::mem::take(&mut page.objects) { match &object { PageObject::Outline(outline) => { - let origin = [ - outline.layout.x.unwrap_or(0.0), - outline.layout.y.unwrap_or(0.0), - ]; + let origin = crate::origin(&outline.layout); if origin.iter().any(|v| !v.is_finite()) { return Err(EditorError::InvalidGeometry); } @@ -377,10 +370,7 @@ pub(crate) fn build( objects.push(Content::unavailable(object, engine)?); continue; }; - let origin = [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ]; + let origin = crate::origin(&source.layout); if origin.iter().any(|v| !v.is_finite()) || size.iter().any(|v| !v.is_finite() || *v <= 0.0) || !(origin[0] + size[0]).is_finite() @@ -435,12 +425,7 @@ pub(crate) fn build( /// The painted extent of a page's ink drawing, pen included, as `[x0, y0, x1, y1]` page /// points. pub(crate) fn ink_bounds(ink: &Ink) -> Option<[f32; 4]> { - let [x, y] = ink_offset(ink); - stroke_bounds(ink).map(|[x0, y0, x1, y1]| [x0 + x, y0 + y, x1 + x, y1 + y]) -} - -pub(crate) fn ink_offset(ink: &Ink) -> [f32; 2] { - [ink.layout.x.unwrap_or(0.0), ink.layout.y.unwrap_or(0.0)] + stroke_bounds(ink).map(|bounds| crate::translated(bounds, crate::origin(&ink.layout))) } /// The painted extent of every stroke before the drawing's offset. diff --git a/crates/canvas/src/editor/recording.rs b/crates/canvas/src/editor/recording.rs index 7093635c1c82c3f5c86b8d44fcc662dd1e307f1a..4149634ba7bdc414d6d70af2184e857b9ca2559d 100644 --- a/crates/canvas/src/editor/recording.rs +++ b/crates/canvas/src/editor/recording.rs @@ -259,7 +259,7 @@ const BUTTON: [f32; 2] = [10.5, 24.0]; impl CanvasEditor { /// The recording `id` names, in an outline or on the page. - pub fn recording_file(&self, id: [u8; 16]) -> Option<&Attachment> { + pub(crate) fn recording_file(&self, id: [u8; 16]) -> Option<&Attachment> { let named = |file: &&Attachment| file.recording.is_some_and(|r| r.id == id); self.objects .iter() @@ -293,7 +293,7 @@ impl CanvasEditor { /// The play button OneNote shows for document point `point`: beside the linked note or /// the recording level with it, over its outline or in the margin before it. Gives the /// button's square, the recording and the moment it plays from. - pub fn play_button(&self, point: [f32; 2]) -> Option<([f32; 4], [u8; 16], u32)> { + pub(crate) fn play_button(&self, point: [f32; 2]) -> Option<([f32; 4], [u8; 16], u32)> { let [x, y] = point; let outline = self.visible_outlines().find(|outline| { let bounds = outline.bounds(); diff --git a/crates/canvas/src/editor/space.rs b/crates/canvas/src/editor/space.rs index 0b5de50edeb65abfc58b5e5bf49e462728b9203a..cda163046025f08c1187d7827efd16a488ec6d93 100644 --- a/crates/canvas/src/editor/space.rs +++ b/crates/canvas/src/editor/space.rs @@ -68,7 +68,7 @@ impl CanvasEditor { layout, below_title: None, } => { - let [x, y] = [source.layout.x, source.layout.y].map(|v| v.unwrap_or(0.0)); + let [x, y] = crate::origin(&source.layout); (source.id, [x, y, x + layout.size[0], y + layout.size[1]]) } page::Content::Image(image) => { @@ -109,13 +109,13 @@ impl CanvasEditor { /// How far back from `line` Insert Space can take the page along `axis`: never over what /// stays before the line, so at most zero. - pub fn space_limit(&self, axis: usize, line: f32) -> f32 { + pub(crate) fn space_limit(&self, axis: usize, line: f32) -> f32 { (self.spaced(axis, line).1 - line).min(0.0) } /// The extents, as `[x0, y0, x1, y1]` page points, of what Insert Space at `line` along /// `axis` moves. - pub fn space_preview(&self, axis: usize, line: f32) -> Vec<[f32; 4]> { + pub(crate) fn space_preview(&self, axis: usize, line: f32) -> Vec<[f32; 4]> { self.spaced(axis, line) .0 .into_iter() @@ -156,7 +156,7 @@ impl CanvasEditor { let layout = self.object_layout_mut(id).unwrap(); // Undo restores an unset coordinate as the zero it stands for, as ops // cannot unset one. - let origin = [layout.x, layout.y].map(|v| v.unwrap_or(0.0)); + let origin = crate::origin(layout); let previous = origin.map(Some); [layout.x, layout.y] = shift(origin).map(Some); self.undo.push(History::Position { @@ -182,27 +182,16 @@ impl CanvasEditor { } }; if let Err(error) = result { - self.group(depth); + self.group(depth, false); return Err(error); } } - self.group(depth); + self.group(depth, false); self.redo.clear(); self.preferred_x = None; Ok(true) } - /// Makes the history entries past `depth` one undo step that leaves the selection alone. - fn group(&mut self, depth: usize) { - let entries = self.undo.split_off(depth); - if !entries.is_empty() { - self.undo.push(History::Group { - entries, - page: false, - }); - } - } - /// Parts outline `id`'s root nodes from `at` into new outline `part` at `position`, which /// takes the rest of the outline's layout; returns each root `part` then holds with the /// parent it had. diff --git a/crates/canvas/src/editor/table.rs b/crates/canvas/src/editor/table.rs index 243170bf8c5dd8b62dace0d22d9f22abbf25e9a7..ec41efe676b9f9de3945bc54a46c0317827c05c1 100644 --- a/crates/canvas/src/editor/table.rs +++ b/crates/canvas/src/editor/table.rs @@ -65,16 +65,59 @@ fn empty_cell(source: &TableCell) -> Result { Default::default(), )?, }; + new_cell(source.indents.clone(), source.shading, vec![node]) +} + +/// A new cell of `paragraphs`. +fn new_cell( + indents: Vec, + shading: Option, + paragraphs: Vec, +) -> Result { Ok(TableCell { id: new_id()?, layout: Default::default(), - indents: source.indents.clone(), - shading: source.shading, - paragraphs: vec![node], + indents, + shading, + paragraphs, unsupported: Vec::new(), }) } +/// A new bordered table of `rows` and `columns` new columns, in `source`'s place in the +/// outline's tree. +fn table_paragraph( + source: &PageParagraph, + columns: usize, + rows: Vec, +) -> Result { + Ok(PageParagraph { + id: new_id()?, + parent: source.parent, + level: source.level, + style: None, + format: source.format.clone(), + lists: Vec::new(), + tags: Vec::new(), + media: Default::default(), + collapsed: false, + content: ParagraphContent::Table(Table { + id: new_id()?, + columns: vec![ + TableColumn { + width: COLUMN_WIDTH, + locked: false + }; + columns + ], + rows, + borders: Some(true), + layout: Default::default(), + tags: Vec::new(), + }), + }) +} + fn cell_range(document: &TextDocument, cell: &TableCell) -> Result, EditError> { let mut content = leaves(&cell.paragraphs, None); let (_, _, first) = content.next().ok_or(EditError::InvalidStructure)?; @@ -250,7 +293,11 @@ impl CanvasEditor { impl TextOutline { /// The table column whose right border lies within `reach` of outline-local `point`, as /// `(table, column, width)`. - pub fn column_border(&self, point: [f32; 2], reach: f32) -> Option<(ExGuid, usize, f32)> { + pub(crate) fn column_border( + &self, + point: [f32; 2], + reach: f32, + ) -> Option<(ExGuid, usize, f32)> { let columns = descendants(self.document.nodes(), None) .filter_map(|(_, _, node)| match &node.content { ParagraphContent::Table(table) => Some((table.id, table.columns.len())), @@ -276,7 +323,7 @@ impl TextOutline { impl CanvasEditor { /// The active outline with column `column` of `table` `width` wide, as a border drag /// shows it before release. - pub fn preview_column( + pub(crate) fn preview_column( &self, engine: &mut TextEngine, table: ExGuid, @@ -383,53 +430,23 @@ impl CanvasEditor { let text = &node.text().unwrap().text; let end = text.utf16_offset(text.text().len())?; let format = text.format_at(caret.offset)?; - let cell = || -> Result { + let empty = || -> Result { let mut paragraph = crate::document::node( Paragraph::new(String::new(), format.clone()), node.format.clone(), )?; paragraph.style = node.style; - Ok(TableCell { - id: new_id()?, - layout: Default::default(), - indents: outline.indents.clone(), - shading: None, - paragraphs: vec![paragraph], - unsupported: Vec::new(), + new_cell(outline.indents.clone(), None, vec![paragraph]) + }; + let rows = (0..rows) + .map(|_| { + Ok(TableRow { + id: new_id()?, + cells: (0..columns).map(|_| empty()).collect::>()?, + }) }) - }; - let table = PageParagraph { - id: new_id()?, - parent: node.parent, - level: node.level, - style: None, - format: node.format.clone(), - lists: Vec::new(), - tags: Vec::new(), - media: Default::default(), - collapsed: false, - content: ParagraphContent::Table(onestore::page::Table { - id: new_id()?, - columns: vec![ - TableColumn { - width: COLUMN_WIDTH, - locked: false - }; - columns - ], - rows: (0..rows) - .map(|_| { - Ok(TableRow { - id: new_id()?, - cells: (0..columns).map(|_| cell()).collect::>()?, - }) - }) - .collect::>()?, - borders: Some(true), - layout: Default::default(), - tags: Vec::new(), - }), - }; + .collect::>()?; + let table = table_paragraph(node, columns, rows)?; let parent = |candidate: &PageParagraph| candidate.parent == Some(node.id); let childless = !outline.document.container(container)?.iter().any(parent); let (edit, first) = if end == 0 && childless { @@ -489,12 +506,8 @@ impl CanvasEditor { let format = source.text().unwrap().text.format_at(focus.offset)?; let mut split = outline.document.replace( focus..focus, - vec![ - Paragraph::new(String::new(), format.clone()), - Paragraph::new(String::new(), format.clone()), - ], + vec![Paragraph::new(String::new(), format.clone()); 2], )?; - let id = new_id()?; // The table's paragraph holds the list, tags and children (`evidence/structural-edits/ // xml/c6-*-midtab.xml`, `c10-tab-parent-1.xml`). let children = split.replacement.split_off(2); @@ -511,44 +524,20 @@ impl CanvasEditor { paragraph.level = 1; paragraph.parent = None; paragraph.lists.clear(); - Ok(TableCell { - id: new_id()?, - layout: Default::default(), - indents: outline.indents.clone(), - shading: None, - paragraphs: vec![paragraph], - unsupported: Vec::new(), - }) + new_cell(outline.indents.clone(), None, vec![paragraph]) }) .collect::, EditError>>()?; + let row = TableRow { + id: new_id()?, + cells, + }; let wrapper = PageParagraph { - id, - parent: source.parent, - level: source.level, - style: None, - format: source.format.clone(), lists, tags, - media: Default::default(), collapsed, - content: ParagraphContent::Table(onestore::page::Table { - id: new_id()?, - columns: vec![ - TableColumn { - width: COLUMN_WIDTH, - locked: false - }; - 2 - ], - rows: vec![TableRow { - id: new_id()?, - cells, - }], - borders: Some(true), - layout: Default::default(), - tags: Vec::new(), - }), + ..table_paragraph(source, 2, vec![row])? }; + let id = wrapper.id; split.replacement.push(wrapper); split .replacement @@ -598,22 +587,12 @@ impl CanvasEditor { let format = source.text().unwrap().text.format_at(focus.offset)?; let split = outline.document.replace( focus..focus, - vec![ - Paragraph::new(String::new(), format.clone()), - Paragraph::new(String::new(), format.clone()), - ], + vec![Paragraph::new(String::new(), format.clone()); 2], )?; - let cell = &mut table.rows[0].cells[location.column]; - cell.paragraphs.splice(split.range, split.replacement); - let paragraphs = cell.paragraphs.split_off(local + 1); - let target = TableCell { - id: new_id()?, - layout: Default::default(), - indents: cell.indents.clone(), - shading: cell.shading, - paragraphs, - unsupported: Vec::new(), - }; + let source = &mut table.rows[0].cells[location.column]; + source.paragraphs.splice(split.range, split.replacement); + let paragraphs = source.paragraphs.split_off(local + 1); + let target = new_cell(source.indents.clone(), source.shading, paragraphs)?; table.rows[0].cells.push(target); table.columns.push(TableColumn { width: COLUMN_WIDTH, @@ -722,7 +701,7 @@ impl CanvasEditor { let ParagraphContent::Table(table) = &mut wrapper.content else { unreachable!() }; - let (replacement, next) = if exit { + let replacement = if exit { table.rows.pop(); let blank = || { Ok::<_, EditError>(PageParagraph { @@ -732,14 +711,7 @@ impl CanvasEditor { ..self.blank_paragraph(source)? }) }; - let (first, second) = (blank()?, blank()?); - ( - vec![wrapper, first, second], - TextPosition { - paragraph: focus.paragraph + 1, - offset: 0, - }, - ) + vec![wrapper, blank()?, blank()?] } else { let cells = row .cells @@ -750,13 +722,11 @@ impl CanvasEditor { id: new_id()?, cells, }); - ( - vec![wrapper], - TextPosition { - paragraph: focus.paragraph + 1, - offset: 0, - }, - ) + vec![wrapper] + }; + let next = TextPosition { + paragraph: focus.paragraph + 1, + offset: 0, }; self.commit( engine, diff --git a/crates/canvas/src/gpu/page.rs b/crates/canvas/src/gpu/page.rs index e08881737341bb0d2206f1a8e3c37563688c9bb3..9142cd115e8945e2db9350aea161d90f7909b76f 100644 --- a/crates/canvas/src/gpu/page.rs +++ b/crates/canvas/src/gpu/page.rs @@ -301,7 +301,7 @@ impl PageScene { /// Follows `editor` after an edit or undo brought page-level pictures the scene has not /// seen, as `refresh` does. - pub fn follow( + pub(crate) fn follow( &mut self, editor: &mut CanvasEditor, engine: &mut TextEngine, @@ -415,7 +415,7 @@ impl PageScene { /// this thread; `waker` is woken when one lands and the page should be drawn again. /// Call before collecting each frame's primitives. True once everything in view shows /// its raster for this paper and scale. - pub fn update_pictures( + pub(crate) fn update_pictures( &mut self, editor: Option<&CanvasEditor>, view: [f32; 4], @@ -468,37 +468,32 @@ impl PageScene { [x, y]: [f32; 2], rects: &mut Vec<(onestore::ExGuid, [f32; 4])>, ) { - rects.extend(layout.objects.iter().map(|object| { - let [x0, y0, x1, y1] = object.rect; - (object.id, [x0 + x, y0 + y, x1 + x, y1 + y]) - })); + rects.extend( + layout + .objects + .iter() + .map(|object| (object.id, crate::translated(object.rect, [x, y]))), + ); } let mut rects = Vec::new(); for content in self.objects(editor).into_iter().flatten() { match content { Content::Image(source) => { - let [x, y] = [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ]; + let [x, y] = crate::origin(&source.layout); if let Some([width, height]) = crate::outline::image_size(source) { rects.push((source.id, [x, y, x + width, y + height])); } } Content::File { source, layout } => { - let [x, y] = [source.layout.x, source.layout.y].map(|v| v.unwrap_or(0.0)); - let [x0, y0, x1, y1] = layout.rect; - rects.push((source.id, [x + x0, y + y0, x + x1, y + y1])); + let origin = crate::origin(&source.layout); + rects.push((source.id, crate::translated(layout.rect, origin))); } Content::Outline { source, layout, below_title, } => { - let origin = [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ]; + let origin = crate::origin(&source.layout); if let Ok(origin) = outline_origin(origin, *below_title, editor) { outline(layout, origin, &mut rects); } @@ -518,7 +513,7 @@ impl PageScene { /// Pictures, files and handwriting inside an outline whose origin is `origin`. /// `moving` draws one picture at a previewed rectangle, in the same coordinates as `origin`. - pub fn append_outline_objects<'a>( + pub(crate) fn append_outline_objects<'a>( &'a self, outline: &'a crate::outline::OutlineLayout, origin: [f32; 2], @@ -541,15 +536,9 @@ impl PageScene { paper: Paper, primitives: &mut Vec>, ) { - let [x0, y0, x1, y1] = object.rect; let rect = match moving { Some((id, rect)) if id == object.id => rect, - _ => [ - x0 + origin[0], - y0 + origin[1], - x1 + origin[0], - y1 + origin[1], - ], + _ => crate::translated(object.rect, origin), }; let picture = self.pictures.get(&object.id); if let Some(image) = picture.and_then(Picture::image) { @@ -644,7 +633,7 @@ impl PageScene { /// Bounds of noneditable content in page coordinates, each with whether OneNote's view /// leaves room beyond it: a picture's corner is as far as the view reaches. - pub fn content_bounds<'a>( + pub(crate) fn content_bounds<'a>( &'a self, editor: &'a CanvasEditor, ) -> impl Iterator + 'a { @@ -657,15 +646,9 @@ impl PageScene { layout, below_title, } => { - let origin = outline_origin( - [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ], - *below_title, - Some(editor), - ) - .ok()?; + let origin = + outline_origin(crate::origin(&source.layout), *below_title, Some(editor)) + .ok()?; Some(( [ origin[0], @@ -679,10 +662,7 @@ impl PageScene { Content::Date { below_title } => { let date = editor.date()?; let origin = outline_origin( - [ - date.source().layout.x.unwrap_or(0.0), - date.source().layout.y.unwrap_or(0.0), - ], + crate::origin(&date.source().layout), *below_title, Some(editor), ) @@ -699,7 +679,7 @@ impl PageScene { )) } Content::Image(source) => { - let [x, y] = [source.layout.x, source.layout.y].map(|v| v.unwrap_or(0.0)); + let [x, y] = crate::origin(&source.layout); let [width, height] = crate::outline::image_size(source)?; Some(([x, y, x + width, y + height], false)) } @@ -710,7 +690,7 @@ impl PageScene { }) } - pub fn date_fields( + pub(crate) fn date_fields( &self, editor: &CanvasEditor, ) -> impl Iterator { @@ -721,13 +701,9 @@ impl PageScene { .into_iter() .flatten() .find_map(|object| match object { - Content::Date { below_title } => Some(( - [ - date.source().layout.x.unwrap_or(0.0), - date.source().layout.y.unwrap_or(0.0), - ], - *below_title, - )), + Content::Date { below_title } => { + Some((crate::origin(&date.source().layout), *below_title)) + } _ => None, }) && let Ok(origin) = outline_origin(origin, title, Some(editor)) @@ -794,10 +770,7 @@ impl PageScene { } } Content::Image(source) if !source.background => { - let [x, y] = [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ]; + let [x, y] = crate::origin(&source.layout); if let Some([width, height]) = crate::outline::image_size(source) && (x..=x + width).contains(&point[0]) && (y..=y + height).contains(&point[1]) @@ -846,14 +819,7 @@ impl PageScene { layout, below_title, } => { - let [x, y] = outline_origin( - [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ], - *below_title, - None, - )?; + let [x, y] = outline_origin(crate::origin(&source.layout), *below_title, None)?; cover([x, y, x + layout.size[0], y + layout.size[1]], false); for paragraph in &layout.paragraphs { let [px, py] = [x + paragraph.origin[0], y + paragraph.origin[1]]; @@ -869,10 +835,7 @@ impl PageScene { } } Content::Image(source) => { - let [x, y] = [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ]; + let [x, y] = crate::origin(&source.layout); let size = match self.backgrounds.get(&source.id) { Some(art) => Some(art.size), None => crate::outline::image_size(source), @@ -912,7 +875,7 @@ impl PageScene { /// `moving` draws one picture at a previewed rectangle instead of its stored layout. /// Outlines the editor does not hold draw their tags' symbols. - pub fn append_primitives_with<'a, E: From>( + pub(crate) fn append_primitives_with<'a, E: From>( &'a self, primitives: &mut Vec>, offset: [f32; 2], @@ -927,39 +890,16 @@ impl PageScene { source, below_title, .. - } => outline_origin( - [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ], - *below_title, - editor, - )?, + } => outline_origin(crate::origin(&source.layout), *below_title, editor)?, Content::Date { below_title } => { let date = editor .and_then(CanvasEditor::date) .ok_or(SceneError::MissingOutline)?; - outline_origin( - [ - date.source().layout.x.unwrap_or(0.0), - date.source().layout.y.unwrap_or(0.0), - ], - *below_title, - editor, - )? + outline_origin(crate::origin(&date.source().layout), *below_title, editor)? } - Content::Image(source) => [ - source.layout.x.unwrap_or(0.0), - source.layout.y.unwrap_or(0.0), - ], + Content::Image(source) => crate::origin(&source.layout), Content::ReadOnly(object) => { - let [x0, y0, x1, y1] = object.rect(); - let rect = [ - x0 + offset[0], - y0 + offset[1], - x1 + offset[0], - y1 + offset[1], - ]; + let rect = crate::translated(object.rect(), offset); append_placeholder(rect, paper, primitives); primitives.push(Primitive::Text { clip: None, @@ -974,7 +914,7 @@ impl PageScene { continue; } Content::Ink(ink) => { - let [x, y] = crate::editor::page::ink_offset(ink); + let [x, y] = crate::origin(&ink.layout); let [dx, dy] = editor.map_or([0.0; 2], |editor| editor.ink_drag_offset(ink.id)); let offset = [offset[0] + x + dx, offset[1] + y + dy]; append_ink(ink, offset, paper.ink, primitives); @@ -984,7 +924,7 @@ impl PageScene { // A dragged file draws where its column would land. let [x, y] = match moving { Some((id, [x0, y0, ..])) if id == source.id => [x0, y0], - _ => [source.layout.x, source.layout.y].map(|v| v.unwrap_or(0.0)), + _ => crate::origin(&source.layout), }; self.append_object( layout, @@ -1043,12 +983,7 @@ impl PageScene { continue; }; let rect = match moving { - Some((id, [x0, y0, x1, y1])) if id == source.id => [ - x0 + offset[0], - y0 + offset[1], - x1 + offset[0], - y1 + offset[1], - ], + Some((id, rect)) if id == source.id => crate::translated(rect, offset), _ => [ object_origin[0], object_origin[1], @@ -1120,7 +1055,7 @@ impl PageScene { impl crate::outline::OutlineLayout { /// Paragraphs that may paint between outline-local `rows`, with their indices. - pub fn visible( + pub(crate) fn visible( &self, rows: [f32; 2], ) -> impl Iterator { @@ -1141,7 +1076,7 @@ impl crate::outline::OutlineLayout { /// Highlights behind the paragraphs `visible` finds between outline-local `rows`. A black /// highlight paints in the paper's ink, censoring the automatic text on it in any theme. /// A paragraph's band spans its outline, or its cell, tinted for the paper. - pub fn append_background_primitives( + pub(crate) fn append_background_primitives( &self, primitives: &mut Vec>, origin: [f32; 2], @@ -1200,7 +1135,7 @@ impl crate::outline::OutlineLayout { /// One paragraph of this outline, whose origin is `origin`: its text or equation, list /// markers and tags, those `art` maps drawn with their art. - pub fn append_paragraph_primitives<'a>( + pub(crate) fn append_paragraph_primitives<'a>( &'a self, index: usize, paragraph: &'a crate::outline::ParagraphLayout, @@ -1291,7 +1226,7 @@ impl crate::outline::OutlineLayout { /// The note tags of this outline's tables, pictures and files, whose origin is `origin`, /// those `art` maps drawn with their art. - pub fn append_block_tag_primitives( + pub(crate) fn append_block_tag_primitives( &self, primitives: &mut Vec>, origin: [f32; 2], @@ -1316,7 +1251,7 @@ impl crate::outline::OutlineLayout { } } - pub fn append_table_primitives( + pub(crate) fn append_table_primitives( &self, primitives: &mut Vec>, origin: [f32; 2], @@ -1409,6 +1344,7 @@ mod tests { created: Some(1), title: "Header".into(), margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -1858,6 +1794,7 @@ mod tests { created: None, title: "Header".into(), margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -1934,6 +1871,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2020,6 +1958,7 @@ mod tests { created: None, title: String::new(), margin_origin: [36.0, 14.0], + rtl: false, color: None, rule_lines: None, objects: vec![unsupported, PageObject::Outline(editable)], @@ -2108,6 +2047,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2294,6 +2234,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2478,6 +2419,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2592,6 +2534,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2689,6 +2632,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), @@ -2763,6 +2707,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), diff --git a/crates/canvas/src/gpu/page/background.rs b/crates/canvas/src/gpu/page/background.rs index cc3c0147e062c69d82c3636e4955d5f6295a11ec..adb2ffe47df38eb4303d2c9a70969c370ef6195b 100644 --- a/crates/canvas/src/gpu/page/background.rs +++ b/crates/canvas/src/gpu/page/background.rs @@ -410,11 +410,11 @@ const INLINE_PIXELS: f32 = 1024.0 * 1024.0; pub(super) struct Background { svg: &'static str, /// Points; OneNote draws a picture without a stored size at its natural size. - pub size: [f32; 2], + pub(crate) size: [f32; 2], /// For light and for dark paper. variants: [Variant; 2], /// Whether the first raster is made on the frame's thread rather than awaited. - pub inline: bool, + pub(crate) inline: bool, } /// A raster's device pixels per point, and the dark paper it was recoloured for. @@ -430,19 +430,19 @@ struct Variant { impl Background { /// The rasters made so far, for light and for dark paper. - pub fn images(&self) -> impl Iterator { + pub(crate) fn images(&self) -> impl Iterator { self.variants .iter() .filter_map(|variant| variant.shown.as_ref().map(|(image, _)| image)) } /// Whether both recreate the same template picture at the same size. - pub fn same(&self, other: &Self) -> bool { + pub(crate) fn same(&self, other: &Self) -> bool { self.svg == other.svg && self.size == other.size } /// OneNote's template pictures by their hash, and those Snowbound wrote by their marker. - pub fn recognise(picture: &onestore::page::Image) -> Option { + pub(crate) fn recognise(picture: &onestore::page::Image) -> Option { let bytes = picture.bytes.as_deref()?; let digest: String = Sha256::digest(bytes) .iter() @@ -472,7 +472,7 @@ impl Background { } /// The latest raster for this paper, if one has landed. - pub fn image(&self, paper: Paper) -> Option<&RasterImage> { + pub(crate) fn image(&self, paper: Paper) -> Option<&RasterImage> { let (image, _) = self.variants[usize::from(dark(paper))].shown.as_ref()?; Some(image) } @@ -480,7 +480,7 @@ impl Background { /// Takes a finished raster and asks the worker for one at `scale` device pixels per /// point when the shown one differs; `waker` hears when it lands. True once the raster /// shown matches. - pub fn update(&mut self, paper: Paper, scale: f32, waker: &Waker) -> bool { + pub(crate) fn update(&mut self, paper: Paper, scale: f32, waker: &Waker) -> bool { let dark = dark(paper); let [width, height] = self.size.map(|side| side.max(1.0)); let density = density(scale) @@ -958,6 +958,7 @@ mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: BTreeMap::new(), diff --git a/crates/canvas/src/gpu/page/picture.rs b/crates/canvas/src/gpu/page/picture.rs index bd44b77d4d43ec0c89ff94ed6ecce472864b688b..8d79bece61f304c13de7274b539e2eec15ee891b 100644 --- a/crates/canvas/src/gpu/page/picture.rs +++ b/crates/canvas/src/gpu/page/picture.rs @@ -30,12 +30,12 @@ pub(super) struct Picture { } impl Picture { - /// Reads the size from the picture's header; None when the renderer cannot decode it. /// Whether both show the same stored bytes. - pub fn same(&self, other: &Self) -> bool { + pub(crate) fn same(&self, other: &Self) -> bool { self.bytes == other.bytes } + /// Reads the size from the picture's header; None when the renderer cannot decode it. pub fn new(bytes: &Arc<[u8]>) -> Option { Some(Self { native: RasterImage::measure(bytes).ok()?, @@ -48,11 +48,11 @@ impl Picture { } /// The latest raster, once one has landed. - pub fn image(&self) -> Option<&RasterImage> { + pub(crate) fn image(&self) -> Option<&RasterImage> { self.shown.as_ref() } - pub fn failed(&self) -> bool { + pub(crate) fn failed(&self) -> bool { self.failed } } diff --git a/crates/canvas/src/interaction/accessibility.rs b/crates/canvas/src/interaction/accessibility.rs index 3857899ec81a54fcfb5719874f3bdd3ae2eb5a42..74243d1aaddb8bef62999192323c17ca7fb2e692 100644 --- a/crates/canvas/src/interaction/accessibility.rs +++ b/crates/canvas/src/interaction/accessibility.rs @@ -722,6 +722,7 @@ pub(super) mod tests { title: "Header".into(), created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -816,6 +817,7 @@ pub(super) mod tests { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), diff --git a/crates/canvas/src/interaction/mod.rs b/crates/canvas/src/interaction/mod.rs index b3434707f3bd76166c7717b0c4511d6cb95af81f..7437e110637d1fbe2999ee7a00238e7c1fb0b30b 100644 --- a/crates/canvas/src/interaction/mod.rs +++ b/crates/canvas/src/interaction/mod.rs @@ -35,7 +35,7 @@ const HANDLE_HEIGHT: f32 = 6.75; /// Accessible names of the page date's fields. pub const DATE_LABELS: [&str; 2] = ["Page date", "Page time"]; -pub type Result = std::result::Result>; +pub(crate) type Result = std::result::Result>; #[derive(Clone, Copy, Debug, PartialEq)] pub enum Cursor { @@ -112,7 +112,7 @@ pub struct Correction { pub struct Response { pub changed: bool, pub moved: bool, - pub redraw: bool, + pub(crate) redraw: bool, pub request: Option, } @@ -359,7 +359,7 @@ impl PageView { } /// Shows a page reloaded from storage in place of the edited one, whose editor it returns. - pub fn replace( + pub(crate) fn replace( &mut self, mut editor: CanvasEditor, scene: Option<(PageScene, [f32; 2])>, @@ -435,10 +435,16 @@ impl PageView { } } - /// OneNote 2010 opens a page scrolled fully left and up, however far down its content - /// lies. + /// OneNote 2010 opens a page scrolled fully up, however far down its content lies, and + /// fully left, or right on a right-to-left page. fn place_opened(&mut self) { - self.viewport.origin = self.scroll().min.map(|offset| -offset); + let scroll = self.scroll(); + let x = if self.editor.rtl() { + scroll.max[0] + } else { + scroll.min[0] + }; + self.viewport.origin = [-x, -scroll.min[1]]; } pub fn modifiers(&self) -> Modifiers { @@ -480,6 +486,12 @@ impl PageView { self.object_focus.is_none() } + /// Edits from the toolbar and menus wait while an input method composes or an object holds + /// focus. + fn edits_wait(&self) -> bool { + !self.accepts_text() || self.editor.marked_range().is_some() + } + /// The outline being dragged and where it would land. pub fn outline_preview(&self) -> Option<(onestore::ExGuid, [f32; 2])> { let Drag::Outline { @@ -624,7 +636,7 @@ impl PageView { /// Page coordinates of a focused object. fn object_rect(&self, focus: ObjectFocus) -> [f32; 4] { let (scene, offset) = self.scene.as_ref().unwrap(); - let [x0, y0, x1, y1] = match focus { + let rect = match focus { ObjectFocus::ReadOnly(index) => scene .read_only(Some(&self.editor)) .nth(index) @@ -636,12 +648,7 @@ impl PageView { } ObjectFocus::File(id) => self.editor.attachment_rect(id).unwrap(), }; - [ - x0 + offset[0], - y0 + offset[1], - x1 + offset[0], - y1 + offset[1], - ] + crate::translated(rect, *offset) } /// Keeps the view in bounds and restarts the caret blink after a change. @@ -778,10 +785,7 @@ impl PageView { return self.moved(); } } - Ok(Response { - redraw: true, - ..Response::default() - }) + Ok(Response::redraw()) } /// Moves the caret by lines until it has gone a view's height, then scrolls as far so @@ -881,18 +885,16 @@ impl PageView { .content_bounds(&self.editor) .map(move |(rect, padded)| { ( - [ - rect[0] + offset[0], - rect[1] + offset[1], - rect[2] + offset[0], - rect[3] + offset[1], - ], + crate::translated(rect, *offset), if padded { pad } else { 0.0 }, ) }) }); - let mut scroll = - scroll::Scroll::new(self.viewport, editable.map(|rect| (rect, pad)).chain(fixed)); + let mut scroll = scroll::Scroll::new( + self.viewport, + editable.map(|rect| (rect, pad)).chain(fixed), + self.editor.rtl(), + ); if let Some(reach) = self.reach { for axis in 0..2 { scroll.min[axis] = scroll.min[axis].min(reach[axis] * self.viewport.scale); @@ -989,17 +991,7 @@ impl PageView { preview, self.object_focus, Paint { - caret: if self.focused - && !matches!( - self.drag, - Some( - Drag::Outline { .. } - | Drag::Resize { .. } - | Drag::Column { .. } - | Drag::Image { .. } - | Drag::Space { .. } - ) - ) { + caret: if self.focused && matches!(self.drag, None | Some(Drag::Text { .. })) { self.caret } else { 0.0 @@ -1069,7 +1061,6 @@ impl PageView { if self.drawing() { return Cursor::Crosshair; } - let point = self.viewport.document_point(self.pointer); if self.drag.is_none() && self.play_button(point).is_some() { return Cursor::Pointer; } @@ -1111,8 +1102,12 @@ impl PageView { (repaint, hold.map(|hold| now + hold)) } - /// `size` in device pixels. + /// `size` in device pixels. A right-to-left page keeps its right edge in place, as + /// OneNote 2010's does. pub fn resized(&mut self, size: [u32; 2]) -> Result { + if self.editor.rtl() { + self.viewport.origin[0] += size[0] as f32 - self.viewport.size[0] as f32; + } self.viewport.size = size; if size.contains(&0) { return Ok(Response::default()); @@ -1534,7 +1529,7 @@ impl PageView { { return self.edited(); } - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok(Response::default()); } self.editor.format(&mut self.engine, command)?; @@ -1783,7 +1778,7 @@ impl PageView { /// Alt+= and the toolbar's Equation: see [`CanvasEditor::insert_equation`]. pub fn insert_equation(&mut self) -> Result { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok(Response::default()); } self.editor.insert_equation(&mut self.engine)?; @@ -1792,7 +1787,7 @@ impl PageView { /// Insert, Table: see [`CanvasEditor::insert_table`]. pub fn insert_table(&mut self, rows: usize, columns: usize) -> Result { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok(Response::default()); } self.editor.insert_table(&mut self.engine, rows, columns)?; @@ -1802,7 +1797,7 @@ impl PageView { /// Insert, Picture, or a pasted one: a PNG, JPEG or GIF `size` points large; see /// [`CanvasEditor::insert_picture`]. pub fn insert_picture(&mut self, bytes: Vec, size: [f32; 2]) -> Result { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok(Response::default()); } let image = crate::editor::picture(bytes, size)?; @@ -1818,7 +1813,7 @@ impl PageView { pieces: Vec, language: u32, ) -> Result<(Vec, Response)> { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok((Vec::new(), Response::default())); } let awaited = self @@ -1845,7 +1840,7 @@ impl PageView { /// Record Audio: see [`CanvasEditor::start_recording`]; none where text cannot go. pub fn start_recording(&mut self, label: &str) -> Result<(Option<[u8; 16]>, Response)> { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok((None, Response::default())); } let id = self.editor.start_recording(&mut self.engine, label)?; @@ -1879,7 +1874,7 @@ impl PageView { /// Insert, Attach File: see [`CanvasEditor::insert_attachment`]. A file without an icon /// takes the page's blank one. pub fn insert_attachment(&mut self, mut file: onestore::page::Attachment) -> Result { - if !self.accepts_text() || self.editor.marked_range().is_some() { + if self.edits_wait() { return Ok(Response::default()); } file.preview @@ -2051,17 +2046,7 @@ impl PageView { return self.edited(); } } - if matches!( - self.drag, - Some( - Drag::Outline { .. } - | Drag::Resize { .. } - | Drag::Column { .. } - | Drag::Image { .. } - | Drag::Space { .. } - ) - ) || self.space - { + if !matches!(self.drag, None | Some(Drag::Text { .. })) || self.space { self.drag = None; self.space = false; if key == &Key::Named(NamedKey::Escape) { @@ -2270,7 +2255,7 @@ pub enum Hit { } /// What a document point lands on; `pixel` is document points per device pixel. -pub fn page_hit_test( +pub(crate) fn page_hit_test( editor: &CanvasEditor, scene: Option<&(PageScene, [f32; 2])>, point: [f32; 2], @@ -2574,16 +2559,7 @@ fn page_primitives<'a>( if let Some((scene, _)) = scene { let moving = match preview { Some(PointerFeedback::Image(id, origin, size)) => { - let [x0, y0, x1, y1] = image_rect(origin, size); - Some(( - id, - [ - x0 + offset[0], - y0 + offset[1], - x1 + offset[0], - y1 + offset[1], - ], - )) + Some((id, crate::translated(image_rect(origin, size), offset))) } _ => None, }; @@ -2663,13 +2639,10 @@ fn page_primitives<'a>( } if let Some(ObjectFocus::ReadOnly(index)) = object_focus { let (scene, offset) = scene.unwrap(); - let [x0, y0, x1, y1] = scene.read_only(Some(editor)).nth(index).unwrap().rect(); - let [x0, y0, x1, y1] = [ - x0 + offset[0], - y0 + offset[1], - x1 + offset[0], - y1 + offset[1], - ]; + let [x0, y0, x1, y1] = crate::translated( + scene.read_only(Some(editor)).nth(index).unwrap().rect(), + *offset, + ); let border = 2.0 / paint.scale; for rect in [ [x0, y0, x1, y0 + border], @@ -2899,12 +2872,7 @@ fn append_outline_chrome( let [x, y] = origin; let (bounds, body_top) = outline_chrome(outline, pixel); let [dx, dy] = [x - outline.origin()[0], y - outline.origin()[1]]; - let [left, top, right, bottom] = [ - bounds[0] + dx, - bounds[1] + dy, - bounds[2] + dx, - bounds[3] + dy, - ]; + let [left, top, right, bottom] = crate::translated(bounds, [dx, dy]); let body_top = body_top + dy; if outline.title { primitives.push(Primitive::RoundedRect { diff --git a/crates/canvas/src/interaction/scroll.rs b/crates/canvas/src/interaction/scroll.rs index fd2068e16505a04e89ef15c347468eec802c4421..90ed1265b4276f7836f662f40abef478389b2709 100644 --- a/crates/canvas/src/interaction/scroll.rs +++ b/crates/canvas/src/interaction/scroll.rs @@ -10,25 +10,36 @@ pub struct Scroll { impl Scroll { /// Each content rectangle comes with the room, in device pixels, OneNote leaves beyond - /// it left and up. - pub fn new(viewport: Viewport, bounds: impl Iterator) -> Self { + /// it up and toward the page's start: left, or right on a right-to-left page. + pub fn new( + viewport: Viewport, + bounds: impl Iterator, + rtl: bool, + ) -> Self { let mut min = [0.0_f32; 2]; let mut max = [0.0_f32; 2]; + let mut end = f32::NEG_INFINITY; for (rect, pad) in bounds { for axis in 0..2 { min[axis] = min[axis].min(rect[axis] * viewport.scale - pad); max[axis] = max[axis].max(rect[axis + 2]); } + end = end.max(rect[2] * viewport.scale + pad); } - // OneNote stops at the page origin unless content reaches past it. + // OneNote stops at the page origin unless content reaches past it; a right-to-left + // page ends where its content does. for axis in 0..2 { - max[axis] = - ((max[axis] + 36.0) * viewport.scale - viewport.size[axis] as f32).max(min[axis]); + max[axis] = if rtl && axis == 0 && end.is_finite() { + end - viewport.size[0] as f32 + } else { + (max[axis] + 36.0) * viewport.scale - viewport.size[axis] as f32 + } + .max(min[axis]); } Self { min, max } } - pub fn clamp(&self, viewport: &mut Viewport) { + pub(crate) fn clamp(&self, viewport: &mut Viewport) { for axis in 0..2 { viewport.origin[axis] = -(-viewport.origin[axis]).clamp(self.min[axis], self.max[axis]); } @@ -49,6 +60,7 @@ mod tests { let scroll = Scroll::new( viewport, [([-80.0, -20.0, 1000.0, 1200.0], 11.0)].into_iter(), + false, ); scroll.clamp(&mut viewport); assert_eq!(viewport.origin, [171.0, 51.0]); @@ -68,7 +80,23 @@ mod tests { ([-0.5, -22.35, 613.0, 141.3], 0.0), ([36.0, 86.4, 400.0, 180.0], 11.0), ]; - let scroll = Scroll::new(viewport, bounds.into_iter()); + let scroll = Scroll::new(viewport, bounds.into_iter(), false); assert_eq!(scroll.min, [-1.0, -44.7]); } + + #[test] + fn right_to_left_pages_end_at_their_content() { + let viewport = Viewport { + size: [800, 600], + scale: 2.0, + origin: [0.0; 2], + }; + let bounds = [ + ([10835.0, 14.4, 10962.0, 28.0], 11.0), + ([11220.0, 84.0, 11334.0, 145.0], 0.0), + ]; + let scroll = Scroll::new(viewport, bounds.into_iter(), true); + assert_eq!(scroll.min, [0.0, 0.0]); + assert_eq!(scroll.max[0], 11334.0 * 2.0 - 800.0); + } } diff --git a/crates/canvas/src/interaction/tests.rs b/crates/canvas/src/interaction/tests.rs index ca5a9f9543564cc27665bf8e57728b8e143ec9e2..7e34db0aa5c32674d84144838800898b3bc41ac9 100644 --- a/crates/canvas/src/interaction/tests.rs +++ b/crates/canvas/src/interaction/tests.rs @@ -57,6 +57,7 @@ fn date_buttons_keep_accessibility_identity_and_match_mouse_hits_after_reflow() title: "Header".into(), created: Some(1), margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -590,6 +591,7 @@ fn extension_hits_yield_to_objects_and_keep_their_source_coordinate_frame() { title: String::new(), created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -719,6 +721,7 @@ fn a_picture_in_an_outline_takes_the_click_over_its_text() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -1247,6 +1250,7 @@ fn overlapping_objects_follow_paint_order_through_creation_movement_and_undo() { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -1445,6 +1449,7 @@ fn read_only_focus_retires_text_overlays_and_draws_a_scaled_focus_border() { created: None, title: String::new(), margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -1566,6 +1571,7 @@ fn picture_view() -> (PageView, onestore::ExGuid) { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -1604,6 +1610,7 @@ fn a_page_outline_emptied_by_backspace_still_draws() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -2079,6 +2086,7 @@ fn page_keys_scroll_or_carry_the_caret_as_the_platform_does() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -2171,6 +2179,7 @@ fn page_selection_view() -> (PageView, [onestore::ExGuid; 4]) { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -2712,6 +2721,7 @@ fn art_draws_at_once_over_the_rule_lines_and_follows_undo() { title: String::new(), created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: Some(crate::template::RULE_LINES[2].1), definitions: Default::default(), @@ -2832,6 +2842,7 @@ fn a_file_dropped_on_blank_page_lies_on_the_page_and_drags() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -2959,6 +2970,7 @@ fn misspelled_words_are_marked_and_corrected_in_one_edit() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -3072,6 +3084,7 @@ fn the_note_playing_scrolls_into_view() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), @@ -3129,6 +3142,7 @@ fn the_spelling_pane_walks_marked_words_from_the_caret() { identity: None, created: None, margin_origin: [36.0, 14.4], + rtl: false, color: None, rule_lines: None, definitions: Default::default(), diff --git a/crates/canvas/src/language.rs b/crates/canvas/src/language.rs index ec1bceb3e4063f562ae667d1780c1915d6517e23..78b7347f3f9ea008c0922423c4494ce3d7898758 100644 --- a/crates/canvas/src/language.rs +++ b/crates/canvas/src/language.rs @@ -135,7 +135,7 @@ pub fn lcid(tag: &str) -> u32 { /// The BCP-47 tag of a Windows LCID; a bare language stands for the locale Windows picks /// for it. None for LCIDs outside the table, such as math's. -pub fn tag(lcid: u32) -> Option<&'static str> { +pub(crate) fn tag(lcid: u32) -> Option<&'static str> { LCIDS .iter() .find(|(_, known)| *known == lcid) diff --git a/crates/canvas/src/layout.rs b/crates/canvas/src/layout.rs index 8fb8ea431dd89f7472a4d5f3687d486117e5ddbd..b2d39360abf5066e85d97447ebbe1df64a927420 100644 --- a/crates/canvas/src/layout.rs +++ b/crates/canvas/src/layout.rs @@ -42,11 +42,11 @@ const SUBSCRIPT_DROP: f32 = 0.08; #[derive(Clone, Copy, Debug, Default, PartialEq)] pub struct TextBrush { /// COLORREF, or `None` for OneNote's automatic colour, which follows the paper. - pub color: Option, - pub highlight: Option, + pub(crate) color: Option, + pub(crate) highlight: Option, /// Points the run draws above the line's baseline: positive for a superscript, /// negative for a subscript. Line metrics and hit-testing keep the baseline. - pub rise: f32, + pub(crate) rise: f32, } #[derive(Clone, Debug)] @@ -72,11 +72,11 @@ pub struct TextLayout { /// Room kept in a line for something drawn inline, such as an equation, before the text at /// byte `index`; the line grows to its ascent and descent. #[derive(Clone, Copy, Debug, PartialEq)] -pub struct InlineSpace { - pub index: usize, - pub width: f32, - pub ascent: f32, - pub descent: f32, +pub(crate) struct InlineSpace { + pub(crate) index: usize, + pub(crate) width: f32, + pub(crate) ascent: f32, + pub(crate) descent: f32, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -106,8 +106,8 @@ impl fmt::Display for LayoutError { impl std::error::Error for LayoutError {} /// What a run without a font or size of its own is laid out in. -pub const DEFAULT_FONT: &str = "Arial"; -pub const DEFAULT_FONT_SIZE: f32 = 11.0; +pub(crate) const DEFAULT_FONT: &str = "Arial"; +pub(crate) const DEFAULT_FONT_SIZE: f32 = 11.0; /// Metric-compatible faces for the fonts OneNote pages use most, under the SIL Open Font /// Licence files beside them, by the family each stands in for. @@ -425,7 +425,7 @@ impl TextEngine { } /// Lays out `paragraph` keeping `spaces` inline, for what draws in them. - pub fn layout_with( + pub(crate) fn layout_with( &mut self, paragraph: &Paragraph, width: f32, @@ -531,7 +531,7 @@ impl TextEngine { impl TextLayout { /// Process-unique identity for caches of an externally immutable layout. - pub fn id(&self) -> u64 { + pub(crate) fn id(&self) -> u64 { self.id } @@ -592,11 +592,11 @@ impl TextLayout { last.top + last.height } - pub fn cursor(&self, byte: usize, affinity: Affinity) -> Cursor { + pub(crate) fn cursor(&self, byte: usize, affinity: Affinity) -> Cursor { Cursor::from_byte_index(&self.shaped, byte, affinity) } - pub fn hit_test(&self, x: f32, y: f32) -> Cursor { + pub(crate) fn hit_test(&self, x: f32, y: f32) -> Cursor { let index = self .lines .partition_point(|line| line.top + line.height <= y) @@ -645,7 +645,7 @@ impl TextLayout { /// Each line's part of `selection` as a mark under the text runs: its left, its right /// and the line's baseline. - pub fn underlines(&self, selection: Selection) -> Vec<[f32; 3]> { + pub(crate) fn underlines(&self, selection: Selection) -> Vec<[f32; 3]> { selection .geometry(&self.shaped) .into_iter() diff --git a/crates/canvas/src/lib.rs b/crates/canvas/src/lib.rs index de0389776bb173090782f64dc8f19dd22381a50c..840d8486a761dcb1e2c2e0358360e860ec7d939f 100644 --- a/crates/canvas/src/lib.rs +++ b/crates/canvas/src/lib.rs @@ -5,6 +5,7 @@ pub mod language; pub mod layout; pub mod math; pub mod outline; +pub mod reading; pub mod search; pub mod spelling; pub mod template; @@ -17,6 +18,16 @@ pub mod interaction; #[cfg(feature = "pdf")] pub mod print; +/// Where an object stored with `layout` lies; an unset coordinate is zero. +pub(crate) fn origin(layout: &onestore::document::Layout) -> [f32; 2] { + [layout.x.unwrap_or(0.0), layout.y.unwrap_or(0.0)] +} + +/// `[x0, y0, x1, y1]` moved by `[x, y]`. +pub(crate) fn translated([x0, y0, x1, y1]: [f32; 4], [x, y]: [f32; 2]) -> [f32; 4] { + [x0 + x, y0 + y, x1 + x, y1 + y] +} + /// Parley's caret affinity mapped onto the page model's hidden-field affinity. pub fn affinity(affinity: parley::Affinity) -> onestore::page::text::Affinity { match affinity { diff --git a/crates/canvas/src/math.rs b/crates/canvas/src/math.rs index 2991775e5aa3e1a87f79f303220fcbecfa27a8cf..d1f3ae6bca997142d09f54995943595e12fe1612 100644 --- a/crates/canvas/src/math.rs +++ b/crates/canvas/src/math.rs @@ -11,14 +11,14 @@ use onestore::page::text::Paragraph; pub struct MathLayout { pub size: [f32; 2], /// COLORREF for rules and strokes, or `None` for the paper's ink. - pub color: Option, + pub(crate) color: Option, /// Distance from the top to the baseline of the equation's main row. pub baseline: f32, - pub items: Vec, + pub(crate) items: Vec, } #[derive(Clone)] -pub enum MathItem { +pub(crate) enum MathItem { Text { layout: TextLayout, origin: [f32; 2], @@ -79,7 +79,7 @@ fn offset(item: MathItem, [dx, dy]: [f32; 2]) -> MathItem { layout, origin: [origin[0] + dx, origin[1] + dy], }, - MathItem::Rule([x0, y0, x1, y1]) => MathItem::Rule([x0 + dx, y0 + dy, x1 + dx, y1 + dy]), + MathItem::Rule(rect) => MathItem::Rule(crate::translated(rect, [dx, dy])), MathItem::Stroke { from, to, width } => MathItem::Stroke { from: [from[0] + dx, from[1] + dy], to: [to[0] + dx, to[1] + dy], diff --git a/crates/canvas/src/outline.rs b/crates/canvas/src/outline.rs index 91b1be1b502b01ae2e88e9c1f1bb20128d89084c..264c522ba12e23d9ba36937af6bb4bb528ce995a 100644 --- a/crates/canvas/src/outline.rs +++ b/crates/canvas/src/outline.rs @@ -21,7 +21,7 @@ pub struct OutlineLayout { pub paragraphs: Vec, pub tables: Vec, /// Pictures, files and handwriting that occupy a paragraph of their own. - pub objects: Vec, + pub(crate) objects: Vec, pub size: [f32; 2], /// One per root node, so an edit places anew only what it changes and moves what follows. blocks: Vec, @@ -49,37 +49,37 @@ struct Block { /// A layout of root nodes `range` once an edit applies, and how the nodes after them move. pub(crate) struct Relayout { - pub range: Range, - pub segment: OutlineLayout, + pub(crate) range: Range, + pub(crate) segment: OutlineLayout, /// Each following node's new top and flow state, up to the first that stays. moved: Vec<(f32, (f64, Option))>, - pub size: [f32; 2], + pub(crate) size: [f32; 2], widths: [f32; 2], } #[derive(Clone)] -pub struct ObjectLayout { +pub(crate) struct ObjectLayout { /// The object's identity, which keys a picture's or file icon's decoded image. - pub id: ExGuid, + pub(crate) id: ExGuid, /// Where the picture, file icon, drawing or placeholder draws, outline-local. - pub rect: [f32; 4], - pub kind: ObjectKind, + pub(crate) rect: [f32; 4], + pub(crate) kind: ObjectKind, /// Outline-local bottom of the whole object, label included. - pub bottom: f32, - pub tags: Option, + pub(crate) bottom: f32, + pub(crate) tags: Option, } /// The note tags of a table, picture or file, which OneNote centres on it in the tag column. #[derive(Clone)] -pub struct BlockTags { +pub(crate) struct BlockTags { /// The paragraph holding the block. - pub paragraph: ExGuid, + pub(crate) paragraph: ExGuid, /// Its siblings' group, whose list markers the tags clear. parent: Option, /// The block's left edge, outline-local. x: f32, /// Origins are outline-local. - pub tags: Vec, + pub(crate) tags: Vec, } impl BlockTags { @@ -130,7 +130,7 @@ impl BlockTags { } #[derive(Clone)] -pub enum ObjectKind { +pub(crate) enum ObjectKind { Picture, /// A file's icon with its name centered below. File(ParagraphLayout), @@ -141,7 +141,7 @@ pub enum ObjectKind { } impl ObjectLayout { - pub fn label(&self) -> Option<&ParagraphLayout> { + pub(crate) fn label(&self) -> Option<&ParagraphLayout> { match &self.kind { ObjectKind::File(label) | ObjectKind::Unsupported(label) => Some(label), ObjectKind::Picture | ObjectKind::Ink(_) => None, @@ -243,7 +243,7 @@ pub struct TableLayout { /// Cells are in paragraph order with disjoint visible ranges. pub cells: Vec, pub borders: bool, - pub tags: Option, + pub(crate) tags: Option, } #[derive(Clone)] @@ -251,12 +251,12 @@ pub struct CellLayout { pub id: ExGuid, pub rect: [f32; 4], /// Visible paragraph indices, including paragraphs in nested tables. - pub paragraphs: std::ops::Range, + pub(crate) paragraphs: std::ops::Range, } impl CellLayout { /// Native ink gutters extend beyond the cell borders. - pub fn text_bounds(&self) -> [f32; 4] { + pub(crate) fn text_bounds(&self) -> [f32; 4] { [ self.rect[0] - 2.7, self.rect[1], @@ -265,7 +265,7 @@ impl CellLayout { ] } - pub fn clip(&self, rect: parley::BoundingBox) -> Option { + pub(crate) fn clip(&self, rect: parley::BoundingBox) -> Option { let [left, top, right, bottom] = self.text_bounds().map(f64::from); let rect = parley::BoundingBox::new( rect.x0.max(left), @@ -296,7 +296,7 @@ pub struct ParagraphLayout { pub math: Vec, /// A highlight of the whole paragraph (its own `highlight`), COLORREF: a band across its /// outline behind its lines, as OneNote marks a conflict page's conflicting changes. - pub band: Option, + pub(crate) band: Option, } /// How the page draws a note tag. @@ -318,13 +318,13 @@ impl TagIcon { }) } - pub fn checkable(self) -> bool { + pub(crate) fn checkable(self) -> bool { matches!(self, Self::Symbol { shape, .. } if checkable(shape)) } } /// Whether tag symbol `shape` is a check box, as MS-ONE's NoteTagShape marks them. -pub fn checkable(shape: u16) -> bool { +pub(crate) fn checkable(shape: u16) -> bool { matches!( shape, 1..=12 | 28 | 30 | 32 | 48 | 50 | 52 | 69 | 71 | 73 | 89..=99 @@ -498,9 +498,9 @@ pub struct ParagraphTag { impl ParagraphTag { /// The icon's side beside 10 to 17.5 pt text. - pub const SIZE: f32 = 12.0; + pub(crate) const SIZE: f32 = 12.0; /// How far a 12 pt icon starts left of its text when no sibling has a list marker. - pub const INSET: f32 = 20.25; + pub(crate) const INSET: f32 = 20.25; /// Space between a tag and the leftmost list marker among its paragraph's siblings. const MARKER_GAP: f32 = 0.9; @@ -1258,7 +1258,7 @@ pub(crate) fn visible_paragraphs<'a>( impl OutlineLayout { /// OneNote gives an outline one tag column, as wide as its most-tagged paragraph needs; each /// paragraph's tags start at the column's left edge. Tag origins assume a one-tag column. - pub fn tag_column_offset(&self) -> f32 { + pub(crate) fn tag_column_offset(&self) -> f32 { -self .paragraphs .iter() @@ -1296,7 +1296,7 @@ impl OutlineLayout { } /// Innermost table cell containing a visible paragraph index. - pub fn paragraph_cell(&self, index: usize) -> Option<&CellLayout> { + pub(crate) fn paragraph_cell(&self, index: usize) -> Option<&CellLayout> { self.tables.iter().rev().find_map(|table| { let cell = table .cells diff --git a/crates/canvas/src/reading.rs b/crates/canvas/src/reading.rs new file mode 100644 index 0000000000000000000000000000000000000000..64d0647af3416d9d010e216b89d8158e66b0571f --- /dev/null +++ b/crates/canvas/src/reading.rs @@ -0,0 +1,638 @@ +//! Reading view: a page's content in reading order, reflowed into one column as wide as a +//! phone's screen. The reflowed page is only shown; nothing of it is stored. +//! +//! Blocks are the page's outlines, pictures, files and drawings, as laid out. Blocks whose +//! lines or pictures overlap, ink over text, and strokes within reach of each other join +//! into one piece moved whole. Reading order is a recursive XY cut: rows split by horizontal +//! gaps, then columns by vertical gaps, left column first. Notes beside one long outline are +//! asides: the outline splits after the paragraph each note sits beside, and the note follows +//! it. Text rewraps to the column, pictures shrink to it, and everything else keeps its size. + +use crate::{ + editor::{CanvasEditor, EditorError, TextOutline, page::Content}, + layout::TextEngine, +}; +use onestore::{ + ExGuid, + page::{Outline, Page, PageObject, ParagraphContent}, +}; +use std::{collections::BTreeMap, ops::Range}; + +/// Points between blocks in the column: OneNote's grid row. +const GAP: f32 = 18.0; +/// Strokes this near one another are one drawing, as handwriting is many strokes. +const INK_REACH: f32 = 9.0; +/// The share of the content's area drawn, or kept as laid out, past which the page is a +/// canvas rather than a document. +const CANVAS_SHARE: f64 = 0.5; +/// How far below a paragraph's top a note beside it may start and still follow it. +const ASIDE_SLACK: f32 = 6.0; +/// How far an aside sits in from the column's edge, and the room above and below it. +const ASIDE_INDENT: f32 = 18.0; +const ASIDE_GAP: f32 = 6.0; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Kind { + Text, + Picture, + File, + Drawing, + /// Overlapping blocks or ink over text, moved as one piece. + Group, +} + +#[derive(Clone, Debug, PartialEq)] +pub struct Block { + pub kind: Kind, + /// The page objects it moves. + pub members: Vec, + /// `[x0, y0, x1, y1]` in page points, as laid out on the page. + pub bounds: [f32; 4], + /// The outline's top-level paragraphs it shows, where asides split the outline. + pub part: Option>, + /// A note beside an outline, read after the paragraph it sits by. + pub aside: bool, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Verdict { + /// No wider than the column already: shown as laid out. + Fits, + /// Every block flows into the column. + Reflows, + /// Flows, with what each `Kept` names read in an order or shape the page decides. + Partial(Vec), + /// Not offered. + Refused(Refusal), +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Kept { + /// Notes beside an outline, each placed after the paragraph it sits beside. + Asides, + /// Blocks side by side, or interlocked, read left column first. + SideBySide, + /// Overlapping blocks or ink over text, moved whole at their size. + Group, + /// Something still wider than the column: a table with set column widths, a drawing, a + /// group. + Wide, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Refusal { + /// Its positions read from the right; not yet reflowed. + RightToLeft, + /// Mostly ink. + Drawn, + /// Mostly overlapping blocks or ink over text. + Arranged, +} + +pub struct Reading { + pub verdict: Verdict, + /// In reading order where the page reflows, else as found. + pub blocks: Vec, + /// The page reflowed, where it reflows. + pub page: Option, +} + +impl Verdict { + /// Whether the page has a reading view. + pub fn offered(&self) -> bool { + matches!(self, Self::Reflows | Self::Partial(_)) + } +} + +/// `page` read into a column `column` points wide. +pub fn read(page: &Page, column: f32, engine: &mut TextEngine) -> Result { + let editor = CanvasEditor::from_page(page.clone(), engine)?; + let blocks = blocks(&editor); + let refused = |refusal, blocks| Reading { + verdict: Verdict::Refused(refusal), + blocks, + page: None, + }; + if page.rtl { + return Ok(refused(Refusal::RightToLeft, blocks)); + } + let left = blocks + .iter() + .map(|b| b.bounds[0]) + .fold(f32::INFINITY, f32::min); + let right = blocks + .iter() + .map(|b| b.bounds[2]) + .fold(f32::NEG_INFINITY, f32::max); + if blocks.is_empty() || right - left <= column + 1.0 { + return Ok(Reading { + verdict: Verdict::Fits, + blocks, + page: None, + }); + } + let area = |kind: Option| -> f64 { + blocks + .iter() + .filter(|b| kind.is_none_or(|kind| b.kind == kind)) + .map(|b| f64::from(b.bounds[2] - b.bounds[0]) * f64::from(b.bounds[3] - b.bounds[1])) + .sum() + }; + let total = area(None).max(1.0); + if area(Some(Kind::Drawing)) / total >= CANVAS_SHARE { + return Ok(refused(Refusal::Drawn, blocks)); + } + if area(Some(Kind::Group)) / total >= CANVAS_SHARE { + return Ok(refused(Refusal::Arranged, blocks)); + } + let mut kept = Vec::new(); + if blocks.iter().any(|b| b.kind == Kind::Group) { + kept.push(Kept::Group); + } + let tops: BTreeMap> = editor + .outlines() + .iter() + .map(|outline| (outline.id, root_tops(outline))) + .collect(); + let blocks = order(blocks, &tops, &mut kept); + let start = editor.body_start().unwrap_or([left, blocks[0].bounds[1]]); + let mut reflowed = page.clone(); + let blocks = split(&mut reflowed, blocks); + reflow( + &mut reflowed, + &blocks, + [start[0].min(left), start[1]], + column, + engine, + &mut kept, + )?; + kept.sort(); + kept.dedup(); + Ok(Reading { + verdict: if kept.is_empty() { + Verdict::Reflows + } else { + Verdict::Partial(kept) + }, + blocks, + page: Some(reflowed), + }) +} + +/// Where `outline`'s lines, table cells and pictures lie, in page points. +fn marks(outline: &TextOutline) -> Vec<[f32; 4]> { + let [x, y] = outline.origin(); + let shaped = outline.shaped(); + let lines = outline.layouts().flat_map(|(_, paragraph)| { + let [px, py] = paragraph.origin; + paragraph.text.lines().map(move |(line, bounds)| { + let metrics = line.metrics(); + let left = x + px + metrics.offset; + let top = y + py + bounds.top; + [ + left, + top, + left + metrics.advance - metrics.trailing_whitespace, + top + bounds.height, + ] + }) + }); + let cells = shaped + .tables + .iter() + .flat_map(|table| &table.cells) + .map(|cell| cell.rect); + let objects = shaped.objects.iter().map(|object| object.rect); + lines + .chain( + cells + .chain(objects) + .map(|rect| crate::translated(rect, [x, y])), + ) + .filter(|[x0, y0, x1, y1]| x1 > x0 && y1 > y0) + .collect() +} + +/// The page top of each of `outline`'s top-level paragraphs: its own text's, or the first +/// shown below it; the one before's where nothing below it shows. +fn root_tops(outline: &TextOutline) -> Vec { + let source = outline.snapshot(); + let mut root_of = BTreeMap::new(); + let mut roots = 0; + for paragraph in &source.paragraphs { + if paragraph.parent.is_none() { + roots += 1; + } + root_of.insert(paragraph.id, roots - 1); + } + let y = outline.origin()[1]; + let mut tops = vec![f32::INFINITY; roots]; + for (_, paragraph) in outline.layouts() { + if let Some(&root) = root_of.get(¶graph.id) { + tops[root] = tops[root].min(y + paragraph.origin[1]); + } + } + let mut last = y; + for top in &mut tops { + if top.is_finite() { + last = *top; + } else { + *top = last; + } + } + tops +} + +/// A page object as laid out: its identity, kind, bounds, and where its lines and pictures +/// lie within them. +type Item = (ExGuid, Kind, [f32; 4], Vec<[f32; 4]>); + +/// The page's content as laid out, overlapping pieces and nearby strokes joined. +fn blocks(editor: &CanvasEditor) -> Vec { + let mut items: Vec = editor + .outlines() + .iter() + .filter(|outline| !outline.title && !outline.is_empty()) + .map(|outline| { + let b = outline.bounds(); + let bounds = [b.x0, b.y0, b.x1, b.y1].map(|v| v as f32); + (outline.id, Kind::Text, bounds, marks(outline)) + }) + .collect(); + for object in &editor.objects { + let item = match object { + Content::Outline { + source, + layout, + below_title: None, + } => { + let [x, y] = crate::origin(&source.layout); + Some(( + source.id, + Kind::Text, + [x, y, x + layout.size[0], y + layout.size[1]], + )) + } + Content::Image(image) if !image.background => { + crate::outline::image_size(image).map(|[width, height]| { + let [x, y] = crate::origin(&image.layout); + (image.id, Kind::Picture, [x, y, x + width, y + height]) + }) + } + Content::File { source, .. } => object.file().map(|(_, b)| (source.id, Kind::File, b)), + Content::Ink(ink) => { + crate::editor::page::ink_bounds(ink).map(|b| (ink.id, Kind::Drawing, b)) + } + Content::ReadOnly(object) if !matches!(object.source, PageObject::Title(_)) => { + Some((object.source.id(), Kind::Picture, object.rect())) + } + _ => None, + }; + let item = item.filter(|(_, _, b)| b.iter().all(|v| v.is_finite())); + items.extend(item.map(|(id, kind, bounds)| (id, kind, bounds, vec![bounds]))); + } + let mut parent: Vec = (0..items.len()).collect(); + fn root(parent: &mut [usize], mut i: usize) -> usize { + while parent[i] != i { + parent[i] = parent[parent[i]]; + i = parent[i]; + } + i + } + let meets = |a: &[f32; 4], b: &[f32; 4], reach: f32| { + a[0] < b[2] + reach && b[0] < a[2] + reach && a[1] < b[3] + reach && b[1] < a[3] + reach + }; + for i in 0..items.len() { + for j in i + 1..items.len() { + let (a, b) = (&items[i], &items[j]); + // Touching edges are not overlap. + let reach = if a.1 == Kind::Drawing && b.1 == Kind::Drawing { + INK_REACH + } else { + -1.0 + }; + if meets(&a.2, &b.2, reach) + && a.3.iter().any(|m| b.3.iter().any(|n| meets(m, n, reach))) + { + let (ra, rb) = (root(&mut parent, i), root(&mut parent, j)); + parent[ra] = rb; + } + } + } + let mut joined: BTreeMap = BTreeMap::new(); + for (i, (id, kind, bounds, _)) in items.into_iter().enumerate() { + let r = root(&mut parent, i); + joined + .entry(r) + .and_modify(|block| { + block.members.push(id); + if !(block.kind == Kind::Drawing && kind == Kind::Drawing) { + block.kind = Kind::Group; + } + block.bounds = union(block.bounds, bounds); + }) + .or_insert(Block { + kind, + members: vec![id], + bounds, + part: None, + aside: false, + }); + } + joined.into_values().collect() +} + +fn union(a: [f32; 4], b: [f32; 4]) -> [f32; 4] { + [ + a[0].min(b[0]), + a[1].min(b[1]), + a[2].max(b[2]), + a[3].max(b[3]), + ] +} + +/// `blocks` in reading order by recursive XY cut: rows first, then columns left to right, +/// notes beside a single outline as its asides. +fn order( + blocks: Vec, + tops: &BTreeMap>, + kept: &mut Vec, +) -> Vec { + if blocks.len() <= 1 { + return blocks; + } + let mut parts = cut(blocks, 1); + if let [row] = &mut parts[..] { + let row = std::mem::take(row); + if let Some(asides) = asides(&row, tops) { + kept.push(Kept::Asides); + return asides; + } + parts = cut(row, 0); + let texts = parts + .iter() + .filter(|part| part.iter().any(|b| b.kind == Kind::Text)); + if texts.count() > 1 { + kept.push(Kept::SideBySide); + } + } + if let [interlocked] = &mut parts[..] { + // No gap runs across: top to bottom, then left to right. + kept.push(Kept::SideBySide); + let mut blocks = std::mem::take(interlocked); + blocks.sort_by(|a, b| { + a.bounds[1] + .total_cmp(&b.bounds[1]) + .then(a.bounds[0].total_cmp(&b.bounds[0])) + }); + return blocks; + } + parts + .into_iter() + .flat_map(|part| order(part, tops, kept)) + .collect() +} + +/// `row` as one outline split after each paragraph a note beside it sits by, where every +/// other block is text no taller than the outline and clear of it across. +fn asides(row: &[Block], tops: &BTreeMap>) -> Option> { + let height = |b: &Block| b.bounds[3] - b.bounds[1]; + let main = row + .iter() + .filter(|b| b.kind == Kind::Text) + .max_by(|a, b| height(a).total_cmp(&height(b)))?; + let tops = tops.get(&main.members[0])?; + let mut notes: Vec<&Block> = row.iter().filter(|b| *b != main).collect(); + let beside = |b: &Block| { + b.kind == Kind::Text + && height(b) < height(main) + && (b.bounds[0] >= main.bounds[0] + 72.0 || b.bounds[2] <= main.bounds[0]) + }; + if notes.is_empty() || tops.len() < 2 || !notes.iter().all(|b| beside(b)) { + return None; + } + notes.sort_by(|a, b| a.bounds[1].total_cmp(&b.bounds[1])); + let mut out = Vec::new(); + let mut from = 0; + let slice = |range: Range| { + let mut bounds = main.bounds; + bounds[1] = tops[range.start]; + bounds[3] = tops.get(range.end).copied().unwrap_or(main.bounds[3]); + Block { + part: Some(range), + bounds, + ..main.clone() + } + }; + for note in notes { + let after = tops + .partition_point(|top| *top <= note.bounds[1] + ASIDE_SLACK) + .max(1); + if after > from { + out.push(slice(from..after)); + from = after; + } + out.push(Block { + aside: true, + ..note.clone() + }); + } + if from < tops.len() { + out.push(slice(from..tops.len())); + } + Some(out) +} + +/// `blocks` split at each gap along `axis` (0 for x, 1 for y) that no block spans. +fn cut(mut blocks: Vec, axis: usize) -> Vec> { + blocks.sort_by(|a, b| a.bounds[axis].total_cmp(&b.bounds[axis])); + let mut parts: Vec> = Vec::new(); + let mut end = f32::NEG_INFINITY; + for block in blocks { + if parts.is_empty() || block.bounds[axis] >= end { + parts.push(Vec::new()); + } + end = end.max(block.bounds[axis + 2]); + parts.last_mut().unwrap().push(block); + } + parts +} + +/// Splits each outline asides cut into one outline per part, shown only: the first part +/// keeps the outline's identity, the others take ones derived from it. +fn split(page: &mut Page, mut blocks: Vec) -> Vec { + let mut whole: BTreeMap = BTreeMap::new(); + for block in &mut blocks { + let Some(range) = block.part.clone() else { + continue; + }; + let id = block.members[0]; + let source = match whole.get(&id) { + Some(source) => source.clone(), + None => { + let Some(PageObject::Outline(source)) = object_mut(page, id).cloned() else { + continue; + }; + whole.insert(id, source.clone()); + source + } + }; + let mut root = 0; + let paragraphs = source + .paragraphs + .iter() + .filter(|paragraph| { + if paragraph.parent.is_none() { + root += 1; + } + range.contains(&(root - 1)) + }) + .cloned() + .collect(); + let part = Outline { + id: if range.start == 0 { + id + } else { + ExGuid { + guid: id.guid, + n: id.n ^ (0x8000_0000 | range.start as u32), + } + }, + paragraphs, + ..source + }; + block.members[0] = part.id; + match object_mut(page, part.id) { + Some(object) => *object = PageObject::Outline(part), + None => page.objects.push(PageObject::Outline(part)), + } + } + blocks +} + +/// Stacks `blocks` in order from `start` down a column `column` wide. +fn reflow( + page: &mut Page, + blocks: &[Block], + start: [f32; 2], + column: f32, + engine: &mut TextEngine, + kept: &mut Vec, +) -> Result<(), EditorError> { + let [left, mut y] = start; + // Widths first: text rewraps, pictures shrink, the rest moves across whole. + let mut heights = Vec::with_capacity(blocks.len()); + for block in blocks { + let [x0, y0, x1, y1] = block.bounds; + let mut height = y1 - y0; + let indent = if block.aside { ASIDE_INDENT } else { 0.0 }; + match (block.kind, object_mut(page, block.members[0])) { + (Kind::Text, Some(PageObject::Outline(outline))) => { + outline.layout.x = Some(left + indent); + outline.layout.max_width = Some((x1 - x0).min(column - indent)); + outline.layout.reserved_width = None; + outline.min_width = None; + collapse_blanks(outline); + for paragraph in &mut outline.paragraphs { + if let ParagraphContent::Image(image) = &mut paragraph.content { + shrink(image, column - 36.0); + } + } + } + (Kind::Picture, Some(PageObject::Image(image))) => { + image.layout.x = Some(left); + height = shrink(image, column).unwrap_or(height); + } + _ => { + for &id in &block.members { + if let Some(object) = object_mut(page, id) { + let layout = object.layout_mut(); + layout.x = Some(layout.x.unwrap_or(0.0) + left - x0); + } + } + if x1 - x0 > column + 1.0 { + kept.push(Kept::Wide); + } + } + } + heights.push(height); + } + // Text heights at the new widths. + let laid = CanvasEditor::from_page(page.clone(), engine)?; + for (block, height) in blocks.iter().zip(&mut heights) { + if block.kind != Kind::Text { + continue; + } + if let Some(outline) = laid.outlines().iter().find(|o| o.id == block.members[0]) { + let b = outline.bounds(); + *height = (b.y1 - b.y0) as f32; + if (b.x1 - b.x0) as f32 > column + 1.0 { + kept.push(Kept::Wide); + } + } + } + for (index, (block, height)) in blocks.iter().zip(&heights).enumerate() { + // Asides and the parts of the outline they split sit close. + let close = |block: &Block| block.aside || block.part.as_ref().is_some_and(|p| p.start > 0); + if index > 0 { + let previous = &blocks[index - 1]; + y += if close(block) || previous.aside { + ASIDE_GAP + } else { + GAP + }; + } + let dy = y - block.bounds[1]; + for (index, &id) in block.members.iter().enumerate() { + if let Some(object) = object_mut(page, id) { + let layout = object.layout_mut(); + layout.y = Some( + if index == 0 && matches!(block.kind, Kind::Text | Kind::Picture) { + y + } else { + layout.y.unwrap_or(0.0) + dy + }, + ); + } + } + y += height; + } + Ok(()) +} + +/// Drops each blank top-level paragraph that follows another, as spacing kept a side +/// column level with the text beside it. +fn collapse_blanks(outline: &mut Outline) { + let blank = |p: &onestore::page::PageParagraph| { + p.lists.is_empty() + && p.tags.is_empty() + && p.text() + .is_some_and(|t| t.tags.is_empty() && t.text.text().trim().is_empty()) + }; + let parents: std::collections::BTreeSet = + outline.paragraphs.iter().filter_map(|p| p.parent).collect(); + let mut previous_blank = false; + let mut root_kept = true; + outline.paragraphs.retain(|p| { + if p.parent.is_some() { + return root_kept; + } + let is_blank = blank(p) && !parents.contains(&p.id); + root_kept = !(is_blank && previous_blank); + previous_blank = is_blank; + root_kept + }); +} + +fn object_mut(page: &mut Page, id: ExGuid) -> Option<&mut PageObject> { + page.objects.iter_mut().find(|object| object.id() == id) +} + +/// Scales `image` down to `width` points across, keeping its shape; its new height. +fn shrink(image: &mut onestore::page::Image, width: f32) -> Option { + let [w, h] = crate::outline::image_size(image)?; + let scale = (width / w).min(1.0); + image.layout.max_width = Some(w * scale); + image.layout.max_height = Some(h * scale); + Some(h * scale) +} diff --git a/crates/canvas/src/search.rs b/crates/canvas/src/search.rs index e63476cca4c383097b8b94ab79402f85d90b5de9..b64e1b0a01e01bc644db6ad3b77decad8462595f 100644 --- a/crates/canvas/src/search.rs +++ b/crates/canvas/src/search.rs @@ -2,7 +2,7 @@ //! case and diacritics; a page matches when all its words appear in its title or text, and //! pages whose titles hold every word come first, then the most recently modified. -use crate::document::TextPosition; +use crate::document::{TextPosition, descendants}; use crate::editor::{CanvasEditor, Selection}; use icu_normalizer::DecomposingNormalizerBorrowed; use onestore::ExGuid; @@ -67,7 +67,7 @@ impl Query { } /// Where the query's words start words of `text`, as byte ranges of it. - pub fn find(&self, text: &str) -> Vec> { + pub(crate) fn find(&self, text: &str) -> Vec> { let (folded, source) = fold_mapped(text); self.hits(&folded) .into_iter() @@ -180,25 +180,13 @@ pub fn shown(paragraph: &Paragraph) -> String { /// Calls `visit` with each text paragraph of the page's outlines, in page order, tables /// cell by cell. fn text_paragraphs<'a>(page: &'a Page, mut visit: impl FnMut(&'a PageParagraph, &'a Paragraph)) { - fn walk<'a>( - paragraphs: &'a [PageParagraph], - visit: &mut impl FnMut(&'a PageParagraph, &'a Paragraph), - ) { - for paragraph in paragraphs { - match ¶graph.content { - ParagraphContent::Text(text) => visit(paragraph, &text.text), - ParagraphContent::Table(table) => { - for cell in table.rows.iter().flat_map(|row| &row.cells) { - walk(&cell.paragraphs, visit); - } - } - _ => {} - } - } - } for object in &page.objects { if let PageObject::Outline(outline) = object { - walk(&outline.paragraphs, &mut visit); + for (_, _, node) in descendants(&outline.paragraphs, None) { + if let ParagraphContent::Text(text) = &node.content { + visit(node, &text.text); + } + } } } } @@ -206,32 +194,19 @@ fn text_paragraphs<'a>(page: &'a Page, mut visit: impl FnMut(&'a PageParagraph, /// The text OneNote recognised in each of the page's pictures, or printed on a printout's /// pages, in page order. fn picture_text(page: &Page) -> Vec<&str> { - fn walk<'a>(paragraphs: &'a [PageParagraph], out: &mut Vec<&'a str>) { - for paragraph in paragraphs { - match ¶graph.content { - ParagraphContent::Image(image) => { - out.extend(image.text.as_ref().map(|text| text.text.as_str())) - } - ParagraphContent::Table(table) => { - for cell in table.rows.iter().flat_map(|row| &row.cells) { - walk(&cell.paragraphs, out); - } - } - _ => {} - } - } - } - let mut out = Vec::new(); - for object in &page.objects { - match object { - PageObject::Outline(outline) => walk(&outline.paragraphs, &mut out), - PageObject::Image(image) => { - out.extend(image.text.as_ref().map(|text| text.text.as_str())) - } - _ => {} - } - } - out + let pictures = page.objects.iter().flat_map(|object| match object { + PageObject::Outline(outline) => descendants(&outline.paragraphs, None) + .filter_map(|(_, _, node)| match &node.content { + ParagraphContent::Image(image) => Some(image), + _ => None, + }) + .collect(), + PageObject::Image(image) => vec![image], + _ => Vec::new(), + }); + pictures + .filter_map(|image| Some(image.text.as_ref()?.text.as_str())) + .collect() } /// A page's text outside its title, a paragraph to a line, then the text in its pictures, diff --git a/crates/canvas/src/spelling.rs b/crates/canvas/src/spelling.rs index 24d499dd84820ea6d6e4c07baf4ea08413d10f9c..e0ba73c5aba8b3f650cf7962166e150e595f81ad 100644 --- a/crates/canvas/src/spelling.rs +++ b/crates/canvas/src/spelling.rs @@ -60,10 +60,10 @@ pub fn pick(language: u32, available: &[String]) -> Option<&str> { /// A marked word: misspelled, or repeating the word before it. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct Mark { +pub(crate) struct Mark { /// Bytes of the paragraph's text. - pub range: Range, - pub repeated: bool, + pub(crate) range: Range, + pub(crate) repeated: bool, } /// A word of a paragraph: its bytes, its language, and whether its spelling is checked. @@ -352,7 +352,7 @@ impl Spelling { /// The marks on `paragraph` once it is checked, less accepted words; until then none, /// and it is checked. - pub fn marks(&self, paragraph: &Paragraph) -> Vec { + pub(crate) fn marks(&self, paragraph: &Paragraph) -> Vec { let key = key(paragraph); let mut state = self.shared.state.lock().unwrap(); if let Some(marks) = state.marks(key, paragraph) { @@ -366,7 +366,7 @@ impl Spelling { /// The marks on `paragraph`, checked on this thread where not yet checked, as the /// Spelling pane walks the page. - pub fn marks_now(&self, paragraph: &Paragraph) -> Vec { + pub(crate) fn marks_now(&self, paragraph: &Paragraph) -> Vec { let key = key(paragraph); if let Some(marks) = self.shared.state.lock().unwrap().marks(key, paragraph) { return marks; @@ -378,7 +378,7 @@ impl Spelling { } /// Corrections for `word` in `language`, best first. - pub fn suggest(&self, word: &str, language: Option) -> Vec { + pub(crate) fn suggest(&self, word: &str, language: Option) -> Vec { self.shared .dictionary .suggest(word, language.unwrap_or(crate::language::EN_US)) diff --git a/crates/canvas/tests/reading.rs b/crates/canvas/tests/reading.rs new file mode 100644 index 0000000000000000000000000000000000000000..898f1f7009b23cd62f7260feda0c5faaaf2ba055 --- /dev/null +++ b/crates/canvas/tests/reading.rs @@ -0,0 +1,90 @@ +//! The reading view over OneNote-written pages: what it offers, the order it reads, and that +//! the reflowed page keeps every paragraph and object while only the shown copy moves. + +use canvas::{ + layout::TextEngine, + reading::{self, Kept, Kind, Refusal, Verdict}, +}; +use onestore::{ + Arena, ExGuid, Section, + page::{Page, PageObject}, +}; +use std::collections::BTreeSet; + +const COLUMN: f32 = 230.0; + +fn first_page(bytes: &[u8]) -> Page { + let arena = Arena::default(); + let mut section = Section::open(&arena, bytes.to_vec()).unwrap(); + let space = section.pages().unwrap()[0].0; + section.page(space).unwrap() +} + +fn paragraphs(page: &Page) -> BTreeSet { + page.objects + .iter() + .filter_map(|object| match object { + PageObject::Outline(outline) => Some(outline.paragraphs.iter().map(|p| p.id)), + _ => None, + }) + .flatten() + .collect() +} + +#[test] +fn a_planning_page_reads_down_one_column() { + let page = first_page(include_bytes!( + "../../../corpus/notebook-management/native/page-color/Garden.one" + )); + let mut engine = TextEngine::default(); + let read = reading::read(&page, COLUMN, &mut engine).unwrap(); + assert_eq!( + read.verdict, + Verdict::Partial(vec![Kept::Asides, Kept::SideBySide, Kept::Wide]) + ); + let reflowed = read.page.unwrap(); + // Splitting around asides drops no paragraph; only spacing blank runs could go. + assert_eq!(paragraphs(&reflowed), paragraphs(&page)); + // Every block starts at the column's left edge or an aside's indent, top to bottom. + let mut tops = Vec::new(); + for block in &read.blocks { + let object = reflowed + .objects + .iter() + .find(|object| object.id() == block.members[0]) + .unwrap(); + let layout = object.layout(); + if block.kind == Kind::Text { + assert!(layout.max_width.unwrap() <= COLUMN); + } + tops.push(layout.y.unwrap()); + } + assert!(tops.windows(2).all(|pair| pair[0] < pair[1]), "{tops:?}"); + // The page itself is untouched. + let again = first_page(include_bytes!( + "../../../corpus/notebook-management/native/page-color/Garden.one" + )); + assert_eq!( + serde_json::to_string(&page).unwrap(), + serde_json::to_string(&again).unwrap() + ); +} + +#[test] +fn a_drawing_is_not_reflowed() { + let page = first_page(include_bytes!( + "../../../corpus/ink-edit/drawing/candidate/ink.one" + )); + let read = reading::read(&page, COLUMN, &mut TextEngine::default()).unwrap(); + assert_eq!(read.verdict, Verdict::Refused(Refusal::Drawn)); + assert!(read.page.is_none()); +} + +#[test] +fn a_page_as_narrow_as_the_column_shows_as_laid_out() { + let page = first_page(include_bytes!( + "../../../corpus/append/round-01/complex/notebook/synthetic.one" + )); + let read = reading::read(&page, 2000.0, &mut TextEngine::default()).unwrap(); + assert_eq!(read.verdict, Verdict::Fits); +} diff --git a/crates/canvas/tests/rtl_page.rs b/crates/canvas/tests/rtl_page.rs new file mode 100644 index 0000000000000000000000000000000000000000..90b0d008e499a590e35a55ca26e7e4de1b9ede69 --- /dev/null +++ b/crates/canvas/tests/rtl_page.rs @@ -0,0 +1,188 @@ +//! A right-to-left page through the page view, as a host drives it. OneNote 2010 keeps such a +//! page's positions in the same left-to-right frame, its margin origin some 10,800 pt right of +//! the page origin, and opens it scrolled to the right end of its content; the view does the +//! same, and a click, a stroke and a drag store positions OneNote reads back where they were +//! put. `SNOWBOUND_RTL_EXPORT` names a new directory receiving the edited section as a notebook +//! for a cold reopen in OneNote 2010 (`corpus/rtl-page`). +#![cfg(feature = "interaction")] + +use canvas::{ + editor::Pen, + gpu::page::PageScene, + interaction::{PageView, ink::Tool}, + layout::TextEngine, +}; +use onestore::{ + Arena, ExGuid, Section, Store, + op::{Edit, Op}, + page::{Page, PageObject}, +}; +use std::time::{Duration, Instant}; + +const SOURCE: &[u8] = + include_bytes!("../../../corpus/m6/native-page-direction-03/notebook/synthetic.one"); + +fn drag(view: &mut PageView, path: &[[f32; 2]]) { + let _ = view.pointer_moved(path[0]).unwrap(); + let _ = view.pointer_pressed(Instant::now()).unwrap(); + for point in &path[1..] { + let _ = view.pointer_moved(*point).unwrap(); + } + let _ = view.pointer_released().unwrap(); +} + +fn outline<'a>(page: &'a Page, text: &str) -> &'a onestore::page::Outline { + page.objects + .iter() + .find_map(|object| match object { + PageObject::Outline(outline) + if outline.paragraphs.iter().any(|paragraph| { + matches!(¶graph.content, + onestore::page::ParagraphContent::Text(run) if run.text.text() == text) + }) => + { + Some(outline) + } + _ => None, + }) + .unwrap() +} + +#[test] +fn a_right_to_left_page_opens_at_its_right_end_and_stores_edits_in_onenotes_frame() { + let arena = Arena::default(); + let mut section = Section::open(&arena, SOURCE.to_vec()).unwrap(); + let space: ExGuid = section.pages().unwrap()[0].0; + let page = section.page(space).unwrap(); + assert!(page.rtl); + let margin = page.margin_origin; + let ink_right = page + .objects + .iter() + .filter_map(|object| match object { + PageObject::Ink(ink) => ink.bounds().map(|b| b[0] + b[2] + ink.layout.x.unwrap()), + _ => None, + }) + .fold(f32::NEG_INFINITY, f32::max); + let mut engine = TextEngine::default(); + let (scene, editor) = PageScene::from_page(page, &mut engine).unwrap(); + let mut view = PageView::new( + editor, + engine, + Some((scene, [0.0; 2])), + [800, 600], + 1.0, + Duration::from_millis(500), + ); + + // The view opens at the right end of the content, the drawings at its right edge. + let scroll = view.scroll(); + assert_eq!(view.viewport.origin[0], -scroll.max[0]); + let right = view.viewport.document_point([800.0, 0.0])[0]; + assert!( + ink_right <= right && right < ink_right + 12.0, + "{ink_right} {right}" + ); + assert_eq!(scroll.min[0], 0.0); + // Resizing keeps the right edge, as OneNote's does. + let _ = view.resized([600, 600]).unwrap(); + assert_eq!(view.viewport.document_point([600.0, 0.0])[0], right); + let _ = view.resized([800, 600]).unwrap(); + assert_eq!(view.viewport.document_point([800.0, 0.0])[0], right); + + let mut at = 134_100_000_000_000_000; + let mut store = |view: &mut PageView, section: &mut Section| { + let ops = view.editor.take_ops().unwrap(); + assert!(!ops.is_empty()); + at += 10_000_000; + let ops = ops.into_iter().map(|op| Op::Page { space, op }).collect(); + section.apply("Snowbound Test", &Edit { at, ops }).unwrap(); + section.page(space).unwrap() + }; + + // A click on blank page puts an outline there, on the grid anchored at the margin origin. + let click = [240.0, 480.0]; + let point = view.viewport.document_point(click); + let _ = view.pointer_moved(click).unwrap(); + let _ = view.pointer_pressed(Instant::now()).unwrap(); + let _ = view.pointer_released().unwrap(); + let _ = view + .insert_text("Typed on a right-to-left page".into()) + .unwrap(); + let page = store(&mut view, &mut section); + let typed = outline(&page, "Typed on a right-to-left page") + .layout + .clone(); + let [x, y] = [typed.x.unwrap(), typed.y.unwrap()]; + for (stored, clicked, origin) in [(x, point[0], margin[0]), (y, point[1], margin[1])] { + assert!( + ((stored - origin) / 18.0).fract().abs() < 1e-3, + "{stored} {origin}" + ); + assert!((stored - clicked).abs() <= 18.0, "{stored} {clicked}"); + } + assert!(x > margin[0]); + + // A stroke lands in page points where the pen went. + let _ = view.set_tool(Tool::Pen(Pen::new(1.0, Some(0x1f4e79)))); + let path: Vec<[f32; 2]> = (0..=20) + .map(|step| [300.0 + step as f32 * 5.0, 520.0 + step as f32 * 2.0]) + .collect(); + drag(&mut view, &path); + let known: Vec = page.objects.iter().map(PageObject::id).collect(); + let page = store(&mut view, &mut section); + let [PageObject::Ink(ink)] = page + .objects + .iter() + .filter(|object| !known.contains(&object.id())) + .collect::>()[..] + else { + panic!("the stroke is not one new drawing") + }; + let offset = [ink.layout.x.unwrap_or(0.0), ink.layout.y.unwrap_or(0.0)]; + let first = ink.strokes[0].points[0]; + let expected = view.viewport.document_point(path[0]); + for axis in 0..2 { + assert!((first[axis] + offset[axis] - expected[axis]).abs() < 0.5); + } + let _ = view.set_tool(Tool::Select); + + // The header drags an outline two grid columns right, onto the grid anchored at the + // margin origin. + let before = outline(&page, "Fictitious positioned outline.") + .layout + .clone(); + let header = [ + before.x.unwrap() * view.viewport.scale + view.viewport.origin[0] + 40.0, + before.y.unwrap() * view.viewport.scale + view.viewport.origin[1] - 8.0, + ]; + let steps: Vec<[f32; 2]> = (0..=12) + .map(|step| [header[0] + step as f32 * 4.0, header[1] + step as f32 * 2.0]) + .collect(); + drag(&mut view, &steps); + let page = store(&mut view, &mut section); + let after = outline(&page, "Fictitious positioned outline.") + .layout + .clone(); + assert_eq!(after.x.unwrap() - before.x.unwrap(), 36.0); + assert!(after.y.unwrap() > before.y.unwrap()); + assert_eq!(((after.y.unwrap() - margin[1]) / 18.0).fract(), 0.0); + + section.seal().unwrap(); + let written = section.image(); + if let Some(directory) = std::env::var_os("SNOWBOUND_RTL_EXPORT") { + let directory = std::path::PathBuf::from(directory); + std::fs::create_dir(&directory).unwrap(); + std::fs::write(directory.join("synthetic.one"), &written).unwrap(); + let file_id = Store::parse(&written).unwrap().header.file_id; + std::fs::write( + directory.join("Open Notebook.onetoc2"), + onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("synthetic.one", file_id)], + ) + .unwrap(), + ) + .unwrap(); + } +} diff --git a/crates/draw/Cargo.toml b/crates/draw/Cargo.toml index 6e0ac70b2dbea62d7086e2e43cd55dc04c356a6b..be32f891644047e9eb95e4b2a1d0fddeae43e4e2 100644 --- a/crates/draw/Cargo.toml +++ b/crates/draw/Cargo.toml @@ -7,10 +7,10 @@ publish = false [features] default = ["wgpu"] # The renderer; `edit` needs only parley. It submits through wgpu, or without it through -# OpenGL 2.1, for Mac OS X 10.6. On Windows it has both, and its maker picks one, as -# Windows 7 has no Direct3D 12. +# OpenGL 2.1, for Mac OS X 10.6. On Windows it has Direct3D 11 and OpenGL besides, and its +# maker picks one, as Windows 7 has no Direct3D 12. render = ["dep:base64", "dep:bytemuck", "dep:image", "dep:linebender_resource_handle", "dep:roxmltree", "dep:swash"] -wgpu = ["render", "dep:wgpu"] +wgpu = ["render", "dep:wgpu", "dep:windows"] # Writes layers as PDF pages, text as real text in subset fonts. pdf = ["render", "dep:miniz_oxide", "dep:pdf-writer", "dep:subsetter"] @@ -28,6 +28,16 @@ subsetter = { version = "0.2.6", default-features = false, optional = true } swash = { version = "0.2.10", optional = true } wgpu = { workspace = true, optional = true } +[target.'cfg(windows)'.dependencies] +windows = { version = "0.62", default-features = false, optional = true, features = [ + "Win32_Graphics_Direct3D", + "Win32_Graphics_Direct3D11", + "Win32_Graphics_DirectComposition", + "Win32_Graphics_Dxgi_Common", + "Win32_System_LibraryLoader", + "Win32_UI_WindowsAndMessaging", +] } + [dev-dependencies] pollster = "0.4" png = "0.18" diff --git a/crates/draw/src/draw.hlsl b/crates/draw/src/draw.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..fe69295170419c26f2a487292a2587ed19670f08 --- /dev/null +++ b/crates/draw/src/draw.hlsl @@ -0,0 +1,153 @@ +// Shader model 4.0 port of draw.wgsl, for Direct3D 11 from feature level 10_0. The render +// module embeds its bytecode, compiled by render/dxbc/compile.ps1. +struct Vertex { + float4 position : SV_Position; + float2 uv : TEXCOORD0; + float4 color : TEXCOORD1; + float2 local : TEXCOORD2; + nointerpolation float4 shape : TEXCOORD3; + nointerpolation float stroke : TEXCOORD4; + float2 clip_local : TEXCOORD5; + nointerpolation float3 clip : TEXCOORD6; + nointerpolation float blur : TEXCOORD7; +}; + +Texture2D atlas : register(t0); +SamplerState atlas_sampler : register(s0); + +Vertex vertex(float2 position : TEXCOORD0, float2 uv : TEXCOORD1, float4 color : TEXCOORD2, + float2 local : TEXCOORD3, float4 shape : TEXCOORD4, float stroke : TEXCOORD5, + float2 clip_local : TEXCOORD6, float3 clip : TEXCOORD7, float blur : TEXCOORD8) { + Vertex output; + output.position = float4(position, 0.0, 1.0); + output.uv = uv; + output.color = color; + output.local = local; + output.shape = shape; + output.stroke = stroke; + output.clip_local = clip_local; + output.clip = clip; + output.blur = blur; + return output; +} + +float ellipse_arc(float angle, float2 radius) { + if (radius.x == radius.y) { + return angle * radius.x; + } + // Four-point Gauss-Legendre quadrature. + const float4 nodes = float4(-0.86113631, -0.33998104, 0.33998104, 0.86113631); + const float4 weights = float4(0.34785485, 0.65214515, 0.65214515, 0.34785485); + float half_angle = angle * 0.5; + float scale = max(radius.x, radius.y); + float sum = 0.0; + [unroll] for (int i = 0; i < 4; i++) { + float t = half_angle * (nodes[i] + 1.0); + sum += weights[i] * length((radius / scale) * float2(sin(t), cos(t))); + } + return half_angle * sum * scale; +} + +float2 erf(float2 x) { + float2 s = sign(x); + float2 a = abs(x); + float2 y = 1.0 + (0.278393 + (0.230389 + 0.078108 * (a * a)) * a) * a; + y *= y; + return s - s / (y * y); +} + +float shadow(float2 p, float2 half_size, float corner, float sigma) { + float start = clamp(-3.0 * sigma, p.y - half_size.y, p.y + half_size.y); + float end = clamp(3.0 * sigma, p.y - half_size.y, p.y + half_size.y); + float stride = (end - start) / 4.0; + float y = start + stride * 0.5; + float value = 0.0; + [unroll] for (int i = 0; i < 4; i++) { + float delta = min(half_size.y - corner - abs(p.y - y), 0.0); + float curved = half_size.x - corner + sqrt(max(0.0, corner * corner - delta * delta)); + float2 integral = 0.5 + 0.5 * erf((p.x + float2(-curved, curved)) * (0.70710678 / sigma)); + float weight = exp(-y * y / (2.0 * sigma * sigma)) / (2.50662827 * sigma); + value += (integral.y - integral.x) * weight * stride; + y += stride; + } + return value; +} + +float taper(float2 p, float h, float r0, float r1) { + float2 q = float2(abs(p.y), p.x + h); + float span = 2.0 * h; + float b = (r0 - r1) / max(span, 1e-6); + float far = length(q - float2(0.0, span)) - r1; + if (abs(b) >= 1.0) { + return min(length(q) - r0, far); + } + float a = sqrt(1.0 - b * b); + float k = dot(q, float2(-b, a)); + if (k < 0.0) { + return length(q) - r0; + } + if (k > a * span) { + return far; + } + return dot(q, float2(a, b)) - r0; +} + +float4 fragment(Vertex input) : SV_Target { + float4 color = atlas.Sample(atlas_sampler, input.uv) * input.color; + if (input.blur > 0.0) { + color *= shadow(input.local, input.shape.xy, input.shape.z, input.blur); + } else if (input.blur < 0.0) { + color *= saturate(0.5 - taper(input.local, input.shape.x, input.shape.y, input.shape.z)); + } else if (input.shape.x > 0.0 && input.shape.y > 0.0) { + float2 q = abs(input.local) - input.shape.xy + input.shape.zw; + float distance; + if (input.shape.z == input.shape.w) { + distance = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - input.shape.z; + } else if (all(q > 0.0)) { + float2 radius = max(input.shape.zw, 0.0001); + float2 normalized = q / radius; + float k0 = length(normalized); + distance = k0 * (k0 - 1.0) / max(length(normalized / radius), 1e-20); + } else { + float2 edge = abs(input.local) - input.shape.xy; + distance = max(edge.x, edge.y); + } + float coverage = saturate(0.5 - distance); + float width = abs(input.stroke); + if (width > 0.0) { + coverage *= saturate(distance + width + 0.5); + } + if (input.stroke < 0.0) { + float2 radius = max(input.shape.zw - width * 0.5, 0.0); + if (any(radius == 0.0)) { + radius = 0.0; + } + float2 straight = input.shape.xy - width * 0.5 - radius; + float2 p = abs(input.local); + float quarter = straight.x + straight.y + ellipse_arc(1.57079632679, radius); + float along; + if (p.y <= straight.y) { + along = p.y; + } else if (p.x <= straight.x || radius.x == 0.0) { + along = quarter - p.x; + } else { + float angle = atan2((p.y - straight.y) / radius.y, (p.x - straight.x) / radius.x); + along = straight.y + ellipse_arc(angle, radius); + } + if (input.local.x < 0.0) { + along = input.local.y < 0.0 ? 2.0 * quarter + along : 2.0 * quarter - along; + } else if (input.local.y < 0.0) { + along = 4.0 * quarter - along; + } + float phase = frac(along / (4.0 * width)) * (4.0 * width); + coverage *= saturate(width + 0.5 - abs(phase - 2.0 * width)); + } + color *= coverage; + } + if (input.clip.x > 0.0) { + float2 q = abs(input.clip_local) - input.clip.xy + input.clip.z; + float distance = length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - input.clip.z; + color *= saturate(0.5 - distance); + } + return color; +} diff --git a/crates/draw/src/edit.rs b/crates/draw/src/edit.rs index 80e24eaff251b44f1a1c4501f12451642c3320f8..f01ccbd8356c5c38915f646dd5c134aa715af2ac 100644 --- a/crates/draw/src/edit.rs +++ b/crates/draw/src/edit.rs @@ -432,25 +432,11 @@ pub fn caret_blink(since: Duration) -> (f32, Option) { /// `caret`, linear RGBA, with the alpha that shows it at `opacity` over `backdrop` as bright /// as AppKit's layers do, which blend in sRGB rather than linear light. pub fn caret_color(caret: [f32; 4], backdrop: [f32; 4], opacity: f32) -> [f32; 4] { - let encode = |value: f32| { - if value <= 0.003_130_8 { - value * 12.92 - } else { - 1.055 * value.powf(1.0 / 2.4) - 0.055 - } - }; - let decode = |value: f32| { - if value <= 0.040_45 { - value / 12.92 - } else { - ((value + 0.055) / 1.055).powf(2.4) - } - }; let luminance = |[red, green, blue]: [f32; 3]| 0.2126 * red + 0.7152 * green + 0.0722 * blue; let [under, over] = [backdrop, caret].map(|color| [color[0], color[1], color[2]]); let shown: [f32; 3] = std::array::from_fn(|channel| { - let [under, over] = [under[channel], over[channel]].map(encode); - decode(under + opacity * (over - under)) + let [under, over] = [under[channel], over[channel]].map(crate::encode); + crate::linear(under + opacity * (over - under)) }); let span = luminance(over) - luminance(under); let alpha = if span.abs() < 1e-4 { diff --git a/crates/draw/src/lib.rs b/crates/draw/src/lib.rs index 1db5447092de2b19c8b2d59d54b85d400640a29a..2cc498a09b6799d0ce85faff1185301d778a3dba 100644 --- a/crates/draw/src/lib.rs +++ b/crates/draw/src/lib.rs @@ -1,6 +1,6 @@ //! What the page and the interface share: painting layers of glyphs, icons, paths, -//! images, rounded rectangles and pen strokes with wgpu or OpenGL, each layer with its -//! own transform and clip, and editing text within a laid-out line. +//! images, rounded rectangles and pen strokes with wgpu, Direct3D 11 or OpenGL, each layer +//! with its own transform and clip, and editing text within a laid-out line. pub mod edit; #[cfg(feature = "render")] @@ -8,3 +8,21 @@ mod render; #[cfg(feature = "render")] pub use render::*; + +/// sRGB's encoding of a linear channel. +fn encode(linear: f32) -> f32 { + if linear <= 0.003_130_8 { + linear * 12.92 + } else { + 1.055 * linear.powf(1.0 / 2.4) - 0.055 + } +} + +/// The linear light of an sRGB-encoded channel. +fn linear(encoded: f32) -> f32 { + if encoded <= 0.040_45 { + encoded / 12.92 + } else { + ((encoded + 0.055) / 1.055).powf(2.4) + } +} diff --git a/crates/draw/src/render.rs b/crates/draw/src/render.rs index f8ead5876512d611a120a5a37417dae3db41b524..c16123b864c771ba9bfa2871ac62b020848c5ffe 100644 --- a/crates/draw/src/render.rs +++ b/crates/draw/src/render.rs @@ -1,4 +1,6 @@ #[cfg(all(feature = "wgpu", windows))] +mod d3d11; +#[cfg(all(feature = "wgpu", windows))] mod dual; #[cfg(any(windows, not(feature = "wgpu")))] mod gl; @@ -19,8 +21,6 @@ use gl as backend; use webgpu as backend; pub use backend::Target; -#[cfg(all(feature = "wgpu", windows))] -pub use gl::Target as GlTarget; pub use icon::{Palette, picture_icon}; #[cfg(feature = "pdf")] pub use pdf::{Sheet, pdf}; @@ -34,6 +34,8 @@ use linebender_resource_handle::WeakBlob; use parley::fontique::Blob; use std::{ collections::{HashMap, HashSet}, + ffi::CStr, + mem::offset_of, ops::Range, }; use swash::{ @@ -171,14 +173,25 @@ impl RasterImage { } } -/// What a backend submits: the prepared vertices and batches, and the images they paint. +/// What a backend submits: each group's batches, painted into an offscreen picture of its +/// own, then the batches painting the target, and the images they show. struct Frame<'a> { vertices: &'a [Vertex], + groups: &'a [Vec], batches: &'a [Batch], - groups: &'a [Group], images: &'a HashMap, } +impl Frame<'_> { + /// The texture image `id` uploaded as, as the backend drawing it holds it. + fn image(&self, id: u64) -> &T + where + backend::Image: AsRef, + { + self.images[&id].texture.as_ref() + } +} + struct CachedImage { texture: backend::Image, bytes: u64, @@ -192,24 +205,58 @@ struct Batch { scissor: [u32; 4], } -/// Batches that paint offscreen as one, then onto the target by `composite`'s vertices. -struct Group { - batches: Range, - composite: Range, -} - -/// How a batch meets what lies beneath it. +/// How a batch meets what lies beneath it, and what it samples: the atlas unless it paints +/// a picture. #[derive(Clone, Copy, PartialEq)] enum Blend { Over, /// A premultiplied picture over it. Image(u64), + /// That group's offscreen picture over it. + Group(usize), /// Clearing it by the batch's coverage. Erase, /// Multiplying it by the batch's colour where covered. Multiply, } +#[derive(Clone, Copy)] +enum Factor { + Zero, + One, + SourceAlpha, + OneMinusSourceAlpha, + Destination, +} + +impl Blend { + /// Each blend state a backend makes: colour's source and destination factors, then + /// alpha's, every one adding. + const STATES: [[Factor; 4]; 4] = { + use Factor::*; + [ + // Coverage accumulates in alpha, leaving premultiplied colour over a transparent + // clear. + [SourceAlpha, OneMinusSourceAlpha, One, OneMinusSourceAlpha], + [One, OneMinusSourceAlpha, One, OneMinusSourceAlpha], + [Zero, OneMinusSourceAlpha, Zero, OneMinusSourceAlpha], + // The fragment's colour is scaled by its coverage, so this leaves the target times + // the colour where covered and the target elsewhere; alpha stays. + [Destination, OneMinusSourceAlpha, Zero, One], + ] + }; + + /// This blend's index in `STATES`. + fn state(self) -> usize { + match self { + Blend::Over => 0, + Blend::Image(_) | Blend::Group(_) => 1, + Blend::Erase => 2, + Blend::Multiply => 3, + } + } +} + #[repr(C)] #[derive(Clone, Copy, Pod, Zeroable)] struct Vertex { @@ -228,6 +275,19 @@ struct Vertex { blur: f32, } +/// Each `Vertex` field's name in the shaders, float count and offset, in shader input order. +const ATTRIBUTES: [(&CStr, usize, usize); 9] = [ + (c"position", 2, offset_of!(Vertex, position)), + (c"uv", 2, offset_of!(Vertex, uv)), + (c"color", 4, offset_of!(Vertex, color)), + (c"local", 2, offset_of!(Vertex, local)), + (c"shape", 4, offset_of!(Vertex, shape)), + (c"stroke", 1, offset_of!(Vertex, stroke)), + (c"clip_local", 2, offset_of!(Vertex, clip_local)), + (c"clip", 3, offset_of!(Vertex, clip)), + (c"blur", 1, offset_of!(Vertex, blur)), +]; + #[derive(Hash, PartialEq, Eq)] enum AtlasKey { Text { @@ -313,6 +373,18 @@ impl Motion { } } +impl Layer<'_> { + fn space(&self, size: [u32; 2]) -> Space { + Space { + size, + scale: self.scale, + origin: self.origin, + backdrop: self.backdrop, + round: self.round, + } + } +} + /// A layer's transform onto the target. #[derive(Clone, Copy)] struct Space { @@ -324,13 +396,18 @@ struct Space { } impl Space { + /// The device point at layer point `point`. + fn point(&self, point: [f32; 2]) -> [f32; 2] { + [0, 1].map(|axis| point[axis] * self.scale + self.origin[axis]) + } + + /// The device bounds of layer bounds `rect`. + fn rect(&self, rect: [f32; 4]) -> [f32; 4] { + [0, 1, 2, 3].map(|edge| rect[edge] * self.scale + self.origin[edge % 2]) + } + fn visible_rect(&self, rect: [f32; 4]) -> Result, RenderError> { - let rect = [ - rect[0] * self.scale + self.origin[0], - rect[1] * self.scale + self.origin[1], - rect[2] * self.scale + self.origin[0], - rect[3] * self.scale + self.origin[1], - ]; + let rect = self.rect(rect); if rect.iter().any(|v| !v.is_finite()) || rect[2] < rect[0] || rect[3] < rect[1] { return Err(RenderError::InvalidPrimitive); } @@ -508,7 +585,7 @@ pub struct Renderer { glyphs: HashMap>, images: HashMap, batches: Vec, - groups: Vec, + groups: Vec>, /// Batches before this one take no more primitives. barrier: usize, scaler: ScaleContext, @@ -516,10 +593,36 @@ pub struct Renderer { row_height: u32, } +#[cfg(any(windows, not(feature = "wgpu")))] impl Renderer { - fn with_gpu(gpu: backend::Gpu) -> Self { - let renderer = Self { - gpu, + /// Draws with the OpenGL context current on this thread, which must stay current + /// whenever the renderer or a `Target` is used. + pub fn opengl() -> Result { + gl::Gpu::new().map(Self::with_gpu) + } + + /// An offscreen frame `size` pixels large, for Direct3D 11 or OpenGL. + pub fn target(&self, size: [u32; 2]) -> Result { + self.gpu.target(size) + } + + /// Shows `target` in the window, premultiplying each pixel again in sRGB if + /// `translucent`, as the desktop compositing the window over its backdrop needs. + /// OpenGL's frame waits for its context's buffers to swap. + pub fn present(&self, target: &Target, translucent: bool) { + self.gpu.present(target, translucent); + } + + /// The sRGB RGBA rows of `target`, from `Renderer::target`, top first. + pub fn read_pixels(&self, target: &Target) -> Result, String> { + self.gpu.read_pixels(target) + } +} + +impl Renderer { + fn with_gpu(gpu: impl Into) -> Self { + let mut renderer = Self { + gpu: gpu.into(), vertices: Vec::new(), glyphs: HashMap::new(), images: HashMap::new(), @@ -527,10 +630,10 @@ impl Renderer { groups: Vec::new(), barrier: 0, scaler: ScaleContext::with_max_entries(32), - pen: [1, 0], - row_height: 1, + pen: [0; 2], + row_height: 0, }; - renderer.gpu.write_atlas([0, 0], [1, 1], &[255; 4]); + renderer.clear_glyph_cache(); renderer } @@ -539,23 +642,12 @@ impl Renderer { self.gpu.max_texture_dimension() } - fn atlas_side(&self) -> u32 { - self.gpu.atlas_side() - } - - /// Replaces the atlas with an empty one twice as wide and tall. - fn grow_atlas(&mut self) { - self.gpu.new_atlas(self.atlas_side() * 2); - self.clear_glyph_cache(); - self.gpu.write_atlas([0, 0], [1, 1], &[255; 4]); - } - fn glyph_limit(&self) -> usize { - MAX_GLYPHS * (self.atlas_side() / ATLAS_SIZE).pow(2) as usize + MAX_GLYPHS * (self.gpu.atlas_side() / ATLAS_SIZE).pow(2) as usize } fn uv(&self, glyph: AtlasGlyph) -> [f32; 4] { - let side = self.atlas_side() as f32; + let side = self.gpu.atlas_side() as f32; [ glyph.x as f32 / side, glyph.y as f32 / side, @@ -564,13 +656,15 @@ impl Renderer { ] } - /// The atlas's first texel, the white that solid fills sample. + /// The atlas's white texel. fn white(&self) -> [f32; 4] { - [0.5 / self.atlas_side() as f32; 4] + [0.5 / self.gpu.atlas_side() as f32; 4] } + /// Empties the atlas but for its first texel, the white that solid fills sample. pub fn clear_glyph_cache(&mut self) { self.glyphs.clear(); + self.gpu.write_atlas([0, 0], [1, 1], &[255; 4]); self.pen = [1, 0]; self.row_height = 1; } @@ -593,12 +687,12 @@ impl Renderer { images: self.images.len(), image_bytes, vertices: self.vertices.len(), - batches: self.batches.len(), + batches: self.batches.len() + self.groups.iter().map(Vec::len).sum::(), vertex_capacity_bytes: self.vertices.capacity() * size_of::(), batch_capacity_bytes: self.batches.capacity() * size_of::(), glyph_capacity: self.glyphs.capacity(), image_capacity: self.images.capacity(), - atlas_bytes: u64::from(self.atlas_side()).pow(2) * 4, + atlas_bytes: u64::from(self.gpu.atlas_side()).pow(2) * 4, vertex_buffer_bytes: VERTEX_BUFFER_BYTES, within_budget: self.glyphs.len() <= self.glyph_limit() && self.images.len() <= MAX_IMAGES @@ -633,16 +727,9 @@ impl Renderer { let mut active_images = HashSet::new(); let mut image_bytes = 0; for layer in layers { - let space = Space { - size, - scale: layer.scale, - origin: layer.origin, - backdrop: layer.backdrop, - round: layer.round, - }; for primitive in layer.primitives { if let Primitive::Image { image, rect } = primitive - && space.visible_rect(*rect)?.is_some() + && layer.space(size).visible_rect(*rect)?.is_some() && active_images.insert(image.id()) { image_bytes += image.pixels().len() as u64; @@ -668,15 +755,16 @@ impl Renderer { }; // Once cleared, the atlas holds only this frame's entries; past half full, the // next frames would clear it again and again. - let crowded = full || (cleared && 2 * self.pen[1] > self.atlas_side()); + let crowded = full || (cleared && 2 * self.pen[1] > self.gpu.atlas_side()); if !crowded { break; } if !cleared { self.clear_glyph_cache(); cleared = true; - } else if self.atlas_side() * 2 <= limit { - self.grow_atlas(); + } else if self.gpu.atlas_side() * 2 <= limit { + self.gpu.new_atlas(self.gpu.atlas_side() * 2); + self.clear_glyph_cache(); } else if full { return Err(RenderError::AtlasFull); } else { @@ -685,8 +773,8 @@ impl Renderer { } let frame = Frame { vertices: &self.vertices, - batches: &self.batches, groups: &self.groups, + batches: &self.batches, images: &self.images, }; self.gpu.submit(&frame, target, size, clear); @@ -713,13 +801,7 @@ impl Renderer { self.barrier = self.batches.len(); group = motion.map(|motion| (motion, self.batches.len())); } - let space = Space { - size, - scale: layer.scale, - origin: layer.origin, - backdrop: layer.backdrop, - round: layer.round, - }; + let space = layer.space(size); let bounds = match layer.clip { Some(clip) => space.scissor(clip), None => [0, 0, size[0], size[1]], @@ -737,12 +819,11 @@ impl Renderer { Ok(()) } - /// Makes the batches from `start` a group appearing by `motion`: the vertices that - /// paint its offscreen picture over the target, in strips so the turn stays in - /// perspective across the picture. + /// Makes the batches from `start` a group appearing by `motion`, leaving in their place + /// the batch that paints its offscreen picture over the target, in strips so the turn + /// stays in perspective across the picture. fn group(&mut self, motion: Motion, start: usize, size: [u32; 2]) -> Result<(), RenderError> { - let batches = start..self.batches.len(); - if batches.is_empty() { + if start == self.batches.len() { return Ok(()); } let [width, height] = size.map(|side| side as f32); @@ -771,12 +852,7 @@ impl Renderer { position: [shown_x * 2.0 / width - 1.0, 1.0 - shown_y * 2.0 / height], uv: [x / width, if flipped { 1.0 - v } else { v }], color: [motion.opacity; 4], - local: [0.0; 2], - shape: [0.0; 4], - stroke: 0.0, - clip_local: [0.0; 2], - clip: [0.0; 3], - blur: 0.0, + ..Vertex::zeroed() } }; for strip in 0..strips { @@ -790,10 +866,13 @@ impl Renderer { ]; self.vertices.extend([a, b, c, a, c, d]); } - self.groups.push(Group { - batches, - composite: from..self.vertices.len() as u32, + let batches = self.batches.split_off(start); + self.batches.push(Batch { + vertices: from..self.vertices.len() as u32, + blend: Blend::Group(self.groups.len()), + scissor: [0, 0, size[0], size[1]], }); + self.groups.push(batches); Ok(()) } @@ -815,10 +894,7 @@ impl Renderer { tint, palette, } => { - let origin = [ - space.origin[0] + origin[0] * space.scale, - space.origin[1] + origin[1] * space.scale, - ]; + let origin = space.point(*origin); self.icon(Space { origin, ..space }, sources, *size, *tint, palette)?; } Primitive::Path { @@ -838,10 +914,7 @@ impl Renderer { clip, ink, } => { - let origin = [ - space.origin[0] + origin[0] * space.scale, - space.origin[1] + origin[1] * space.scale, - ]; + let origin = space.point(*origin); if origin.iter().any(|v| !v.is_finite()) { return Err(RenderError::InvalidPrimitive); } @@ -858,17 +931,7 @@ impl Renderer { text.runs(&mut |run| self.glyph_run(space, run, *ink))?; } Primitive::Rect { rect, color } => { - self.quad( - space, - [ - rect[0] * space.scale + space.origin[0], - rect[1] * space.scale + space.origin[1], - rect[2] * space.scale + space.origin[0], - rect[3] * space.scale + space.origin[1], - ], - self.white(), - *color, - )?; + self.quad(space, space.rect(*rect), self.white(), *color)?; } Primitive::RoundedRect { rect, @@ -993,7 +1056,7 @@ impl Renderer { return Ok(()); } let size = run.size * scale; - if !size.is_finite() || size > self.atlas_side() as f32 { + if !size.is_finite() || size > self.gpu.atlas_side() as f32 { return Err(RenderError::AtlasFull); } let color = run @@ -1119,7 +1182,7 @@ impl Renderer { fn upload(&mut self, image: swash::scale::image::Image) -> Result { let p = image.placement; - let side = self.atlas_side(); + let side = self.gpu.atlas_side(); if p.width + 2 > side || p.height + 2 > side { return Err(RenderError::AtlasFull); } @@ -1173,7 +1236,7 @@ impl Renderer { { return Ok(()); } - if size + 2.0 > self.atlas_side() as f32 { + if size + 2.0 > self.gpu.atlas_side() as f32 { return Err(RenderError::AtlasFull); } let size = size as u32; @@ -1226,12 +1289,7 @@ impl Renderer { width } }; - let rect = [ - rect[0] * space.scale + space.origin[0], - rect[1] * space.scale + space.origin[1], - rect[2] * space.scale + space.origin[0], - rect[3] * space.scale + space.origin[1], - ]; + let rect = space.rect(rect); let start = self.vertices.len(); // A pixel of margin holds the antialiased fringe outside the edge. let fringe = [rect[0] - 1.0, rect[1] - 1.0, rect[2] + 1.0, rect[3] + 1.0]; @@ -1273,7 +1331,7 @@ impl Renderer { if !radius.is_finite() || radius < 0.0 || !blur.is_finite() || blur <= 0.0 { return Err(RenderError::InvalidPrimitive); } - let rect = [0, 1, 2, 3].map(|i| rect[i] * space.scale + space.origin[i % 2]); + let rect = space.rect(rect); let sigma = blur * space.scale / 2.0; let reach = 3.0 * sigma; let start = self.vertices.len(); @@ -1305,8 +1363,9 @@ impl Renderer { style: PathStyle, colors: [[f32; 4]; 2], ) -> Result<(), RenderError> { - let [x, y] = [0, 1] - .map(|axis| ((space.origin[axis] + origin[axis] * space.scale) * 4.0).round() * 0.25); + let [x, y] = space + .point(origin) + .map(|value| (value * 4.0).round() * 0.25); let (kind, width) = match style { PathStyle::Fill | PathStyle::Erase => (0, 0.0), PathStyle::Stroke(width) => (1, width), @@ -1400,13 +1459,7 @@ impl Renderer { round: bool, color: [f32; 4], ) -> Result<(), RenderError> { - let pixel = |p: [f32; 2]| { - [ - p[0] * space.scale + space.origin[0], - p[1] * space.scale + space.origin[1], - ] - }; - let [from, to] = [pixel(from), pixel(to)]; + let [from, to] = [space.point(from), space.point(to)]; // Hairlines stay one device pixel wide. let radii = widths.map(|width| (width * space.scale).max(1.0) * 0.5); let radius = radii[0].max(radii[1]); @@ -1463,14 +1516,12 @@ impl Renderer { x * 2.0 / space.size[0] as f32 - 1.0, 1.0 - y * 2.0 / space.size[1] as f32, ], - uv: [0.5 / self.atlas_side() as f32; 2], + uv: [self.white()[0]; 2], color, local, shape, - stroke: 0.0, - clip_local: [0.0; 2], - clip: [0.0; 3], blur, + ..Vertex::zeroed() }); } Ok(()) @@ -1520,11 +1571,7 @@ impl Renderer { uv, color, local, - shape: [0.0; 4], - stroke: 0.0, - clip_local: [0.0; 2], - clip: [0.0; 3], - blur: 0.0, + ..Vertex::zeroed() }); } Ok(()) @@ -1585,12 +1632,7 @@ fn soften( } fn srgb_byte(value: f32) -> u8 { - let srgb = if value <= 0.0031308 { - value * 12.92 - } else { - 1.055 * value.powf(1.0 / 2.4) - 0.055 - }; - (srgb * 255.0).round() as u8 + (crate::encode(value) * 255.0).round() as u8 } /// Coverage for text of sRGB luminance `tone` sixteenths that, blended in linear light, @@ -1599,11 +1641,11 @@ fn srgb_byte(value: f32) -> u8 { /// nearly untouched. fn text_coverage(tone: u8) -> [u8; 256] { let encoded = f32::from(tone) / 16.0; - let ink = linear(encoded); + let ink = crate::linear(encoded); std::array::from_fn(|coverage| { let coverage = coverage as f32 / 255.0; let weighted = if ink < 0.999 { - (1.0 - linear(1.0 - coverage * (1.0 - encoded))) / (1.0 - ink) + (1.0 - crate::linear(1.0 - coverage * (1.0 - encoded))) / (1.0 - ink) } else { coverage }; @@ -1611,14 +1653,6 @@ fn text_coverage(tone: u8) -> [u8; 256] { }) } -fn linear(value: f32) -> f32 { - if value <= 0.04045 { - value / 12.92 - } else { - ((value + 0.055) / 1.055).powf(2.4) - } -} - /// Least OKLab lightness difference between text and the backdrop it stays legible on. const LEGIBLE: f32 = 0.4; @@ -1670,7 +1704,7 @@ pub fn from_oklab([lightness, a, b]: [f32; 3]) -> [f32; 3] { /// Linear RGBA of an opaque sRGB colour. pub fn srgb(red: u8, green: u8, blue: u8) -> [f32; 4] { - let [red, green, blue] = [red, green, blue].map(|byte| linear(f32::from(byte) / 255.0)); + let [red, green, blue] = [red, green, blue].map(|byte| crate::linear(f32::from(byte) / 255.0)); [red, green, blue, 1.0] } @@ -1681,18 +1715,18 @@ pub fn srgb_bytes([red, green, blue, _]: [f32; 4]) -> [u8; 3] { /// The hue in degrees of a linear colour, as it looks in sRGB. pub fn hue(color: [f32; 4]) -> f32 { - let [r, g, b] = [color[0], color[1], color[2]].map(|value| { - if value <= 0.003_130_8 { - value * 12.92 - } else { - 1.055 * value.powf(1.0 / 2.4) - 0.055 - } - }); - let max = r.max(g).max(b); - let range = max - r.min(g).min(b); + to_hsl([color[0], color[1], color[2]].map(crate::encode))[0] +} + +/// Hue in degrees, saturation and lightness of an encoded sRGB colour. +fn to_hsl([r, g, b]: [f32; 3]) -> [f32; 3] { + let [max, min] = [r.max(g).max(b), r.min(g).min(b)]; + let lightness = (max + min) / 2.0; + let range = max - min; if range == 0.0 { - return 0.0; + return [0.0, 0.0, lightness]; } + let saturation = range / (1.0 - (2.0 * lightness - 1.0).abs()); let sector = if max == r { (g - b) / range } else if max == g { @@ -1700,7 +1734,16 @@ pub fn hue(color: [f32; 4]) -> f32 { } else { (r - g) / range + 4.0 }; - (sector * 60.0).rem_euclid(360.0) + [(sector * 60.0).rem_euclid(360.0), saturation, lightness] +} + +/// The encoded sRGB colour of a hue in degrees, saturation and lightness. +fn from_hsl([hue, saturation, lightness]: [f32; 3]) -> [f32; 3] { + let chroma = (1.0 - (2.0 * lightness - 1.0).abs()) * saturation; + [0.0, 8.0, 4.0].map(|offset: f32| { + let k = (offset + hue / 30.0).rem_euclid(12.0); + lightness - chroma / 2.0 * (k - 3.0).min(9.0 - k).clamp(-1.0, 1.0) + }) } /// The light theme's accent `[saturation, lightness]`, also the default ink of a section's pen. @@ -1708,13 +1751,9 @@ pub const LIGHT_ACCENT: [f32; 2] = [0.60, 0.45]; /// An sRGB hue, saturation and lightness as linear RGBA. pub fn hsl(hue: f32, saturation: f32, lightness: f32) -> [f32; 4] { - let chroma = (1.0 - (2.0 * lightness - 1.0).abs()) * saturation; - let channel = |offset: f32| { - let k = (offset + hue / 30.0).rem_euclid(12.0); - let value = lightness - chroma / 2.0 * (k - 3.0).min(9.0 - k).clamp(-1.0, 1.0); - (value * 255.0).round().clamp(0.0, 255.0) as u8 - }; - srgb(channel(0.0), channel(8.0), channel(4.0)) + let [red, green, blue] = from_hsl([hue, saturation, lightness]) + .map(|value| (value * 255.0).round().clamp(0.0, 255.0) as u8); + srgb(red, green, blue) } #[cfg(all(test, feature = "wgpu"))] @@ -2547,13 +2586,13 @@ mod tests { target.draw(&mut renderer, &page(&primitives)).unwrap(); } assert_eq!( - renderer.atlas_side(), + renderer.gpu.atlas_side(), ATLAS_SIZE, "frames each needing a third of the atlas evict, never grow it" ); let primitives = icons(0..3 * one_atlas); target.draw(&mut renderer, &page(&primitives)).unwrap(); - assert!(renderer.atlas_side() > ATLAS_SIZE); + assert!(renderer.gpu.atlas_side() > ATLAS_SIZE); assert!(renderer.glyphs.len() >= 3 * one_atlas); let capture = target.capture(&renderer); let pixel = |x: usize, y: usize| &capture[(y * 512 + x) * 4..(y * 512 + x) * 4 + 4]; diff --git a/crates/draw/src/render/d3d11.rs b/crates/draw/src/render/d3d11.rs new file mode 100644 index 0000000000000000000000000000000000000000..610bc2bb616d9485aaead77c8972364b75381746 --- /dev/null +++ b/crates/draw/src/render/d3d11.rs @@ -0,0 +1,585 @@ +//! Submission through Direct3D 11 from feature level 10_0, or WARP where no device has it: +//! the Direct3D Windows 7 has. Frames draw into an sRGB texture, copied to a DXGI 1.1 swap +//! chain that blits into the window's redirection surface, as Windows 7 has no flip model, +//! or where the window has none, to a flip-model one that DirectComposition shows. +use super::*; +use std::{ffi::c_void, ptr}; +use windows::{ + Win32::{ + Foundation::{HMODULE, HWND, RECT}, + Graphics::{ + Direct3D::*, + Direct3D11::*, + DirectComposition::{IDCompositionDevice, IDCompositionTarget, IDCompositionVisual}, + Dxgi::{Common::*, *}, + }, + System::LibraryLoader::{GetProcAddress, LoadLibraryW}, + UI::WindowsAndMessaging::{ + GWL_EXSTYLE, GetClientRect, GetWindowLongPtrW, WS_EX_NOREDIRECTIONBITMAP, + }, + }, + core::{Error, GUID, HRESULT, Interface, PCSTR, Result, s, w}, +}; + +// Shader model 4.0 bytecode from `dxbc/compile.ps1`: the build host has no HLSL compiler, and +// Windows 7 has a runtime one only with an optional update. +const DRAW_VERTEX: &[u8] = include_bytes!("dxbc/draw.vertex.dxbc"); +const DRAW_FRAGMENT: &[u8] = include_bytes!("dxbc/draw.fragment.dxbc"); +const TRANSLUCENT_VERTEX: &[u8] = include_bytes!("dxbc/translucent.vertex.dxbc"); +const TRANSLUCENT_FRAGMENT: &[u8] = include_bytes!("dxbc/translucent.fragment.dxbc"); + +const FORMAT: DXGI_FORMAT = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + +/// What a successful creating call leaves in its out-parameter. +fn made(create: impl FnOnce(&mut Option) -> Result<()>) -> Result { + let mut made = None; + create(&mut made)?; + Ok(made.expect("A successful call returns what it made")) +} + +/// An sRGB RGBA texture, `pixels` its rows if given. +fn texture( + device: &ID3D11Device, + size: [u32; 2], + bind: D3D11_BIND_FLAG, + pixels: Option<&[u8]>, +) -> Result { + let description = D3D11_TEXTURE2D_DESC { + Width: size[0], + Height: size[1], + MipLevels: 1, + ArraySize: 1, + Format: FORMAT, + SampleDesc: DXGI_SAMPLE_DESC { + Count: 1, + Quality: 0, + }, + Usage: D3D11_USAGE_DEFAULT, + BindFlags: bind.0 as u32, + ..Default::default() + }; + let data = pixels.map(|pixels| D3D11_SUBRESOURCE_DATA { + pSysMem: pixels.as_ptr().cast(), + SysMemPitch: size[0] * 4, + SysMemSlicePitch: 0, + }); + made(|out| unsafe { + device.CreateTexture2D(&description, data.as_ref().map(ptr::from_ref), Some(out)) + }) +} + +fn description(texture: &ID3D11Texture2D) -> D3D11_TEXTURE2D_DESC { + let mut description = D3D11_TEXTURE2D_DESC::default(); + unsafe { texture.GetDesc(&mut description) }; + description +} + +fn resource(device: &ID3D11Device, texture: &ID3D11Texture2D) -> Result { + made(|out| unsafe { device.CreateShaderResourceView(texture, None, Some(out)) }) +} + +/// A texture as the fragment shader samples it, or none where Direct3D made none, as when +/// the device is lost. +pub(super) struct Image(Option); + +/// An offscreen frame, which `Renderer::present` shows in the window. +pub struct Target { + texture: ID3D11Texture2D, + view: ID3D11RenderTargetView, + resource: ID3D11ShaderResourceView, +} + +impl Target { + fn new(device: &ID3D11Device, size: [u32; 2]) -> Result { + let bind = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; + let texture = texture(device, size, bind, None)?; + let view = made(|out| unsafe { device.CreateRenderTargetView(&texture, None, Some(out)) })?; + let resource = resource(device, &texture)?; + Ok(Self { + texture, + view, + resource, + }) + } + + pub fn size(&self) -> [u32; 2] { + let description = description(&self.texture); + [description.Width, description.Height] + } +} + +pub(super) struct Gpu { + device: ID3D11Device, + context: ID3D11DeviceContext, + swap_chain: IDXGISwapChain, + /// What shows the swap chain in a window without a redirection surface. + _composition: Option, + layout: ID3D11InputLayout, + vertex: ID3D11VertexShader, + fragment: ID3D11PixelShader, + translucent: (ID3D11VertexShader, ID3D11PixelShader), + /// One for each of `Blend::STATES`. + blends: [ID3D11BlendState; 4], + rasterizer: ID3D11RasterizerState, + nearest: ID3D11SamplerState, + linear: ID3D11SamplerState, + buffer: ID3D11Buffer, + atlas: (ID3D11Texture2D, ID3D11ShaderResourceView), + /// Offscreen pictures for groups, the target's size. + groups: Vec, +} + +impl Gpu { + /// A device and a swap chain on `window`, an `HWND`, and the adapter's description. + pub(super) fn new(window: *mut c_void) -> Result<(Self, String)> { + let levels = [ + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + ]; + let create = |driver| { + let (mut device, mut context) = (None, None); + unsafe { + D3D11CreateDevice( + None, + driver, + HMODULE::default(), + D3D11_CREATE_DEVICE_FLAG(0), + Some(&levels), + D3D11_SDK_VERSION, + Some(&mut device), + None, + Some(&mut context), + ) + } + .map(|()| (device.expect("A device"), context.expect("A context"))) + }; + let (device, context) = + create(D3D_DRIVER_TYPE_HARDWARE).or_else(|_| create(D3D_DRIVER_TYPE_WARP))?; + let adapter = unsafe { device.cast::()?.GetAdapter()? }; + let name = unsafe { adapter.GetDesc()? }.Description; + let name = String::from_utf16_lossy(name.split(|&c| c == 0).next().unwrap_or(&[])); + let level = unsafe { device.GetFeatureLevel() }.0; + let [major, minor] = [level >> 12, (level >> 8) & 0xf]; + let description = format!("{name}, feature level {major}_{minor}"); + let hwnd = HWND(window); + let factory: IDXGIFactory = unsafe { adapter.GetParent()? }; + // Windows 10's window has no redirection surface, made for wgpu's DirectComposition. + let style = unsafe { GetWindowLongPtrW(hwnd, GWL_EXSTYLE) } as u32; + let (swap_chain, composition) = if style & WS_EX_NOREDIRECTIONBITMAP.0 != 0 { + let (swap_chain, composition) = compose(&device, &factory, hwnd)?; + (swap_chain, Some(composition)) + } else { + let description = DXGI_SWAP_CHAIN_DESC { + // Windows 7's desktop composes a blit swap chain's alpha only from BGRA. + BufferDesc: DXGI_MODE_DESC { + Format: DXGI_FORMAT_B8G8R8A8_UNORM, + ..Default::default() + }, + SampleDesc: DXGI_SAMPLE_DESC { + Count: 1, + Quality: 0, + }, + BufferUsage: DXGI_USAGE_RENDER_TARGET_OUTPUT, + BufferCount: 1, + OutputWindow: hwnd, + Windowed: true.into(), + SwapEffect: DXGI_SWAP_EFFECT_DISCARD, + Flags: 0, + }; + let swap_chain = + made(|out| unsafe { factory.CreateSwapChain(&device, &description, out).ok() })?; + (swap_chain, None) + }; + // DXGI would otherwise watch the window's messages and take Alt+Enter to full screen. + unsafe { + factory + .MakeWindowAssociation(hwnd, DXGI_MWA_NO_WINDOW_CHANGES | DXGI_MWA_NO_ALT_ENTER)?; + } + + let elements: [_; 9] = std::array::from_fn(|index| { + let (_, floats, offset) = ATTRIBUTES[index]; + D3D11_INPUT_ELEMENT_DESC { + SemanticName: PCSTR(c"TEXCOORD".as_ptr().cast()), + SemanticIndex: index as u32, + Format: [ + DXGI_FORMAT_R32_FLOAT, + DXGI_FORMAT_R32G32_FLOAT, + DXGI_FORMAT_R32G32B32_FLOAT, + DXGI_FORMAT_R32G32B32A32_FLOAT, + ][floats - 1], + InputSlot: 0, + AlignedByteOffset: offset as u32, + InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA, + InstanceDataStepRate: 0, + } + }); + let layout = + made(|out| unsafe { device.CreateInputLayout(&elements, DRAW_VERTEX, Some(out)) })?; + let vertex_shader = + |code| made(|out| unsafe { device.CreateVertexShader(code, None, Some(out)) }); + let pixel_shader = + |code| made(|out| unsafe { device.CreatePixelShader(code, None, Some(out)) }); + + let blend = |factors: [Factor; 4]| { + let [src, dst, src_alpha, dst_alpha] = factors.map(|factor| match factor { + Factor::Zero => D3D11_BLEND_ZERO, + Factor::One => D3D11_BLEND_ONE, + Factor::SourceAlpha => D3D11_BLEND_SRC_ALPHA, + Factor::OneMinusSourceAlpha => D3D11_BLEND_INV_SRC_ALPHA, + Factor::Destination => D3D11_BLEND_DEST_COLOR, + }); + let mut description = D3D11_BLEND_DESC::default(); + description.RenderTarget[0] = D3D11_RENDER_TARGET_BLEND_DESC { + BlendEnable: true.into(), + SrcBlend: src, + DestBlend: dst, + BlendOp: D3D11_BLEND_OP_ADD, + SrcBlendAlpha: src_alpha, + DestBlendAlpha: dst_alpha, + BlendOpAlpha: D3D11_BLEND_OP_ADD, + RenderTargetWriteMask: D3D11_COLOR_WRITE_ENABLE_ALL.0 as u8, + }; + made(|out| unsafe { device.CreateBlendState(&description, Some(out)) }) + }; + let sampler = |filter| { + let description = D3D11_SAMPLER_DESC { + Filter: filter, + AddressU: D3D11_TEXTURE_ADDRESS_CLAMP, + AddressV: D3D11_TEXTURE_ADDRESS_CLAMP, + AddressW: D3D11_TEXTURE_ADDRESS_CLAMP, + ComparisonFunc: D3D11_COMPARISON_NEVER, + MaxLOD: f32::MAX, + ..Default::default() + }; + made(|out| unsafe { device.CreateSamplerState(&description, Some(out)) }) + }; + let rasterizer = D3D11_RASTERIZER_DESC { + FillMode: D3D11_FILL_SOLID, + CullMode: D3D11_CULL_NONE, + DepthClipEnable: true.into(), + ScissorEnable: true.into(), + ..Default::default() + }; + let buffer = D3D11_BUFFER_DESC { + ByteWidth: VERTEX_BUFFER_BYTES as u32, + Usage: D3D11_USAGE_DYNAMIC, + BindFlags: D3D11_BIND_VERTEX_BUFFER.0 as u32, + CPUAccessFlags: D3D11_CPU_ACCESS_WRITE.0 as u32, + ..Default::default() + }; + let [over, picture, erase, multiply] = Blend::STATES; + let gpu = Self { + layout, + vertex: vertex_shader(DRAW_VERTEX)?, + fragment: pixel_shader(DRAW_FRAGMENT)?, + translucent: ( + vertex_shader(TRANSLUCENT_VERTEX)?, + pixel_shader(TRANSLUCENT_FRAGMENT)?, + ), + blends: [ + blend(over)?, + blend(picture)?, + blend(erase)?, + blend(multiply)?, + ], + rasterizer: made(|out| unsafe { + device.CreateRasterizerState(&rasterizer, Some(out)) + })?, + nearest: sampler(D3D11_FILTER_MIN_MAG_MIP_POINT)?, + linear: sampler(D3D11_FILTER_MIN_MAG_MIP_LINEAR)?, + buffer: made(|out| unsafe { device.CreateBuffer(&buffer, None, Some(out)) })?, + atlas: atlas(&device, ATLAS_SIZE)?, + groups: Vec::new(), + device, + context, + swap_chain, + _composition: composition, + }; + Ok((gpu, description)) + } + + pub(super) fn target(&self, size: [u32; 2]) -> Result { + Target::new(&self.device, size) + } + + /// Copies `target` to the window, premultiplying each pixel again in sRGB, as the + /// desktop compositing the window over its backdrop needs, which leaves opaque ones be. + pub(super) fn present(&self, target: &Target) -> Result<()> { + let context = &self.context; + let size = target.size(); + let [width, height] = size; + unsafe { + let buffers = self.swap_chain.GetDesc()?.BufferDesc; + if [buffers.Width, buffers.Height] != size { + let flags = DXGI_SWAP_CHAIN_FLAG(0); + (self.swap_chain).ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, flags)?; + } + let buffer: ID3D11Texture2D = self.swap_chain.GetBuffer(0)?; + let view = made(|out| self.device.CreateRenderTargetView(&buffer, None, Some(out)))?; + let (vertex, fragment) = &self.translucent; + self.begin(&view, size); + context.OMSetBlendState(None, None, u32::MAX); + context.VSSetShader(vertex, None); + context.PSSetShader(fragment, None); + context.PSSetShaderResources(0, Some(&[Some(target.resource.clone())])); + context.Draw(3, 0); + context.PSSetShaderResources(0, Some(&[None])); + context.OMSetRenderTargets(None, None); + self.swap_chain.Present(1, DXGI_PRESENT(0)).ok() + } + } + + /// sRGB-encoded RGBA rows of `target`, top first. + pub(super) fn read_pixels(&self, target: &Target) -> Result> { + let mut description = description(&target.texture); + let [width, height] = [description.Width, description.Height]; + description.Usage = D3D11_USAGE_STAGING; + description.BindFlags = 0; + description.CPUAccessFlags = D3D11_CPU_ACCESS_READ.0 as u32; + let row = width as usize * 4; + let mut pixels = Vec::with_capacity(row * height as usize); + unsafe { + let staging = made(|out| self.device.CreateTexture2D(&description, None, Some(out)))?; + self.context.CopyResource(&staging, &target.texture); + let mut mapped = D3D11_MAPPED_SUBRESOURCE::default(); + self.context + .Map(&staging, 0, D3D11_MAP_READ, 0, Some(&mut mapped))?; + for y in 0..height as usize { + let start = mapped.pData.cast::().add(y * mapped.RowPitch as usize); + pixels.extend_from_slice(std::slice::from_raw_parts(start, row)); + } + self.context.Unmap(&staging, 0); + } + Ok(pixels) + } + + /// Offscreen pictures' rows run top first. + pub(super) fn flipped(&self) -> bool { + false + } + + pub(super) fn max_texture_dimension(&self) -> u32 { + if unsafe { self.device.GetFeatureLevel() }.0 >= D3D_FEATURE_LEVEL_11_0.0 { + D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + } else { + // Feature level 10's. + 8192 + } + } + + pub(super) fn atlas_side(&self) -> u32 { + description(&self.atlas.0).Width + } + + pub(super) fn new_atlas(&mut self, side: u32) { + match atlas(&self.device, side) { + Ok(atlas) => self.atlas = atlas, + Err(error) => eprintln!("No glyph atlas {side} pixels square: {error}"), + } + } + + pub(super) fn write_atlas(&self, origin: [u32; 2], size: [u32; 2], rgba: &[u8]) { + let area = D3D11_BOX { + left: origin[0], + top: origin[1], + front: 0, + right: origin[0] + size[0], + bottom: origin[1] + size[1], + back: 1, + }; + unsafe { + self.context.UpdateSubresource( + &self.atlas.0, + 0, + Some(&area), + rgba.as_ptr().cast(), + size[0] * 4, + 0, + ); + } + } + + pub(super) fn upload_image(&self, image: &RasterImage) -> Image { + let texture = texture( + &self.device, + image.size, + D3D11_BIND_SHADER_RESOURCE, + Some(image.pixels()), + ); + let view = texture.and_then(|texture| resource(&self.device, &texture)); + Image( + view.inspect_err(|error| eprintln!("No image texture: {error}")) + .ok(), + ) + } + + /// Binds `view`, `size` pixels, as the render target, with the pipeline's state. + fn begin(&self, view: &ID3D11RenderTargetView, size: [u32; 2]) { + let context = &self.context; + unsafe { + context.PSSetShaderResources(0, Some(&[None])); + context.OMSetRenderTargets(Some(&[Some(view.clone())]), None); + context.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + context.RSSetState(&self.rasterizer); + context.RSSetViewports(Some(&[D3D11_VIEWPORT { + TopLeftX: 0.0, + TopLeftY: 0.0, + Width: size[0] as f32, + Height: size[1] as f32, + MinDepth: 0.0, + MaxDepth: 1.0, + }])); + context.RSSetScissorRects(Some(&[RECT { + left: 0, + top: 0, + right: size[0] as i32, + bottom: size[1] as i32, + }])); + } + } + + /// Clears `target`, `size` device pixels, to linear `clear` and draws the prepared + /// batches, each group's offscreen first. + pub(super) fn submit( + &mut self, + frame: &Frame<'_>, + target: &Target, + size: [u32; 2], + clear: [f32; 4], + ) { + if self + .groups + .first() + .is_some_and(|picture| picture.size() != size) + { + self.groups.clear(); + } + while self.groups.len() < frame.groups.len() { + match Target::new(&self.device, size) { + Ok(picture) => self.groups.push(picture), + Err(error) => { + eprintln!("No offscreen picture: {error}"); + return; + } + } + } + let gpu = &*self; + let context = &gpu.context; + let bytes: &[u8] = bytemuck::cast_slice(frame.vertices); + let bytes = &bytes[..bytes.len().min(VERTEX_BUFFER_BYTES as usize)]; + unsafe { + let mut mapped = D3D11_MAPPED_SUBRESOURCE::default(); + if let Err(error) = context.Map( + &gpu.buffer, + 0, + D3D11_MAP_WRITE_DISCARD, + 0, + Some(&mut mapped), + ) { + eprintln!("No vertex buffer: {error}"); + return; + } + ptr::copy_nonoverlapping(bytes.as_ptr(), mapped.pData.cast(), bytes.len()); + context.Unmap(&gpu.buffer, 0); + context.IASetInputLayout(&gpu.layout); + let buffer = Some(gpu.buffer.clone()); + let stride = size_of::() as u32; + context.IASetVertexBuffers(0, 1, Some(&buffer), Some(&stride), Some(&0)); + } + let paint = |target: &Target, clear: [f32; 4], batches: &[Batch]| unsafe { + gpu.begin(&target.view, size); + context.VSSetShader(&gpu.vertex, None); + context.PSSetShader(&gpu.fragment, None); + context.ClearRenderTargetView(&target.view, &clear); + for batch in batches { + let [x, y, w, h] = batch.scissor.map(|value| value as i32); + let rect = RECT { + left: x, + top: y, + right: x + w, + bottom: y + h, + }; + context.RSSetScissorRects(Some(&[rect])); + let (resource, sampler) = match batch.blend { + Blend::Image(id) => (frame.image::(id).0.as_ref(), &gpu.linear), + Blend::Group(index) => (Some(&gpu.groups[index].resource), &gpu.linear), + Blend::Over | Blend::Erase | Blend::Multiply => { + (Some(&gpu.atlas.1), &gpu.nearest) + } + }; + context.OMSetBlendState(&gpu.blends[batch.blend.state()], None, u32::MAX); + context.PSSetSamplers(0, Some(&[Some(sampler.clone())])); + context.PSSetShaderResources(0, Some(&[resource.cloned()])); + context.Draw(batch.vertices.len() as u32, batch.vertices.start); + } + }; + for (batches, picture) in frame.groups.iter().zip(&gpu.groups) { + paint(picture, [0.0; 4], batches); + } + paint(target, clear, frame.batches); + unsafe { + context.PSSetShaderResources(0, Some(&[None])); + context.OMSetRenderTargets(None, None); + } + } +} + +type Composition = ( + IDCompositionDevice, + IDCompositionTarget, + IDCompositionVisual, +); + +/// A flip-model swap chain with premultiplied alpha, which DirectComposition shows over +/// all of `hwnd`. +fn compose( + device: &ID3D11Device, + factory: &IDXGIFactory, + hwnd: HWND, +) -> Result<(IDXGISwapChain, Composition)> { + let mut client = RECT::default(); + unsafe { GetClientRect(hwnd, &mut client)? }; + let description = DXGI_SWAP_CHAIN_DESC1 { + Width: client.right.max(1) as u32, + Height: client.bottom.max(1) as u32, + Format: DXGI_FORMAT_B8G8R8A8_UNORM, + SampleDesc: DXGI_SAMPLE_DESC { + Count: 1, + Quality: 0, + }, + BufferUsage: DXGI_USAGE_RENDER_TARGET_OUTPUT, + BufferCount: 2, + Scaling: DXGI_SCALING_STRETCH, + SwapEffect: DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, + AlphaMode: DXGI_ALPHA_MODE_PREMULTIPLIED, + ..Default::default() + }; + // Windows 7 has no dcomp.dll, so it is looked up rather than linked. + type Create = unsafe extern "system" fn(*mut c_void, *const GUID, *mut *mut c_void) -> HRESULT; + unsafe { + let factory: IDXGIFactory2 = factory.cast()?; + let swap_chain = factory.CreateSwapChainForComposition(device, &description, None)?; + let library = LoadLibraryW(w!("dcomp.dll"))?; + let create = GetProcAddress(library, s!("DCompositionCreateDevice")) + .ok_or_else(Error::from_thread)?; + let create = std::mem::transmute:: isize, Create>(create); + let mut composition = ptr::null_mut(); + let dxgi: IDXGIDevice = device.cast()?; + create(dxgi.as_raw(), &IDCompositionDevice::IID, &mut composition).ok()?; + let composition = IDCompositionDevice::from_raw(composition); + let target = composition.CreateTargetForHwnd(hwnd, true)?; + let visual = composition.CreateVisual()?; + visual.SetContent(&swap_chain)?; + target.SetRoot(&visual)?; + composition.Commit()?; + Ok((swap_chain.cast()?, (composition, target, visual))) + } +} + +/// An empty atlas `side` texels square. +fn atlas(device: &ID3D11Device, side: u32) -> Result<(ID3D11Texture2D, ID3D11ShaderResourceView)> { + let texture = texture(device, [side; 2], D3D11_BIND_SHADER_RESOURCE, None)?; + let view = resource(device, &texture)?; + Ok((texture, view)) +} diff --git a/crates/draw/src/render/dual.rs b/crates/draw/src/render/dual.rs index de7d1d57c0d433edba7b2a822e43e1fdb6ae0082..109863cc65eaeff408064db1eb153c08f23a087d 100644 --- a/crates/draw/src/render/dual.rs +++ b/crates/draw/src/render/dual.rs @@ -1,10 +1,13 @@ -//! Both backends in one build, for Windows: wgpu where Direct3D 12 answers, and OpenGL 2.1 -//! where it doesn't, as on Windows 7. Whoever makes the renderer picks one. -use super::{gl, webgpu, *}; +//! Every backend in one build, for Windows: wgpu where Direct3D 12 answers, Direct3D 11 +//! where it doesn't, as on Windows 7, and OpenGL 2.1 where neither does. Whoever makes the +//! renderer picks one. +use super::{d3d11, gl, webgpu, *}; +use std::ffi::c_void; /// What a frame is drawn into, for the backend the renderer draws with. pub enum Target { Wgpu(wgpu::TextureView), + D3d11(d3d11::Target), Gl(gl::Target), } @@ -14,14 +17,19 @@ impl From for Target { } } -impl From for Target { - fn from(target: gl::Target) -> Self { - Self::Gl(target) +impl Target { + pub fn size(&self) -> [u32; 2] { + match self { + Self::Wgpu(view) => [view.texture().width(), view.texture().height()], + Self::D3d11(target) => target.size(), + Self::Gl(target) => target.size(), + } } } pub(super) enum Image { Wgpu(webgpu::Image), + D3d11(d3d11::Image), Gl(gl::Image), } @@ -29,7 +37,16 @@ impl AsRef for Image { fn as_ref(&self) -> &webgpu::Image { match self { Self::Wgpu(image) => image, - Self::Gl(_) => unreachable!("Images belong to the renderer's backend"), + _ => unreachable!("Images belong to the renderer's backend"), + } + } +} + +impl AsRef for Image { + fn as_ref(&self) -> &d3d11::Image { + match self { + Self::D3d11(image) => image, + _ => unreachable!("Images belong to the renderer's backend"), } } } @@ -38,74 +55,109 @@ impl AsRef for Image { fn as_ref(&self) -> &gl::Image { match self { Self::Gl(image) => image, - Self::Wgpu(_) => unreachable!("Images belong to the renderer's backend"), + _ => unreachable!("Images belong to the renderer's backend"), } } } pub(super) enum Gpu { Wgpu(webgpu::Gpu), + D3d11(d3d11::Gpu), Gl(gl::Gpu), } +impl From for Gpu { + fn from(gpu: webgpu::Gpu) -> Self { + Self::Wgpu(gpu) + } +} + +impl From for Gpu { + fn from(gpu: gl::Gpu) -> Self { + Self::Gl(gpu) + } +} + impl Renderer { - pub fn new(device: wgpu::Device, queue: wgpu::Queue, format: wgpu::TextureFormat) -> Self { - Self::with_gpu(Gpu::Wgpu(webgpu::Gpu::new(device, queue, format))) + /// Draws with Direct3D 11 into a swap chain on `window`, an `HWND`; with the adapter's + /// description. + pub fn direct3d11(window: *mut c_void) -> Result<(Self, String), String> { + d3d11::Gpu::new(window) + .map(|(gpu, adapter)| (Self::with_gpu(Gpu::D3d11(gpu)), adapter)) + .map_err(|error| error.to_string()) } +} - /// Draws with the OpenGL context current on this thread, which must stay current - /// whenever the renderer or a `Target` is used. - pub fn opengl() -> Result { - gl::Gpu::new().map(|gpu| Self::with_gpu(Gpu::Gl(gpu))) - } - - /// Copies `target` to the OpenGL context's window, as `gl`'s renderer does. - pub fn present_translucent(&self, target: &gl::Target) { - if let Gpu::Gl(gpu) = &self.gpu { - gpu.present_translucent(target); +/// `$gpu` as whichever backend it holds, named `$backend` in `$body`. +macro_rules! each { + ($gpu:expr, $backend:ident => $body:expr) => { + match $gpu { + Gpu::Wgpu($backend) => $body, + Gpu::D3d11($backend) => $body, + Gpu::Gl($backend) => $body, } - } + }; } impl Gpu { + pub(super) fn target(&self, size: [u32; 2]) -> Result { + match self { + Self::D3d11(gpu) => gpu + .target(size) + .map(Target::D3d11) + .map_err(|error| error.to_string()), + Self::Gl(gpu) => gpu.target(size).map(Target::Gl), + Self::Wgpu(_) => unreachable!("wgpu's targets are its surface's"), + } + } + + pub(super) fn present(&self, target: &Target, translucent: bool) { + match (self, target) { + // Direct3D 11 premultiplies every frame again, which leaves opaque ones be. + (Self::D3d11(gpu), Target::D3d11(target)) => { + if let Err(error) = gpu.present(target) { + eprintln!("Presenting failed: {error}"); + } + } + (Self::Gl(gpu), Target::Gl(target)) => gpu.present(target, translucent), + _ => unreachable!("Frames are drawn into the renderer's backend's targets"), + } + } + + pub(super) fn read_pixels(&self, target: &Target) -> Result, String> { + match (self, target) { + (Self::D3d11(gpu), Target::D3d11(target)) => { + gpu.read_pixels(target).map_err(|error| error.to_string()) + } + (Self::Gl(gpu), Target::Gl(target)) => gpu.read_pixels(target), + _ => unreachable!("Snapshots come from the renderer's backend's targets"), + } + } + pub(super) fn flipped(&self) -> bool { - match self { - Self::Wgpu(gpu) => gpu.flipped(), - Self::Gl(gpu) => gpu.flipped(), - } + each!(self, gpu => gpu.flipped()) } pub(super) fn max_texture_dimension(&self) -> u32 { - match self { - Self::Wgpu(gpu) => gpu.max_texture_dimension(), - Self::Gl(gpu) => gpu.max_texture_dimension(), - } + each!(self, gpu => gpu.max_texture_dimension()) } pub(super) fn atlas_side(&self) -> u32 { - match self { - Self::Wgpu(gpu) => gpu.atlas_side(), - Self::Gl(gpu) => gpu.atlas_side(), - } + each!(self, gpu => gpu.atlas_side()) } pub(super) fn new_atlas(&mut self, side: u32) { - match self { - Self::Wgpu(gpu) => gpu.new_atlas(side), - Self::Gl(gpu) => gpu.new_atlas(side), - } + each!(self, gpu => gpu.new_atlas(side)) } pub(super) fn write_atlas(&self, origin: [u32; 2], size: [u32; 2], rgba: &[u8]) { - match self { - Self::Wgpu(gpu) => gpu.write_atlas(origin, size, rgba), - Self::Gl(gpu) => gpu.write_atlas(origin, size, rgba), - } + each!(self, gpu => gpu.write_atlas(origin, size, rgba)) } pub(super) fn upload_image(&self, image: &RasterImage) -> Image { match self { Self::Wgpu(gpu) => Image::Wgpu(gpu.upload_image(image)), + Self::D3d11(gpu) => Image::D3d11(gpu.upload_image(image)), Self::Gl(gpu) => Image::Gl(gpu.upload_image(image)), } } @@ -119,6 +171,7 @@ impl Gpu { ) { match (self, target) { (Self::Wgpu(gpu), Target::Wgpu(view)) => gpu.submit(frame, view, size, clear), + (Self::D3d11(gpu), Target::D3d11(target)) => gpu.submit(frame, target, size, clear), (Self::Gl(gpu), Target::Gl(target)) => gpu.submit(frame, target, size, clear), _ => unreachable!("Frames are drawn into the renderer's backend's targets"), } diff --git a/crates/draw/src/render/dxbc/compile.ps1 b/crates/draw/src/render/dxbc/compile.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..91aa7b22b81b2fb201f72b10fbb77651c05db057 --- /dev/null +++ b/crates/draw/src/render/dxbc/compile.ps1 @@ -0,0 +1,52 @@ +# Compiles draw.hlsl and translucent.hlsl to the shader model 4.0 bytecode d3d11.rs embeds, +# with the d3dcompiler_47.dll Windows 8.1 and later ship: `powershell -File compile.ps1`. +$ErrorActionPreference = 'Stop' +Add-Type -TypeDefinition @' +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +[ComImport, Guid("8BA5FB08-5195-40e2-AC58-0D989C3A0102"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +public interface ID3DBlob { + [PreserveSig] IntPtr GetBufferPointer(); + [PreserveSig] UIntPtr GetBufferSize(); +} + +public static class Fxc { + [DllImport("d3dcompiler_47.dll", CharSet = CharSet.Ansi)] + static extern int D3DCompile(byte[] source, UIntPtr size, string name, IntPtr defines, + IntPtr include, string entry, string target, uint flags, uint effectFlags, + out ID3DBlob code, out ID3DBlob errors); + + static byte[] Bytes(ID3DBlob blob) { + var bytes = new byte[(int)blob.GetBufferSize()]; + Marshal.Copy(blob.GetBufferPointer(), bytes, 0, bytes.Length); + return bytes; + } + + public static byte[] Compile(string path, string entry, string target) { + var source = File.ReadAllBytes(path); + ID3DBlob code, errors; + // D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3 + int result = D3DCompile(source, (UIntPtr)source.Length, Path.GetFileName(path), + IntPtr.Zero, IntPtr.Zero, entry, target, (1u << 11) | (1u << 15), 0, + out code, out errors); + if (result < 0) { + throw new Exception(errors == null ? "D3DCompile: 0x" + result.ToString("x8") + : Encoding.ASCII.GetString(Bytes(errors))); + } + return Bytes(code); + } +} +'@ +foreach ($shader in @( + @('..\..\draw.hlsl', 'draw'), + @('..\translucent.hlsl', 'translucent') +)) { + $source = Join-Path $PSScriptRoot $shader[0] + foreach ($stage in @(@('vertex', 'vs_4_0'), @('fragment', 'ps_4_0'))) { + $out = Join-Path $PSScriptRoot ($shader[1] + '.' + $stage[0] + '.dxbc') + [IO.File]::WriteAllBytes($out, [Fxc]::Compile($source, $stage[0], $stage[1])) + } +} diff --git a/crates/draw/src/render/dxbc/draw.fragment.dxbc b/crates/draw/src/render/dxbc/draw.fragment.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..eaba5e5dce67e4fc4f79b1ab31cede72742e9173 GIT binary patch literal 11252 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 literal 0 HcmV?d00001 diff --git a/crates/draw/src/render/dxbc/draw.vertex.dxbc b/crates/draw/src/render/dxbc/draw.vertex.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..9ecc97f615f4002b66e4c4c347aa302abfb3800a GIT binary patch literal 1204 zcmb7>Jxd%>7=`b;x_*BxX#|m}Bx!<*NYW(gj;n&YVP^?;B7QEIOjrj3RHS&r5@w zUn9gogPWgu0XjUVCN1p+Er1TUI^Bo@I=owtmUiX<=y2-PmNrY3O4WDGX0xK1|4472 zIi5*6&;YD$J!>==(I$aqLIp%a_=%Ad= zD6NM+pkrQ-7dZWBXUN1Eb~MXYc$H*9BNrLV6UlBGS<%ReW|{layF#<(C-au3$;kRU&~N5lJ4aGAN2jB`3W+nWFY_m literal 0 HcmV?d00001 diff --git a/crates/draw/src/render/dxbc/translucent.fragment.dxbc b/crates/draw/src/render/dxbc/translucent.fragment.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..019db90b967390456e30cbcd5e2f18776bb27909 GIT binary patch literal 960 zcmZ`%JxE(o6#nvzXaY6CBBZGFjV<^aiWaTu%a755TFFbqO@c-Zm_B*Q+@Xs|sB@rn z7eYICDX4>!t6SG@og7@_cY5!Y_|OC2JNKUNeCM2d@5^mwvg6->G|w;dXMbD&uD+do zZG`}w^#Hx}Z-`Uk4-qGkW4w@C%pY)XO!7x$6Yg|y3}m=`M_7c^2ooI|9VGV|vFn#> z6|7dbeXs8AHtbi0*Y@&?yJEZh<(-OeXT92C^?-}%sflT{+aKJewK1*lr?&|)smGE2 zTZ{{LV{6^3R~uFD6Fxqnk>q;~*VGit{$8cQKJId^Fvh_h#+$@ug5w{?xdKWhV8=!{ z8CQGhU16ykTkZFGWT`vMV<(|vd7V20^k3+hq~)|N`wDFfkNJfckkv0y#R0T!Z1?+rw2Il#}Q@^1r% zFbhPwwQ@%3-+czo*5}&~@5Ic=`|bUrIr9#3r*1J_Y_QgI!u(fKGeQ`Xz4Uv^f}GTm JSTG*c-vK<5Xe9su literal 0 HcmV?d00001 diff --git a/crates/draw/src/render/dxbc/translucent.vertex.dxbc b/crates/draw/src/render/dxbc/translucent.vertex.dxbc new file mode 100644 index 0000000000000000000000000000000000000000..2e4d58702fdce1b9a291fcf8f3d6bd1fb404ce0a GIT binary patch literal 612 zcmZ>XaB`N;bPHEj?#+Hu`{DP?pyIQP3=9k@ObiUHK-vU|8-REV5WfInpk$DXtD6gu zjSOT!9F~9o89EslKy2U4x=ltA)%p4%Y&_K_S z!86$1PY0+TWG4p@D*!PFumLeh3Sb~Oi6Dapd!TVz literal 0 HcmV?d00001 diff --git a/crates/draw/src/render/gl.rs b/crates/draw/src/render/gl.rs index 396ab186e4738d319638c81f69070a547b58ac61..0b9e27e09ae8ee3bd4651ce96d1cbcdbc7e2e393 100644 --- a/crates/draw/src/render/gl.rs +++ b/crates/draw/src/render/gl.rs @@ -7,7 +7,6 @@ use super::*; use std::{ ffi::{CStr, CString, c_char, c_void}, - mem::offset_of, ptr, }; @@ -250,9 +249,6 @@ functions! { ); } -/// Blending a premultiplied picture over what lies beneath. -const PREMULTIPLIED: [GLenum; 4] = [ONE, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA]; - /// An sRGB RGBA texture, deleted with its value. pub(super) struct Image { name: GLuint, @@ -305,9 +301,9 @@ pub struct Target { } impl Target { - /// Needs the renderer's context current, as every method here does. - pub fn new(size: [u32; 2]) -> Result { - let texture = Image::new(size, NEAREST, None); + /// Sampled with `filter`. + fn new(size: [u32; 2], filter: GLint) -> Result { + let texture = Image::new(size, filter, None); let mut framebuffer = 0; unsafe { glGenFramebuffersEXT(1, &mut framebuffer); @@ -329,53 +325,6 @@ impl Target { pub fn size(&self) -> [u32; 2] { self.texture.size } - - /// Copies the frame to the context's window, which is the same size. - pub fn present(&self) { - let [width, height] = self.size().map(|side| side as GLint); - unsafe { - glBindFramebufferEXT(READ_FRAMEBUFFER, self.framebuffer); - glBindFramebufferEXT(DRAW_FRAMEBUFFER, 0); - glBlitFramebufferEXT( - 0, - 0, - width, - height, - 0, - 0, - width, - height, - COLOR_BUFFER_BIT, - NEAREST as GLenum, - ); - glBindFramebufferEXT(FRAMEBUFFER, 0); - } - } - - /// sRGB-encoded RGBA rows, top first. - pub fn read_pixels(&self) -> Vec { - let [width, height] = self.size(); - let mut pixels = vec![0; (width * height * 4) as usize]; - unsafe { - glBindFramebufferEXT(FRAMEBUFFER, self.framebuffer); - glReadPixels( - 0, - 0, - width as GLsizei, - height as GLsizei, - RGBA, - UNSIGNED_BYTE, - pixels.as_mut_ptr().cast(), - ); - glBindFramebufferEXT(FRAMEBUFFER, 0); - } - pixels - .chunks(width as usize * 4) - .rev() - .flatten() - .copied() - .collect() - } } impl Drop for Target { @@ -396,38 +345,10 @@ pub(super) struct Gpu { groups: Vec, } -/// Each attribute's name, component count and offset, bound to its index in the shader. -const ATTRIBUTES: [(&CStr, GLint, usize); 9] = [ - (c"position", 2, offset_of!(Vertex, position)), - (c"uv", 2, offset_of!(Vertex, uv)), - (c"color", 4, offset_of!(Vertex, color)), - (c"local", 2, offset_of!(Vertex, local)), - (c"shape", 4, offset_of!(Vertex, shape)), - (c"stroke", 1, offset_of!(Vertex, stroke)), - (c"clip_local", 2, offset_of!(Vertex, clip_local)), - (c"clip", 3, offset_of!(Vertex, clip)), - (c"blur", 1, offset_of!(Vertex, blur)), -]; - -#[cfg(not(feature = "wgpu"))] -impl Renderer { - /// Draws with the OpenGL context current on this thread, which must stay current - /// whenever the renderer or a `Target` is used. - pub fn opengl() -> Result { - Gpu::new().map(Self::with_gpu) - } - - /// Copies `target` to the context's window, the same size, premultiplying each pixel - /// again in sRGB, as a window server compositing a transparent surface needs. - pub fn present_translucent(&self, target: &Target) { - self.gpu.present_translucent(target); - } -} - impl Gpu { pub(super) fn new() -> Result { load()?; - let names: Vec<_> = ATTRIBUTES.iter().map(|(name, _, _)| *name).collect(); + let names = ATTRIBUTES.map(|(name, _, _)| name); let draw = unsafe { program(include_str!("../draw.glsl"), &names)? }; let translucent = unsafe { program(include_str!("translucent.glsl"), &[c"position"])? }; let [mut buffer, mut triangle] = [0; 2]; @@ -445,7 +366,7 @@ impl Gpu { ); glGetIntegerv(MAX_TEXTURE_SIZE, &mut max_texture); } - Ok(Gpu { + Ok(Self { program: draw, buffer, translucent, @@ -456,7 +377,36 @@ impl Gpu { }) } - pub(super) fn present_translucent(&self, target: &Target) { + /// Needs the renderer's context current, as every method here does. + pub(super) fn target(&self, size: [u32; 2]) -> Result { + Target::new(size, NEAREST) + } + + /// Copies `target` to the context's window, the same size; if `translucent`, + /// premultiplying each pixel again in sRGB, as a window server compositing a transparent + /// surface needs. + pub(super) fn present(&self, target: &Target, translucent: bool) { + if !translucent { + let [width, height] = target.size().map(|side| side as GLint); + unsafe { + glBindFramebufferEXT(READ_FRAMEBUFFER, target.framebuffer); + glBindFramebufferEXT(DRAW_FRAMEBUFFER, 0); + glBlitFramebufferEXT( + 0, + 0, + width, + height, + 0, + 0, + width, + height, + COLOR_BUFFER_BIT, + NEAREST as GLenum, + ); + glBindFramebufferEXT(FRAMEBUFFER, 0); + } + return; + } let [width, height] = target.size().map(|side| side as f32); let program = self.translucent; unsafe { @@ -518,6 +468,31 @@ impl Gpu { } } + /// sRGB-encoded RGBA rows, top first. + pub(super) fn read_pixels(&self, target: &Target) -> Result, String> { + let [width, height] = target.size(); + let mut pixels = vec![0; (width * height * 4) as usize]; + unsafe { + glBindFramebufferEXT(FRAMEBUFFER, target.framebuffer); + glReadPixels( + 0, + 0, + width as GLsizei, + height as GLsizei, + RGBA, + UNSIGNED_BYTE, + pixels.as_mut_ptr().cast(), + ); + glBindFramebufferEXT(FRAMEBUFFER, 0); + } + Ok(pixels + .chunks(width as usize * 4) + .rev() + .flatten() + .copied() + .collect()) + } + pub(super) fn upload_image(&self, image: &RasterImage) -> Image { Image::new(image.size, LINEAR, Some(image.pixels())) } @@ -539,14 +514,9 @@ impl Gpu { self.groups.clear(); } while self.groups.len() < frame.groups.len() { - match Target::new(size) { - Ok(picture) => unsafe { - // Filtered, so a picture leaning back stays smooth. - glBindTexture(TEXTURE_2D, picture.texture.name); - glTexParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, LINEAR); - glTexParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR); - self.groups.push(picture); - }, + // Filtered, so a picture leaning back stays smooth. + match Target::new(size, LINEAR) { + Ok(picture) => self.groups.push(picture), Err(error) => { eprintln!("{error}"); return; @@ -555,36 +525,30 @@ impl Gpu { } let [width, height] = size.map(|side| side as GLsizei); let gpu = &*self; - let begin = |target: &Target, clear: [f32; 4]| unsafe { + let paint = |target: &Target, clear: [f32; 4], batches: &[Batch]| unsafe { glBindFramebufferEXT(FRAMEBUFFER, target.framebuffer); glDisable(SCISSOR_TEST); glClearColor(clear[0], clear[1], clear[2], clear[3]); glClear(COLOR_BUFFER_BIT); glEnable(SCISSOR_TEST); - }; - let draw = |batches: &[Batch]| unsafe { for batch in batches { let [x, y, w, h] = batch.scissor.map(|value| value as GLint); glScissor(x, height - y - h, w, h); - let (texture, [src_rgb, dst_rgb, src_alpha, dst_alpha]) = match batch.blend { - Blend::Over => ( - gpu.atlas.name, - [SRC_ALPHA, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA], - ), - Blend::Image(id) => { - let image: &Image = frame.images[&id].texture.as_ref(); - (image.name, PREMULTIPLIED) - } - Blend::Erase => ( - gpu.atlas.name, - [ZERO, ONE_MINUS_SRC_ALPHA, ZERO, ONE_MINUS_SRC_ALPHA], - ), - Blend::Multiply => { - (gpu.atlas.name, [DST_COLOR, ONE_MINUS_SRC_ALPHA, ZERO, ONE]) - } - }; + let [src_rgb, dst_rgb, src_alpha, dst_alpha] = Blend::STATES[batch.blend.state()] + .map(|factor| match factor { + Factor::Zero => ZERO, + Factor::One => ONE, + Factor::SourceAlpha => SRC_ALPHA, + Factor::OneMinusSourceAlpha => ONE_MINUS_SRC_ALPHA, + Factor::Destination => DST_COLOR, + }); glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha); - glBindTexture(TEXTURE_2D, texture); + let texture = match batch.blend { + Blend::Image(id) => frame.image::(id), + Blend::Group(index) => &gpu.groups[index].texture, + Blend::Over | Blend::Erase | Blend::Multiply => &gpu.atlas, + }; + glBindTexture(TEXTURE_2D, texture.name); glDrawArrays( TRIANGLES, batch.vertices.start as GLint, @@ -605,38 +569,22 @@ impl Gpu { frame.vertices.as_ptr().cast(), STREAM_DRAW, ); - for (index, (_, components, offset)) in ATTRIBUTES.iter().enumerate() { + for (index, (_, floats, offset)) in ATTRIBUTES.into_iter().enumerate() { glEnableVertexAttribArray(index as GLuint); glVertexAttribPointer( index as GLuint, - *components, + floats as GLint, FLOAT, 0, size_of::() as GLsizei, - ptr::without_provenance(*offset), + ptr::without_provenance(offset), ); } glEnable(BLEND); - for (group, picture) in frame.groups.iter().zip(&gpu.groups) { - begin(picture, [0.0; 4]); - draw(&frame.batches[group.batches.clone()]); + for (batches, picture) in frame.groups.iter().zip(&gpu.groups) { + paint(picture, [0.0; 4], batches); } - begin(target, clear); - let mut next = 0; - for (group, picture) in frame.groups.iter().zip(&gpu.groups) { - draw(&frame.batches[next..group.batches.start]); - glScissor(0, 0, width, height); - let [src_rgb, dst_rgb, src_alpha, dst_alpha] = PREMULTIPLIED; - glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha); - glBindTexture(TEXTURE_2D, picture.texture.name); - glDrawArrays( - TRIANGLES, - group.composite.start as GLint, - group.composite.len() as GLsizei, - ); - next = group.batches.end; - } - draw(&frame.batches[next..]); + paint(target, clear, frame.batches); glDisable(SCISSOR_TEST); glDisable(BLEND); glBindFramebufferEXT(FRAMEBUFFER, 0); diff --git a/crates/draw/src/render/icon.rs b/crates/draw/src/render/icon.rs index fb5c47a6184bd03dd676a496a497c4fd4bad4bd1..8b4574381d3835d3a2f988e0e18c874529c495c2 100644 --- a/crates/draw/src/render/icon.rs +++ b/crates/draw/src/render/icon.rs @@ -1,3 +1,4 @@ +use super::{from_hsl, to_hsl}; use swash::{ scale::image::{Content, Image}, zeno::{self, Cap, Fill, Join, Mask, PathBuilder, Placement, Point, Stroke, Style, Transform}, @@ -140,11 +141,7 @@ pub(crate) fn rasterize(sources: &[&str], size: u32, ink: [f32; 3], palette: &Pa let [x, y] = [index % side as usize, index / side as usize] .map(|device| device as f32 + 0.5) .map(|device| device * 16.0 / size); - let color = color([x, y]); - for channel in 0..3 { - pixel[channel] = color[channel] * alpha + pixel[channel] * (1.0 - alpha); - } - pixel[3] = alpha + pixel[3] * (1.0 - alpha); + over(pixel, color([x, y]), alpha); } } } @@ -224,15 +221,18 @@ fn picture(node: roxmltree::Node, side: u32, pixels: &mut [[f32; 4]]) { for (column, row, color) in shown.enumerate_pixels() { let pixel = &mut pixels[((top + row) * side + left + column) as usize]; let [r, g, b, a] = color.0; - let alpha = f32::from(a) / 255.0; - let color = super::srgb(r, g, b); - for channel in 0..3 { - pixel[channel] = color[channel] * alpha + pixel[channel] * (1.0 - alpha); - } - pixel[3] = alpha + pixel[3] * (1.0 - alpha); + over(pixel, super::srgb(r, g, b), f32::from(a) / 255.0); } } +/// Paints `color` at `alpha` over premultiplied `pixel`. +fn over(pixel: &mut [f32; 4], color: [f32; 4], alpha: f32) { + for channel in 0..3 { + pixel[channel] = color[channel] * alpha + pixel[channel] * (1.0 - alpha); + } + pixel[3] = alpha + pixel[3] * (1.0 - alpha); +} + fn hex(value: &str) -> [f32; 4] { let [_, r, g, b] = u32::from_str_radix(value.strip_prefix('#').unwrap(), 16) .unwrap() @@ -364,11 +364,11 @@ impl Shift { let mean: [f32; 3] = std::array::from_fn(|channel| { colors .iter() - .map(|color| encode(color[channel])) + .map(|color| crate::encode(color[channel])) .sum::() / count }); - let [from, to] = [mean, target.map(encode)].map(hsl); + let [from, to] = [mean, target.map(crate::encode)].map(to_hsl); (count > 0.0).then(|| { Self([ to[0] - from[0], @@ -379,61 +379,19 @@ impl Shift { } fn apply(&self, color: [f32; 4]) -> [f32; 4] { - let [hue, saturation, lightness] = hsl([color[0], color[1], color[2]].map(encode)); + let [hue, saturation, lightness] = + to_hsl([color[0], color[1], color[2]].map(crate::encode)); let [turn, scale, lift] = self.0; - let [r, g, b] = rgb([ + let [r, g, b] = from_hsl([ (hue + turn).rem_euclid(360.0), (saturation * scale).clamp(0.0, 1.0), (lightness + lift).clamp(0.0, 1.0), ]) - .map(decode); + .map(crate::linear); [r, g, b, color[3]] } } -fn encode(linear: f32) -> f32 { - if linear <= 0.003_130_8 { - linear * 12.92 - } else { - 1.055 * linear.powf(1.0 / 2.4) - 0.055 - } -} - -fn decode(encoded: f32) -> f32 { - if encoded <= 0.040_45 { - encoded / 12.92 - } else { - ((encoded + 0.055) / 1.055).powf(2.4) - } -} - -/// Hue in degrees, saturation and lightness of an encoded sRGB colour. -fn hsl([r, g, b]: [f32; 3]) -> [f32; 3] { - let [max, min] = [r.max(g).max(b), r.min(g).min(b)]; - let lightness = (max + min) / 2.0; - let range = max - min; - if range == 0.0 { - return [0.0, 0.0, lightness]; - } - let saturation = range / (1.0 - (2.0 * lightness - 1.0).abs()); - let sector = if max == r { - (g - b) / range - } else if max == g { - (b - r) / range + 2.0 - } else { - (r - g) / range + 4.0 - }; - [(sector * 60.0).rem_euclid(360.0), saturation, lightness] -} - -fn rgb([hue, saturation, lightness]: [f32; 3]) -> [f32; 3] { - let chroma = (1.0 - (2.0 * lightness - 1.0).abs()) * saturation; - [0.0, 8.0, 4.0].map(|offset: f32| { - let k = (offset + hue / 30.0).rem_euclid(12.0); - lightness - chroma / 2.0 * (k - 3.0).min(9.0 - k).clamp(-1.0, 1.0) - }) -} - /// The tight box around a path's geometry, curves included, as SVG's bounding box is. fn bounds(data: &str) -> [[f32; 2]; 2] { struct Sampled { @@ -567,11 +525,11 @@ mod tests { let image = rasterize(&[ART], 16, [0.0; 3], palette); let at = (y * 16 + 8) * 4; let [r, g, b] = [0, 1, 2].map(|channel| f32::from(image.data[at + channel]) / 255.0); - hsl([r, g, b]) + to_hsl([r, g, b]) }; let plain = Palette::default(); let green = Palette { - accent: Some([0.0, 1.0, 0.0].map(decode)), + accent: Some([0.0, 1.0, 0.0].map(crate::linear)), ..plain }; let [light, dark] = [2, 6].map(|y| pixel(&green, y)); @@ -583,7 +541,7 @@ mod tests { assert!(((light[2] + dark[2]) / 2.0 - 0.5).abs() < 0.02); assert_eq!(pixel(&green, 10), pixel(&plain, 10)); assert_eq!(pixel(&green, 14), [0.0, 0.0, 0.0]); - assert!((pixel(&plain, 2)[0] - hsl([0.5, 0.627, 1.0])[0]).abs() < 2.0); + assert!((pixel(&plain, 2)[0] - to_hsl([0.5, 0.627, 1.0])[0]).abs() < 2.0); } #[test] diff --git a/crates/draw/src/render/pdf.rs b/crates/draw/src/render/pdf.rs index 064a130032576ccea9ff37dd11cb75db6ad5a6e1..3e4c11e2559f4985cb2b19764079f9696b03bafd 100644 --- a/crates/draw/src/render/pdf.rs +++ b/crates/draw/src/render/pdf.rs @@ -37,7 +37,6 @@ pub fn pdf(title: &str, sheets: &[Sheet<'_>]) -> Result, RenderError> { images: HashMap::new(), states: HashMap::new(), scale: ScaleContext::new(), - rows: None, }; let catalog = document.reserve(); let tree = document.reserve(); @@ -101,9 +100,6 @@ struct Document { /// Graphics states by fill and stroke opacity bits and whether they multiply. states: HashMap<(u32, bool), Ref>, scale: ScaleContext, - /// The top and bottom of the layer drawn, in its units, where it clips; lines of text - /// outside it are left out, so that no sheet's text layer holds text it does not show. - rows: Option<[f32; 2]>, } #[derive(Hash, PartialEq, Eq)] @@ -258,7 +254,9 @@ impl Document { .clip_nonzero() .end_path(); } - self.rows = layer + // Lines of text outside a clipping layer are left out, so that no sheet's text + // layer holds text it does not show. + let rows = layer .clip .map(|clip| [clip[1], clip[3]].map(|y| (y - layer.origin[1]) / layer.scale)); content.transform([ @@ -270,7 +268,7 @@ impl Document { layer.origin[1], ]); for primitive in layer.primitives { - self.primitive(&mut content, &mut used, primitive)?; + self.primitive(&mut content, &mut used, primitive, rows)?; } content.restore_state(); } @@ -290,28 +288,30 @@ impl Document { content.set_fill_rgb(red, green, blue); } if color[3] < 1.0 { - let state = self.state(color[3], false); - Used::add(&mut used.states, state); - content.set_parameters(Name(format!("G{}", state.get()).as_bytes())); + self.opacity(content, used, color[3], false); } } - fn state(&mut self, opacity: f32, multiply: bool) -> Ref { - let key = (opacity.clamp(0.0, 1.0).to_bits(), multiply); - if let Some(state) = self.states.get(&key) { - return *state; - } - let state = self.reserve(); - let mut writer = self.pdf.ext_graphics(state); - writer - .non_stroking_alpha(opacity.clamp(0.0, 1.0)) - .stroking_alpha(opacity.clamp(0.0, 1.0)); - if multiply { - writer.blend_mode(BlendMode::Multiply); - } - writer.finish(); - self.states.insert(key, state); - state + /// Paints at `opacity`, multiplying what lies beneath if `multiply`. + fn opacity(&mut self, content: &mut Content, used: &mut Used, opacity: f32, multiply: bool) { + let opacity = opacity.clamp(0.0, 1.0); + let key = (opacity.to_bits(), multiply); + let state = match self.states.get(&key) { + Some(state) => *state, + None => { + let state = self.reserve(); + let mut writer = self.pdf.ext_graphics(state); + writer.non_stroking_alpha(opacity).stroking_alpha(opacity); + if multiply { + writer.blend_mode(BlendMode::Multiply); + } + writer.finish(); + self.states.insert(key, state); + state + } + }; + Used::add(&mut used.states, state); + content.set_parameters(Name(format!("G{}", state.get()).as_bytes())); } fn primitive( @@ -319,6 +319,7 @@ impl Document { content: &mut Content, used: &mut Used, primitive: &Primitive<'_>, + rows: Option<[f32; 2]>, ) -> Result<(), RenderError> { match primitive { Primitive::Text { @@ -334,7 +335,7 @@ impl Document { .clip_nonzero() .end_path(); } - text.runs(&mut |run| self.run(content, used, run, *origin, *ink))?; + text.runs(&mut |run| self.run(content, used, run, *origin, *ink, rows))?; content.restore_state(); } Primitive::Icon { @@ -364,9 +365,7 @@ impl Document { }; content.save_state(); if tint[3] < 1.0 { - let state = self.state(tint[3], false); - Used::add(&mut used.states, state); - content.set_parameters(Name(format!("G{}", state.get()).as_bytes())); + self.opacity(content, used, tint[3], false); } self.place( content, @@ -603,9 +602,7 @@ impl Document { color, } => { content.save_state(); - let state = self.state(color[3], true); - Used::add(&mut used.states, state); - content.set_parameters(Name(format!("G{}", state.get()).as_bytes())); + self.opacity(content, used, color[3], true); let [red, green, blue] = encoded(*color); content .set_stroke_rgb(red, green, blue) @@ -649,7 +646,7 @@ impl Document { return [pixel[0], pixel[1], pixel[2], alpha]; } let [red, green, blue] = [pixel[0], pixel[1], pixel[2]].map(|byte| { - let linear = super::linear(f32::from(byte) / 255.0); + let linear = crate::linear(f32::from(byte) / 255.0); srgb_byte((linear * 255.0 / f32::from(alpha)).min(1.0)) }); [red, green, blue, alpha] @@ -756,15 +753,13 @@ impl Document { run: GlyphRun<'_>, origin: [f32; 2], ink: [f32; 4], + rows: Option<[f32; 2]>, ) -> Result<(), RenderError> { let [top, bottom] = [ origin[1] + run.line[0], origin[1] + run.line[0] + run.line[1], ]; - if self - .rows - .is_some_and(|[first, last]| bottom <= first || top >= last) - { + if rows.is_some_and(|[first, last]| bottom <= first || top >= last) { return Ok(()); } let font = self.font(run.font, run.index)?; diff --git a/crates/draw/src/render/translucent.hlsl b/crates/draw/src/render/translucent.hlsl new file mode 100644 index 0000000000000000000000000000000000000000..eb692e477b57f3bd3b4808be5a87acdf5fa42c0d --- /dev/null +++ b/crates/draw/src/render/translucent.hlsl @@ -0,0 +1,21 @@ +// Shader model 4.0 twin of translucent.wgsl: the frame, blended in linear light, premultiplied +// again in sRGB for a window server that composites that way. +Texture2D frame : register(t0); + +float4 vertex(uint index : SV_VertexID) : SV_Position { + float2 corner = float2((index << 1) & 2, index & 2); + return float4(corner * 2.0 - 1.0, 0.0, 1.0); +} + +float3 encode(float3 linear_light) { + return linear_light <= 0.0031308 ? linear_light * 12.92 + : 1.055 * pow(linear_light, 1.0 / 2.4) - 0.055; +} + +float4 fragment(float4 at : SV_Position) : SV_Target { + float4 pixel = frame.Load(int3(at.xy, 0)); + if (pixel.a == 0.0) { + return 0.0; + } + return float4(encode(pixel.rgb / pixel.a) * pixel.a, pixel.a); +} diff --git a/crates/draw/src/render/webgpu.rs b/crates/draw/src/render/webgpu.rs index 1aca9a1cd6f86ce33c3803c68f9559dd578aeadf..dae2dc48ed6b7cb531f7d11f3b833eaac670cbb3 100644 --- a/crates/draw/src/render/webgpu.rs +++ b/crates/draw/src/render/webgpu.rs @@ -17,30 +17,29 @@ impl AsRef for Image { pub(super) struct Gpu { device: wgpu::Device, queue: wgpu::Queue, - pipeline: wgpu::RenderPipeline, - image_pipeline: wgpu::RenderPipeline, - erase_pipeline: wgpu::RenderPipeline, - multiply_pipeline: wgpu::RenderPipeline, - atlas: wgpu::Texture, - bind_group: wgpu::BindGroup, - image_sampler: wgpu::Sampler, + layout: wgpu::BindGroupLayout, + /// A pipeline for each of `Blend::STATES`. + pipelines: [wgpu::RenderPipeline; 4], + atlas: (wgpu::Texture, wgpu::BindGroup), + nearest: wgpu::Sampler, + linear: wgpu::Sampler, vertex_buffer: wgpu::Buffer, format: wgpu::TextureFormat, /// Offscreen pictures for groups, the target's size, and how each is sampled. - groups: Vec<(wgpu::TextureView, wgpu::BindGroup)>, - groups_size: [u32; 2], + groups: Vec<(wgpu::Texture, wgpu::BindGroup)>, } -#[cfg(not(windows))] impl Renderer { pub fn new(device: wgpu::Device, queue: wgpu::Queue, format: wgpu::TextureFormat) -> Self { Self::with_gpu(Gpu::new(device, queue, format)) } + #[cfg(not(windows))] pub fn device(&self) -> &wgpu::Device { &self.gpu.device } + #[cfg(not(windows))] pub fn queue(&self) -> &wgpu::Queue { &self.gpu.queue } @@ -53,7 +52,7 @@ impl Gpu { format: wgpu::TextureFormat, ) -> Self { let shader = device.create_shader_module(wgpu::include_wgsl!("../draw.wgsl")); - let binding_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + let layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Some("Draw texture"), entries: &[ wgpu::BindGroupLayoutEntry { @@ -76,10 +75,23 @@ impl Gpu { }); let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: Some("Draw"), - bind_group_layouts: &[Some(&binding_layout)], + bind_group_layouts: &[Some(&layout)], ..Default::default() }); - let make_pipeline = |blend| { + let attributes: [_; 9] = std::array::from_fn(|index| { + let (_, floats, offset) = ATTRIBUTES[index]; + wgpu::VertexAttribute { + format: [ + wgpu::VertexFormat::Float32, + wgpu::VertexFormat::Float32x2, + wgpu::VertexFormat::Float32x3, + wgpu::VertexFormat::Float32x4, + ][floats - 1], + offset: offset as u64, + shader_location: index as u32, + } + }); + let pipelines = Blend::STATES.map(|[color, dst_color, alpha, dst_alpha]| { device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Draw"), layout: Some(&pipeline_layout), @@ -90,7 +102,7 @@ impl Gpu { buffers: &[Some(wgpu::VertexBufferLayout { array_stride: size_of::() as u64, step_mode: wgpu::VertexStepMode::Vertex, - attributes: &wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x2, 2 => Float32x4, 3 => Float32x2, 4 => Float32x4, 5 => Float32, 6 => Float32x2, 7 => Float32x3, 8 => Float32], + attributes: &attributes, })], }, fragment: Some(wgpu::FragmentState { @@ -99,7 +111,10 @@ impl Gpu { compilation_options: Default::default(), targets: &[Some(wgpu::ColorTargetState { format, - blend: Some(blend), + blend: Some(wgpu::BlendState { + color: component([color, dst_color]), + alpha: component([alpha, dst_alpha]), + }), write_mask: wgpu::ColorWrites::ALL, })], }), @@ -109,63 +124,33 @@ impl Gpu { multiview_mask: None, cache: None, }) - }; - // Coverage accumulates in alpha, leaving premultiplied colour over a transparent clear. - let pipeline = make_pipeline(wgpu::BlendState { - color: wgpu::BlendState::ALPHA_BLENDING.color, - alpha: wgpu::BlendComponent::OVER, }); - let image_pipeline = make_pipeline(wgpu::BlendState::PREMULTIPLIED_ALPHA_BLENDING); - let erase = wgpu::BlendComponent { - src_factor: wgpu::BlendFactor::Zero, - dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha, - operation: wgpu::BlendOperation::Add, - }; - let erase_pipeline = make_pipeline(wgpu::BlendState { - color: erase, - alpha: erase, - }); - // The fragment's colour is scaled by its coverage, so this leaves the target times - // the colour where covered and the target elsewhere; alpha stays. - let multiply_pipeline = make_pipeline(wgpu::BlendState { - color: wgpu::BlendComponent { - src_factor: wgpu::BlendFactor::Dst, - dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha, - operation: wgpu::BlendOperation::Add, - }, - alpha: wgpu::BlendComponent { - src_factor: wgpu::BlendFactor::Zero, - dst_factor: wgpu::BlendFactor::One, - operation: wgpu::BlendOperation::Add, - }, - }); - let (atlas, bind_group) = atlas(&device, &pipeline, ATLAS_SIZE); let vertex_buffer = device.create_buffer(&wgpu::BufferDescriptor { label: Some("Draw vertices"), size: VERTEX_BUFFER_BYTES, usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, mapped_at_creation: false, }); - let image_sampler = device.create_sampler(&wgpu::SamplerDescriptor { - label: Some("Draw image filtering"), - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - ..Default::default() - }); + let sampler = |filter| { + device.create_sampler(&wgpu::SamplerDescriptor { + mag_filter: filter, + min_filter: filter, + ..Default::default() + }) + }; + let nearest = sampler(wgpu::FilterMode::Nearest); + let atlas = atlas(&device, &layout, &nearest, ATLAS_SIZE); Self { + linear: sampler(wgpu::FilterMode::Linear), + nearest, + atlas, device, queue, - pipeline, - image_pipeline, - erase_pipeline, - multiply_pipeline, - atlas, - bind_group, - image_sampler, + layout, + pipelines, vertex_buffer, format, groups: Vec::new(), - groups_size: [0; 2], } } @@ -178,11 +163,11 @@ impl Gpu { } pub(super) fn atlas_side(&self) -> u32 { - self.atlas.width() + self.atlas.0.width() } pub(super) fn new_atlas(&mut self, side: u32) { - (self.atlas, self.bind_group) = atlas(&self.device, &self.pipeline, side); + self.atlas = atlas(&self.device, &self.layout, &self.nearest, side); } pub(super) fn write_atlas(&self, origin: [u32; 2], size: [u32; 2], rgba: &[u8]) { @@ -193,7 +178,7 @@ impl Gpu { y: origin[1], z: 0, }, - ..self.atlas.as_image_copy() + ..self.atlas.0.as_image_copy() }, rgba, wgpu::TexelCopyBufferLayout { @@ -210,21 +195,12 @@ impl Gpu { } pub(super) fn upload_image(&self, image: &RasterImage) -> Image { - let size = wgpu::Extent3d { - width: image.size[0], - height: image.size[1], - depth_or_array_layers: 1, - }; - let texture = self.device.create_texture(&wgpu::TextureDescriptor { - label: Some("Draw image"), - size, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Rgba8UnormSrgb, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - view_formats: &[], - }); + let texture = texture( + &self.device, + image.size, + wgpu::TextureFormat::Rgba8UnormSrgb, + wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + ); self.queue.write_texture( texture.as_image_copy(), image.pixels(), @@ -233,66 +209,9 @@ impl Gpu { bytes_per_row: Some(image.size[0] * 4), rows_per_image: Some(image.size[1]), }, - size, + texture.size(), ); - Image(self.device.create_bind_group(&wgpu::BindGroupDescriptor { - label: Some("Draw image"), - layout: &self.pipeline.get_bind_group_layout(0), - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::TextureView( - &texture.create_view(&Default::default()), - ), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::Sampler(&self.image_sampler), - }, - ], - })) - } - - /// An offscreen picture `size` large for each group, kept for later frames. - fn group_pictures(&mut self, size: [u32; 2], count: usize) { - let gpu = self; - if gpu.groups_size != size { - gpu.groups.clear(); - gpu.groups_size = size; - } - while gpu.groups.len() < count { - let texture = gpu.device.create_texture(&wgpu::TextureDescriptor { - label: Some("Draw group"), - size: wgpu::Extent3d { - width: size[0], - height: size[1], - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: gpu.format, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT - | wgpu::TextureUsages::TEXTURE_BINDING, - view_formats: &[], - }); - let view = texture.create_view(&Default::default()); - let binding = gpu.device.create_bind_group(&wgpu::BindGroupDescriptor { - label: Some("Draw group"), - layout: &gpu.pipeline.get_bind_group_layout(0), - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::TextureView(&view), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::Sampler(&gpu.image_sampler), - }, - ], - }); - gpu.groups.push((view, binding)); - } + Image(binding(&self.device, &self.layout, &texture, &self.linear)) } /// Clears `target`, `size` device pixels, to linear `clear` and draws the prepared @@ -304,30 +223,28 @@ impl Gpu { size: [u32; 2], clear: [f32; 4], ) { - self.group_pictures(size, frame.groups.len()); + if self + .groups + .first() + .is_some_and(|(picture, _)| [picture.width(), picture.height()] != size) + { + self.groups.clear(); + } + while self.groups.len() < frame.groups.len() { + let picture = texture( + &self.device, + size, + self.format, + wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::TEXTURE_BINDING, + ); + let binding = binding(&self.device, &self.layout, &picture, &self.linear); + self.groups.push((picture, binding)); + } let gpu = &*self; gpu.queue .write_buffer(&gpu.vertex_buffer, 0, bytemuck::cast_slice(frame.vertices)); let mut encoder = gpu.device.create_command_encoder(&Default::default()); - let draw = |pass: &mut wgpu::RenderPass, batches: &[Batch]| { - for batch in batches { - let [x, y, width, height] = batch.scissor; - pass.set_scissor_rect(x, y, width, height); - let (pipeline, binding) = match batch.blend { - Blend::Over => (&gpu.pipeline, &gpu.bind_group), - Blend::Image(id) => { - let image: &Image = frame.images[&id].texture.as_ref(); - (&gpu.image_pipeline, &image.0) - } - Blend::Erase => (&gpu.erase_pipeline, &gpu.bind_group), - Blend::Multiply => (&gpu.multiply_pipeline, &gpu.bind_group), - }; - pass.set_pipeline(pipeline); - pass.set_bind_group(0, binding, &[]); - pass.draw(batch.vertices.clone(), 0..1); - } - }; - let begin = |encoder: &mut wgpu::CommandEncoder, view, clear: [f32; 4]| { + let mut paint = |view: &wgpu::TextureView, clear: [f32; 4], batches: &[Batch]| { let [r, g, b, a] = clear.map(f64::from); let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { label: Some("Draw"), @@ -343,67 +260,102 @@ impl Gpu { ..Default::default() }); pass.set_vertex_buffer(0, gpu.vertex_buffer.slice(..)); - pass.forget_lifetime() + for batch in batches { + let [x, y, width, height] = batch.scissor; + pass.set_scissor_rect(x, y, width, height); + pass.set_pipeline(&gpu.pipelines[batch.blend.state()]); + let binding = match batch.blend { + Blend::Image(id) => &frame.image::(id).0, + Blend::Group(index) => &gpu.groups[index].1, + Blend::Over | Blend::Erase | Blend::Multiply => &gpu.atlas.1, + }; + pass.set_bind_group(0, binding, &[]); + pass.draw(batch.vertices.clone(), 0..1); + } }; - for (group, (view, _)) in frame.groups.iter().zip(&gpu.groups) { - let mut pass = begin(&mut encoder, view, [0.0; 4]); - draw(&mut pass, &frame.batches[group.batches.clone()]); + for (batches, (picture, _)) in frame.groups.iter().zip(&gpu.groups) { + paint(&picture.create_view(&Default::default()), [0.0; 4], batches); } - let mut pass = begin(&mut encoder, target, clear); - let mut next = 0; - for (group, (_, binding)) in frame.groups.iter().zip(&gpu.groups) { - draw(&mut pass, &frame.batches[next..group.batches.start]); - pass.set_scissor_rect(0, 0, size[0], size[1]); - pass.set_pipeline(&gpu.image_pipeline); - pass.set_bind_group(0, binding, &[]); - pass.draw(group.composite.clone(), 0..1); - next = group.batches.end; - } - draw(&mut pass, &frame.batches[next..]); - drop(pass); + paint(target, clear, frame.batches); gpu.queue.submit([encoder.finish()]); } } -/// An empty atlas `side` texels square, and how the pipeline samples it. -fn atlas( +fn component([source, destination]: [Factor; 2]) -> wgpu::BlendComponent { + let factor = |factor| match factor { + Factor::Zero => wgpu::BlendFactor::Zero, + Factor::One => wgpu::BlendFactor::One, + Factor::SourceAlpha => wgpu::BlendFactor::SrcAlpha, + Factor::OneMinusSourceAlpha => wgpu::BlendFactor::OneMinusSrcAlpha, + Factor::Destination => wgpu::BlendFactor::Dst, + }; + wgpu::BlendComponent { + src_factor: factor(source), + dst_factor: factor(destination), + operation: wgpu::BlendOperation::Add, + } +} + +fn texture( device: &wgpu::Device, - pipeline: &wgpu::RenderPipeline, - side: u32, -) -> (wgpu::Texture, wgpu::BindGroup) { - let atlas = device.create_texture(&wgpu::TextureDescriptor { - label: Some("Glyph atlas"), + [width, height]: [u32; 2], + format: wgpu::TextureFormat, + usage: wgpu::TextureUsages, +) -> wgpu::Texture { + device.create_texture(&wgpu::TextureDescriptor { + label: Some("Draw"), size: wgpu::Extent3d { - width: side, - height: side, + width, + height, depth_or_array_layers: 1, }, mip_level_count: 1, sample_count: 1, dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Rgba8UnormSrgb, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + format, + usage, view_formats: &[], - }); - let view = atlas.create_view(&Default::default()); - let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - mag_filter: wgpu::FilterMode::Nearest, - min_filter: wgpu::FilterMode::Nearest, - ..Default::default() - }); - let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - label: Some("Glyph atlas"), - layout: &pipeline.get_bind_group_layout(0), + }) +} + +/// How the pipelines sample `texture` through `sampler`. +fn binding( + device: &wgpu::Device, + layout: &wgpu::BindGroupLayout, + texture: &wgpu::Texture, + sampler: &wgpu::Sampler, +) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("Draw"), + layout, entries: &[ wgpu::BindGroupEntry { binding: 0, - resource: wgpu::BindingResource::TextureView(&view), + resource: wgpu::BindingResource::TextureView( + &texture.create_view(&Default::default()), + ), }, wgpu::BindGroupEntry { binding: 1, - resource: wgpu::BindingResource::Sampler(&sampler), + resource: wgpu::BindingResource::Sampler(sampler), }, ], - }); - (atlas, bind_group) + }) +} + +/// An empty atlas `side` texels square, and how the pipelines sample it. +fn atlas( + device: &wgpu::Device, + layout: &wgpu::BindGroupLayout, + nearest: &wgpu::Sampler, + side: u32, +) -> (wgpu::Texture, wgpu::BindGroup) { + let atlas = texture( + device, + [side; 2], + wgpu::TextureFormat::Rgba8UnormSrgb, + wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + ); + let binding = binding(device, layout, &atlas, nearest); + (atlas, binding) } diff --git a/crates/mobile/Cargo.toml b/crates/mobile/Cargo.toml index 8848bbc9c7c15caf7c4007e8e6e7617fe0064312..c6fe6fa3f52730bfbb7dc5c5c5985c3ab92c7bd3 100644 --- a/crates/mobile/Cargo.toml +++ b/crates/mobile/Cargo.toml @@ -19,6 +19,8 @@ pollster = "0.4" resvg = { version = "0.48.1", default-features = false } serde = { version = "1", features = ["derive"] } serde_json = "1" +# Clears a password handed in to unlock a section. +zeroize = "1.9.0" [target.'cfg(target_os = "ios")'.dependencies] objc2 = "0.5.2" diff --git a/crates/mobile/include/snowbound.h b/crates/mobile/include/snowbound.h index f46002ad893265e3cb5bc5ef31712bc6c4ea5060..a8355fb8c626d69e498f71f5aea64adb2248b5cc 100644 --- a/crates/mobile/include/snowbound.h +++ b/crates/mobile/include/snowbound.h @@ -33,6 +33,8 @@ char *sb_library_new_section(const Library *library, const char *folder, const c const char *date, const char *time); char *sb_library_search(const Library *library, const Section *open, const char *path, const char *query); char *sb_library_tagged(const Library *library, const Section *open, const char *path); +bool sb_library_unlock(const Library *library, const char *path, const char *password); +void sb_library_lock_all(const Library *library); char *sb_library_sync_status(const Library *library); void sb_library_set_offline(const Library *library, bool offline); void sb_library_touched(const Library *library, const char *path); @@ -56,6 +58,7 @@ char *sb_section_themes(const Section *section, const char *id); bool sb_section_set_theme(const Section *section, const char *id, uint8_t scope, const char *theme); bool sb_section_flush(const Section *section, double seconds); void sb_section_wake(const Section *section); +void sb_section_set_author(const Section *section, const char *author); void sb_section_free(Section *section); View *sb_view_new(void *layer, const Section *section, const char *id, float width, float height, float scale); @@ -65,6 +68,8 @@ bool sb_view_render(View *view); bool sb_view_frame_pending(const View *view); void sb_view_set_dark(View *view, bool dark); bool sb_view_read_only(const View *view); +char *sb_view_reading(const View *view, float width); +bool sb_view_set_reading(View *view, float width); bool sb_view_reload(View *view, bool discard); void sb_view_focus(View *view, bool focused); void sb_view_content(View *view, float bounds[4]); diff --git a/crates/mobile/src/lib.rs b/crates/mobile/src/lib.rs index 9aaccd99f466b2fa5065948f522574a471a351b7..f21d0ed19663ab86f042a66c3f9e0719e4fc4725 100644 --- a/crates/mobile/src/lib.rs +++ b/crates/mobile/src/lib.rs @@ -37,7 +37,7 @@ use std::{ ffi::{CStr, CString, c_char, c_void}, mem::ManuallyDrop, sync::{ - Arc, Mutex, + Arc, LazyLock, Mutex, MutexGuard, atomic::{AtomicBool, Ordering}, }, task::{Wake, Waker}, @@ -125,29 +125,19 @@ impl Canvas { /// The page on `paper` as OneNote 2010 prints it, footers naming `section`. fn pdf(&self, paper: [f32; 2], section: &str) -> Option> { let page = self.page.editor.page().ok()?; - let mut engine = ENGINES - .lock() - .ok() - .and_then(|mut engines| engines.pop()) - .unwrap_or_default(); + let mut engine = pooled_engine(); let setup = canvas::print::Setup { paper, fit_width: true, footer: canvas::print::Footer::SectionAndPage, }; let pdf = canvas::print::pdf(vec![(section.to_owned(), vec![page])], &mut engine, &setup); - if let Ok(mut engines) = ENGINES.lock() { - engines.push(engine); - } + pool_engine(engine); pdf.ok() } fn new(space: ExGuid, page: Page, pixels: [u32; 2], scale: f32) -> Result { - let mut engine = ENGINES - .lock() - .ok() - .and_then(|mut engines| engines.pop()) - .unwrap_or_default(); + let mut engine = pooled_engine(); let (scene, editor) = PageScene::from_page(page, &mut engine)?; let mut page = PageView::new( editor, @@ -159,7 +149,7 @@ impl Canvas { ); page.touch = true; page.host_viewport = true; - (page.snap_to_grid, page.editor.default_font) = options(); + (page.snap_to_grid, page.editor.default_font) = options().clone(); Ok(Self { page, space, @@ -198,19 +188,7 @@ impl Canvas { /// What the page took since the last call as one edit, or none when it took nothing. fn edit(&mut self) -> Result> { let ops = self.page.editor.take_ops()?; - if ops.is_empty() { - return Ok(None); - } - Ok(Some(Edit { - at: library::filetime(), - ops: ops - .into_iter() - .map(|op| Op::Page { - space: self.space, - op, - }) - .collect(), - })) + Ok((!ops.is_empty()).then(|| page_edit(self.space, ops))) } fn device(&self, point: [f32; 2]) -> [f32; 2] { @@ -633,23 +611,33 @@ fn gpu() -> std::sync::MutexGuard<'static, Option> { /// rather than enumerating the system's fonts again. static ENGINES: Mutex> = Mutex::new(Vec::new()); +fn pooled_engine() -> TextEngine { + ENGINES + .lock() + .ok() + .and_then(|mut engines| engines.pop()) + .unwrap_or_default() +} + +fn pool_engine(engine: TextEngine) { + if let Ok(mut engines) = ENGINES.lock() { + engines.push(engine); + } +} + /// The reader's Snap To Grid and Default font, which every page opened from then on takes, /// and new pages' titles the font's face. -static OPTIONS: Mutex> = Mutex::new(None); +static OPTIONS: LazyLock> = + LazyLock::new(|| Mutex::new((true, canvas::editor::DefaultFont::default()))); -fn options() -> (bool, canvas::editor::DefaultFont) { - OPTIONS - .lock() - .unwrap_or_else(|error| error.into_inner()) - .clone() - .unwrap_or((true, canvas::editor::DefaultFont::default())) +fn options() -> MutexGuard<'static, (bool, canvas::editor::DefaultFont)> { + OPTIONS.lock().unwrap_or_else(|error| error.into_inner()) } /// OneNote's Snap To Grid: taps, drags and shapes land on the placement grid. #[unsafe(no_mangle)] pub extern "C" fn sb_set_snap_to_grid(on: bool) { - let font = options().1; - *OPTIONS.lock().unwrap_or_else(|error| error.into_inner()) = Some((on, font)); + options().0 = on; } /// OneNote's Default font: new text in `face` at `size` points, new titles in `face`. @@ -658,13 +646,11 @@ pub extern "C" fn sb_set_snap_to_grid(on: bool) { /// `face` is NUL-terminated UTF-8. #[unsafe(no_mangle)] pub unsafe extern "C" fn sb_set_default_font(face: *const c_char, size: f32) { - let snap = options().0; - let font = canvas::editor::DefaultFont { + options().1 = canvas::editor::DefaultFont { face: string(face), size, color: None, }; - *OPTIONS.lock().unwrap_or_else(|error| error.into_inner()) = Some((snap, font)); } pub struct View { @@ -676,6 +662,8 @@ pub struct View { section: Arc, /// A conflict page, which shows what is stored and takes no edits. read_only: bool, + /// The column, in page points, a reading view reflows the page into; it takes no edits. + reading: Option, } impl View { @@ -731,13 +719,7 @@ impl View { .unwrap_or_default(); let restyle = onestore::op::restyle(&page, &sheet)?; if !read_only && !restyle.is_empty() { - section.shared.apply(Edit { - at: library::filetime(), - ops: restyle - .into_iter() - .map(|op| Op::Page { space, op }) - .collect(), - })?; + section.shared.apply(page_edit(space, restyle))?; page = section.shared.page(space)?.0; } let frame = Arc::::default(); @@ -757,6 +739,7 @@ impl View { frame, section: Arc::clone(§ion.shared), read_only, + reading: None, }) } @@ -795,7 +778,7 @@ impl View { fn stored(&mut self, result: Result) -> bool { let changed = report(result).unwrap_or(false); match report(self.canvas.edit()) { - Some(Some(_)) if self.read_only => { + Some(Some(_)) if self.read_only || self.reading.is_some() => { let _ = report(self.reload()); } Some(Some(edit)) => { @@ -830,17 +813,54 @@ impl View { } let (page, read_only) = self.section.page(self.canvas.space)?; self.read_only = read_only; + if let Some(column) = self.reading { + return self.show(page, Some(column)); + } Ok(moved(self.canvas.page.refresh(page)?)) } + + /// Shows `page` anew, reflowed into `column` where given and the page reflows; whether + /// it shows reflowed. + fn show(&mut self, page: Page, column: Option) -> Result { + let mut engine = pooled_engine(); + let reflowed = match column { + Some(column) => canvas::reading::read(&page, column, &mut engine)?.page, + None => None, + }; + pool_engine(engine); + self.reading = column.filter(|_| reflowed.is_some()); + let pixels = [self.config.width, self.config.height]; + let mut canvas = Canvas::new( + self.canvas.space, + reflowed.unwrap_or(page), + pixels, + self.canvas.scale, + )?; + canvas.paper = self.canvas.paper; + canvas.page.spelling = self.canvas.page.spelling.take(); + let _ = canvas.page.focus_changed(false)?; + canvas.page.editor.styles = std::mem::take(&mut self.canvas.page.editor.styles); + // SAFETY: `self.canvas` is replaced at once and not used in between. + let old = unsafe { ManuallyDrop::take(&mut self.canvas) }; + self.canvas = ManuallyDrop::new(canvas); + pool_engine(old.page.engine); + Ok(self.reading.is_some()) + } } impl Drop for View { fn drop(&mut self) { // SAFETY: `canvas` is not used again. let canvas = unsafe { ManuallyDrop::take(&mut self.canvas) }; - if let Ok(mut engines) = ENGINES.lock() { - engines.push(canvas.page.engine); - } + pool_engine(canvas.page.engine); + } +} + +/// What a page took as one edit of the page in `space`, made now. +fn page_edit(space: ExGuid, ops: Vec) -> Edit { + Edit { + at: library::filetime(), + ops: ops.into_iter().map(|op| Op::Page { space, op }).collect(), } } @@ -918,10 +938,39 @@ pub extern "C" fn sb_view_set_dark(view: &mut View, dark: bool) { view.canvas.set_dark(dark); } -/// A conflict page: it shows what is stored, and any edit returns it there. +/// A conflict page or a reading view: it shows what is stored, and any edit returns it there. #[unsafe(no_mangle)] pub extern "C" fn sb_view_read_only(view: &View) -> bool { - view.read_only + view.read_only || view.reading.is_some() +} + +/// Whether the page has a reading view `width` points wide, as JSON: `offered`, and the +/// `verdict` saying how it reflows or why not. +#[unsafe(no_mangle)] +pub extern "C" fn sb_view_reading(view: &View, width: f32) -> *mut c_char { + let result = view.section.page(view.canvas.space).and_then(|(page, _)| { + let mut engine = pooled_engine(); + let read = canvas::reading::read(&page, width / POINT, &mut engine); + pool_engine(engine); + Ok(read?.verdict) + }); + report(result).map_or(std::ptr::null_mut(), |verdict| { + let json = + serde_json::json!({ "offered": verdict.offered(), "verdict": format!("{verdict:?}") }); + owned(json.to_string()) + }) +} + +/// Shows the page reflowed into a column `width` points wide, read-only, or with 0 as laid +/// out; whether it now shows reflowed. +#[unsafe(no_mangle)] +pub extern "C" fn sb_view_set_reading(view: &mut View, width: f32) -> bool { + let column = (width > 0.0).then_some(width / POINT); + let shown = view + .section + .page(view.canvas.space) + .and_then(|(page, _)| view.show(page, column)); + report(shown).unwrap_or(false) } /// Shows the page as stored after a change made elsewhere, keeping the caret; with @@ -1234,7 +1283,7 @@ struct Choices { templates: Vec<&'static str>, } -fn srgb(colorref: u32) -> [u8; 3] { +pub(crate) fn srgb(colorref: u32) -> [u8; 3] { let [red, green, blue, _] = colorref.to_le_bytes(); [red, green, blue] } @@ -1399,7 +1448,7 @@ pub extern "C" fn sb_view_date_request(view: &mut View, seconds: &mut i64) -> i8 let Some(date) = view.canvas.page.editor.date() else { return -1; }; - *seconds = (date.timestamp() / 10_000_000) as i64 - 11_644_473_600; + *seconds = library::unix(date.timestamp()); field as i8 } diff --git a/crates/mobile/src/library.rs b/crates/mobile/src/library.rs index be36bdb89a276b9c63e333e481de6f311ef619a0..f28813276c4ee3aa780407c9ad927026c328702b 100644 --- a/crates/mobile/src/library.rs +++ b/crates/mobile/src/library.rs @@ -2,7 +2,7 @@ //! SMB share through the embedded client. A section opens through its replica in the app's //! cache, which stores each edit at once and publishes it in the background. -use crate::{Result, owned, report, string}; +use crate::{Result, owned, report, srgb, string}; use canvas::search::{Entry, Index, Query, Tagged}; use notebook::{ Remote, Replica, @@ -14,6 +14,7 @@ use onestore::{ CommitError, CommitState, ExGuid, PageCreation, PageEdit, Stamp, Transaction, op::{Edit, Op, SectionOp}, page::Page, + protected::Key, }; use std::{ collections::{BTreeMap, HashMap}, @@ -249,6 +250,15 @@ pub(crate) fn files(folder: &Folder, files: &mut BTreeMap) { } } +/// Catalog `path` from the top of the share holding a notebook at `root`. +pub(crate) fn on_share(root: &str, path: &str) -> String { + if root.is_empty() { + path.to_owned() + } else { + format!("{root}/{path}") + } +} + /// When a section's file was last checked for changes, and how it was then. struct Checked { at: Instant, @@ -267,6 +277,8 @@ pub struct Library { open: Mutex)>>, /// Work Offline, which sections opened later follow too. offline: AtomicBool, + /// Keys of the protected sections unlocked this run, by catalog path; in memory only. + keys: Mutex>, /// How long edits wait for a pause in typing before they publish (`Section::set_pause`): /// a file provider such as iCloud Drive uploads each publication, and makes one concurrent /// with another device's a conflict version. @@ -285,8 +297,12 @@ pub(crate) struct Tab { pub(crate) group: String, /// The tab colour in sRGB. pub(crate) color: [u8; 3], - /// Password-protected or unreadable sections list but do not open. + /// Password-protected or unreadable sections list but do not open; a protected one opens + /// once unlocked. pub(crate) readable: bool, + /// Password protected and not unlocked (`sb_library_unlock`). + #[serde(default)] + pub(crate) locked: bool, /// Not on this device yet, as iCloud Drive keeps it elsewhere; the host downloads it. #[serde(default)] pub(crate) downloading: bool, @@ -295,9 +311,9 @@ pub(crate) struct Tab { pub(crate) problem: Option, } -fn rgb(colorref: u32) -> [u8; 3] { - let [red, green, blue, _] = colorref.to_le_bytes(); - [red, green, blue] +/// Titles keep OneNote's line breaks, which a one-line list shows as spaces. +fn one_line(title: &str) -> String { + title.replace(|char: char| char.is_control(), " ") } fn stem(path: &str) -> String { @@ -309,18 +325,21 @@ fn stem(path: &str) -> String { /// A folder's sections, its groups' after them, leaving out the recycle bin OneNote keeps /// deleted sections and pages in. -fn tabs(folder: &Folder, tabs: &mut Vec) { +fn tabs(folder: &Folder, unlocked: &HashMap, tabs: &mut Vec) { for section in &folder.sections { let (name, color, readable) = match §ion.state { SectionState::Readable { name, color, .. } => (name.clone(), *color, true), - SectionState::Locked | SectionState::Unreadable(_) => (None, None, false), + SectionState::Locked => (None, None, unlocked.contains_key(§ion.path)), + SectionState::Unreadable(_) => (None, None, false), }; + let locked = matches!(section.state, SectionState::Locked) && !readable; tabs.push(Tab { name: name.unwrap_or_else(|| stem(§ion.path)), path: section.path.clone(), group: folder.path.clone(), - color: rgb(color.unwrap_or(SECTION_COLOR)), + color: srgb(color.unwrap_or(SECTION_COLOR)), readable, + locked, downloading: false, problem: None, }); @@ -330,8 +349,9 @@ fn tabs(folder: &Folder, tabs: &mut Vec) { name: stem(&entry.path), path: entry.path.clone(), group: folder.path.clone(), - color: rgb(SECTION_COLOR), + color: srgb(SECTION_COLOR), readable: false, + locked: false, downloading: entry.reason == Reason::Evicted, problem: match entry.reason { Reason::InUse => Some("Section in use".into()), @@ -342,7 +362,7 @@ fn tabs(folder: &Folder, tabs: &mut Vec) { } for group in &folder.groups { if !group.path.ends_with("OneNote_RecycleBin") { - self::tabs(group, tabs); + self::tabs(group, unlocked, tabs); } } } @@ -377,6 +397,7 @@ impl Library { background, open: Mutex::default(), offline: AtomicBool::new(false), + keys: Default::default(), pause: if local { Duration::ZERO } else { PAUSE }, }) } @@ -399,6 +420,7 @@ impl Library { background: Some(background), open: Mutex::default(), offline: AtomicBool::new(false), + keys: Default::default(), pause: Duration::ZERO, }; let reached = library.with_notebook(false, |_| Ok(())); @@ -501,6 +523,24 @@ impl Library { change(reopened) } + fn unlocked(&self) -> std::sync::MutexGuard<'_, HashMap> { + self.keys.lock().unwrap_or_else(|error| error.into_inner()) + } + + /// Unlocks the protected section at catalog `path` with `password`; whether it matched. + pub(crate) fn unlock(&self, path: &str, password: &str) -> Result { + let key = self.with_notebook(false, |notebook| match notebook.unlock(path, password) { + Ok(key) => Ok(Some(key)), + Err(notebook::Error::Protected(_)) => Ok(None), + Err(error) => Err(error.into()), + })?; + let unlocked = key.is_some(); + if let Some(key) = key { + self.unlocked().insert(path.to_owned(), key); + } + Ok(unlocked) + } + /// The notebook's sections, read again. pub(crate) fn tabs(&self) -> Result> { if let Place::File(file) = &self.place { @@ -509,8 +549,9 @@ impl Library { name: stem(&path), path, group: String::new(), - color: rgb(SECTION_COLOR), + color: srgb(SECTION_COLOR), readable: true, + locked: false, downloading: false, problem: None, }]); @@ -521,7 +562,7 @@ impl Library { tabs: Vec::new(), files: BTreeMap::new(), }; - tabs(notebook.catalog(), &mut listed.tabs); + tabs(notebook.catalog(), &self.unlocked(), &mut listed.tabs); files(notebook.catalog(), &mut listed.files); if let (Place::Folder(_), Some(background)) = (&self.place, &self.background) { background.watch(notebook.replicas()); @@ -586,25 +627,36 @@ impl Library { |file| Ok(Coordinated(file.to_owned())), notify, )?), - Place::Folder(_) => Ok(self - .notebook() - .as_ref() - .ok_or("A lone section has no notebook")? - .section_with(path, |file| Ok(Coordinated(file.to_owned())), notify)?), + Place::Folder(_) => { + let notebook = self.notebook(); + let notebook = notebook.as_ref().ok_or("A lone section has no notebook")?; + let connect = |file: &Path| Ok(Coordinated(file.to_owned())); + Ok(match self.unlocked().get(path) { + Some(key) => notebook.section_unlocked_with(path, key, connect, notify)?, + None => notebook.section_with(path, connect, notify)?, + }) + } Place::Share { server, root, .. } => { - let file = if root.is_empty() { - path.to_owned() - } else { - format!("{root}/{path}") + let file = on_share(root, path); + let key = self.unlocked().get(path).cloned(); + // A protected section's replica is named by the identity its file holds. + let cache = match &key { + Some(_) => self + .notebook() + .as_ref() + .ok_or("The notebook hasn’t been read")? + .replica_path(path)?, + None => { + let identity = self + .listed() + .and_then(|mut listed| listed.files.remove(path)) + .ok_or("The notebook hasn’t listed this section")?; + let replicas = self.share_replicas().ok_or("Not a share")?; + replicas.join(format!("{identity}.sqlite")) + } }; - let identity = self - .listed() - .and_then(|mut listed| listed.files.remove(path)) - .ok_or("The notebook hasn’t listed this section")?; - let replicas = self.share_replicas().ok_or("Not a share")?; - let cache = replicas.join(format!("{identity}.sqlite")); - std::fs::create_dir_all(&replicas)?; - let replica = Replica::open_or_create(&cache, || { + std::fs::create_dir_all(cache.parent().ok_or("No cache")?)?; + let replica = Replica::open_or_create(&cache, key.as_ref(), || { let client = self.client().ok_or_else(|| { std::io::Error::new( std::io::ErrorKind::NotConnected, @@ -642,13 +694,20 @@ pub(crate) enum Status { pub(crate) struct Shared { pub section: session::Section, /// Who the edits name, as OneNote names the Office user. - pub author: String, + pub author: Mutex, pub status: AtomicU8, } impl Shared { + pub fn author(&self) -> String { + self.author + .lock() + .unwrap_or_else(|error| error.into_inner()) + .clone() + } + pub fn apply(&self, edit: Edit) -> Result<()> { - self.section.apply(&self.author, edit)?; + self.section.apply(&self.author(), edit)?; self.status.store(Status::Saving as u8, Ordering::Relaxed); Ok(()) } @@ -694,7 +753,7 @@ pub(crate) struct Version { pub(crate) created: Option, } -fn unix(filetime: u64) -> i64 { +pub(crate) fn unix(filetime: u64) -> i64 { (filetime / 10_000_000) as i64 - 11_644_473_600 } @@ -709,7 +768,7 @@ pub(crate) fn filetime() -> u64 { /// A page OneNote 2010 would create now, titled `date` and `time` as the host formats /// them: the long date and the short time; titled in the Default font's face. fn dated(author: &str, date: &str, time: &str) -> Result { - let font = crate::options().1; + let font = crate::options().1.clone(); Ok(PageCreation::new(None, Some(""), author)? .titled_in(&font.face, font.color)? .dated(date, time)?) @@ -718,12 +777,8 @@ fn dated(author: &str, date: &str, time: &str) -> Result { impl Section { /// The notebook's themes; none for a lone section. pub(crate) fn themes(&self) -> notebook::sidecar::themes::Themes { - let notebook = self - .library - .notebook - .lock() - .unwrap_or_else(|error| error.into_inner()); - notebook + self.library + .notebook() .as_ref() .and_then(|notebook| crate::report(notebook.themes().map_err(Into::into))) .unwrap_or_default() @@ -731,12 +786,8 @@ impl Section { /// Merges `change` into the notebook's themes. pub(crate) fn save_themes(&self, change: notebook::sidecar::themes::Themes) -> Result<()> { - let notebook = self - .library - .notebook - .lock() - .unwrap_or_else(|error| error.into_inner()); - notebook + self.library + .notebook() .as_ref() .ok_or("A section on its own keeps no themes")? .save_themes(change)?; @@ -772,7 +823,7 @@ impl Section { ) -> Result { let shared = Arc::new(Shared { section: library.section(path, notify)?, - author, + author: Mutex::new(author), status: AtomicU8::new(0), }); let mut open = library @@ -792,8 +843,7 @@ impl Section { .into_iter() .map(|(space, title, level)| Row { id: space.to_string(), - // Titles keep OneNote's line breaks, which a one-line list shows as spaces. - title: title.replace(|char: char| char.is_control(), " "), + title: one_line(&title), level, versions: conflicts .iter() @@ -821,7 +871,7 @@ impl Section { date: &str, time: &str, ) -> Result { - let creation = dated(&self.shared.author, date, time)?; + let creation = dated(&self.shared.author(), date, time)?; let space = creation.space(); let mut ops = vec![Op::Section(SectionOp::Create(creation))]; if let Some(parent) = parent { @@ -857,14 +907,14 @@ impl Section { if listed.iter().any(|(page, ..)| *page == space) { if self.library.notebook().is_some() { let page = section.page(space)?; - let author = &self.shared.author; + let author = self.shared.author(); self.library.with_notebook(true, |notebook| { - Ok(notebook.recycle_pages(std::slice::from_ref(&page), author)?) + Ok(notebook.recycle_pages(std::slice::from_ref(&page), &author)?) })?; } if listed.len() == 1 { ops.push(Op::Section(SectionOp::Create(dated( - &self.shared.author, + &self.shared.author(), date, time, )?))); @@ -958,7 +1008,7 @@ impl Library { .map(|found| Found { section: found.section, page: found.space.to_string(), - title: found.title.replace(|char: char| char.is_control(), " "), + title: one_line(&found.title), snippet: found.snippet, }) .collect() @@ -975,7 +1025,7 @@ impl Library { .map(|tagged: Tagged| Tag { section: tagged.section, page: tagged.space.to_string(), - title: tagged.title.replace(|char: char| char.is_control(), " "), + title: one_line(&tagged.title), paragraph: tagged.paragraph.to_string(), name: tagged.name, shape: tagged.shape, @@ -1169,11 +1219,7 @@ impl Library { let (stamp, read): (Vec, Reader) = match &self.place { Place::Share { root, .. } => { let client = self.client().ok_or("Not a share")?; - let file = if root.is_empty() { - path.to_owned() - } else { - format!("{root}/{path}") - }; + let file = on_share(root, path); let stamp = client.stamp(&file)?; let mut key = stamp.header.to_vec(); key.extend(stamp.length.to_le_bytes()); @@ -1240,6 +1286,16 @@ fn boxed(result: Result, error: *mut *mut c_char) -> *mut T { } } +fn shared(result: Result, error: *mut *mut c_char) -> *const Library { + match result { + Ok(library) => Arc::into_raw(Arc::new(library)), + Err(cause) => { + failed(cause, error); + std::ptr::null() + } + } +} + pub(crate) fn json(value: Result) -> *mut c_char { report(value.and_then(|value| Ok(serde_json::to_string(&value)?))) .map_or(std::ptr::null_mut(), owned) @@ -1249,10 +1305,6 @@ pub(crate) fn optional(text: *const c_char) -> Option { (!text.is_null()).then(|| string(text)) } -fn space(text: *const c_char) -> Result { - Ok(string(text).parse()?) -} - /// The notebook folder or lone section file at `path`, its section replicas kept in the /// directory `cache`; null with `error` set if it cannot be read. A folder `local` to this /// device has the host report its changes to `sb_library_touched`; any other is checked @@ -1267,13 +1319,10 @@ pub unsafe extern "C" fn sb_library_open( local: bool, error: *mut *mut c_char, ) -> *const Library { - match Library::open(Path::new(&string(path)), Path::new(&string(cache)), local) { - Ok(library) => Arc::into_raw(Arc::new(library)), - Err(cause) => { - failed(cause, error); - std::ptr::null() - } - } + shared( + Library::open(Path::new(&string(path)), Path::new(&string(cache)), local), + error, + ) } /// The notebook folder `root`, `/`-separated from the top of `share` on the server at @@ -1295,13 +1344,10 @@ pub unsafe extern "C" fn sb_library_server( error: *mut *mut c_char, ) -> *const Library { let server = server(address, share, user, password, domain); - match Library::server(server, &string(root), Path::new(&string(cache))) { - Ok(library) => Arc::into_raw(Arc::new(library)), - Err(cause) => { - failed(cause, error); - std::ptr::null() - } - } + shared( + Library::server(server, &string(root), Path::new(&string(cache))), + error, + ) } /// Creates the notebook folder `path` holding one section with one page titled with `date` @@ -1419,9 +1465,32 @@ pub unsafe extern "C" fn sb_library_tagged( json(library.tagged(open.map(|section| (path.as_str(), section)))) } -/// Each section's sync status as JSON, in the notebook's order: `path`, `state` (0 up to -/// date, 1 syncing, 2 in use elsewhere, 3 not connected, 4 read-only, 5 failed), `synced` -/// (seconds since 1970, or null before the file was reached), `queued` changes and `error`. +/// Unlocks the password-protected section at catalog `path` with `password`, as OneNote's +/// Protected Section dialog does; false for a wrong password. The key stays in memory until +/// `sb_library_lock_all`. +/// +/// # Safety +/// `path` and `password` are NUL-terminated UTF-8. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn sb_library_unlock( + library: &Library, + path: *const c_char, + password: *const c_char, +) -> bool { + let password = zeroize::Zeroizing::new(string(password)); + report(library.unlock(&string(path), &password)).unwrap_or(false) +} + +/// Locks every protected section of the notebook, forgetting their keys: they open again only +/// once unlocked. +#[unsafe(no_mangle)] +pub extern "C" fn sb_library_lock_all(library: &Library) { + library.unlocked().clear(); +} + +/// Each section's sync status as JSON, in the notebook's order: `path`, `state` (`SyncState` +/// by its place, best first), `synced` (seconds since 1970, or null before the file was +/// reached), `queued` changes and `error`. #[unsafe(no_mangle)] pub extern "C" fn sb_library_sync_status(library: &Library) -> *mut c_char { json(Ok(library.sync_status())) @@ -1735,8 +1804,11 @@ pub unsafe extern "C" fn sb_section_delete_page( date: *const c_char, time: *const c_char, ) -> bool { - report(space(id).and_then(|space| section.delete_page(space, &string(date), &string(time)))) - .is_some() + let deleted = string(id) + .parse() + .map_err(Into::into) + .and_then(|space| section.delete_page(space, &string(date), &string(time))); + report(deleted).is_some() } /// Waits for every edit to be stored in the cache, then up to `seconds` for them to be @@ -1746,6 +1818,19 @@ pub extern "C" fn sb_section_flush(section: &Section, seconds: f64) -> bool { section.flush(Duration::from_secs_f64(seconds)) } +/// Names `author` in the section's edits from now on, as when the reader changes their name. +/// +/// # Safety +/// `author` is NUL-terminated UTF-8. +#[unsafe(no_mangle)] +pub unsafe extern "C" fn sb_section_set_author(section: &Section, author: *const c_char) { + *section + .shared + .author + .lock() + .unwrap_or_else(|error| error.into_inner()) = string(author); +} + /// Asks the section to look for changes made elsewhere now, as when the app returns. #[unsafe(no_mangle)] pub extern "C" fn sb_section_wake(section: &Section) { diff --git a/crates/mobile/src/tests.rs b/crates/mobile/src/tests.rs index 261fb38afe3b03b136c89f42d96df4e126093d15..9d562ec7e0227b9ccca29422c54ba0b480f091ae 100644 --- a/crates/mobile/src/tests.rs +++ b/crates/mobile/src/tests.rs @@ -697,7 +697,31 @@ fn tapping_the_date_asks_for_it_and_a_new_date_is_stored() { section.shared.apply(edit).unwrap(); let stored = section.shared.page(canvas.space).unwrap().0.date_text(); assert_eq!(stored.unwrap()[0], "Friday, January 2, 2026"); - assert_ne!(canvas.page.editor.date().unwrap().timestamp(), before); + let after = canvas.page.editor.date().unwrap().timestamp(); + assert_ne!(after, before); + // `sb_view_date_request` hands the host the date in its seconds. + assert_eq!(library::unix(after), 1_767_349_800); +} + +#[test] +fn pages_open_with_the_snap_and_default_font_options_set() { + // OneNote's defaults, so pages other tests open meanwhile see no change. + sb_set_snap_to_grid(true); + unsafe { sb_set_default_font(c"Calibri".as_ptr(), 11.0) }; + assert_eq!(*options(), (true, canvas::editor::DefaultFont::default())); + let (_directory, section) = features(); + let canvas = canvas(§ion, "Paragraph controls"); + assert!(canvas.page.snap_to_grid); + assert_eq!(canvas.page.editor.default_font.face, "Calibri"); +} + +#[test] +fn a_share_notebook_names_its_files_from_the_share_s_top() { + assert_eq!(library::on_share("", "Notes.one"), "Notes.one"); + assert_eq!( + library::on_share("Team/Book", "Group/Notes.one"), + "Team/Book/Group/Notes.one" + ); } /// A notebook copy with its library, and a section of it open for editing. diff --git a/crates/notebook/Cargo.toml b/crates/notebook/Cargo.toml index 851557dd3182bb5006faec812b122ceb012b636e..14589453f38a6197506a1921b47763638c8841cd 100644 --- a/crates/notebook/Cargo.toml +++ b/crates/notebook/Cargo.toml @@ -6,7 +6,6 @@ publish = false [features] smb = ["dep:smb2", "dep:tokio"] -protected = ["onestore/protected", "dep:zeroize"] [dependencies] onestore = { path = "../onestore" } @@ -18,7 +17,14 @@ tempfile = "3" sha2 = "0.11" smb2 = { version = "=0.21.0", optional = true } tokio = { version = "1", features = ["rt-multi-thread", "time"], optional = true } -zeroize = { version = "1.9.0", optional = true } +zeroize = "1.9.0" +# Queued edits of a password-protected section are sealed under a key derived from its own. +aes-gcm = "0.11.1" +base64 = "0.22.1" +getrandom = "0.4.3" +hmac = "0.13.0" +# OneNote packages (.onepkg) are cabinet files. +cab = "0.6" [target.'cfg(target_vendor = "apple")'.dependencies] nix = { version = "0.31", default-features = false, features = ["fs"] } diff --git a/crates/notebook/README.md b/crates/notebook/README.md index 5755beacc3e293d73af0f229b7e2df42e398063f..1ce771bbc5895ddccb5036a54215a8b49122d1b9 100644 --- a/crates/notebook/README.md +++ b/crates/notebook/README.md @@ -196,7 +196,9 @@ or worker panic. Dropping it requests cancellation without waiting. Remote operations and callbacks must have bounded execution times if shutdown latency matters. Credentials belong to the factory, not the cache database. -Creation refuses existing paths. Opening validates database integrity and replays +`create` refuses an existing path; `open_or_create(path, key, source)` opens the cache at +`path`, reading `source` only to make it where there is none, and opens one another thread +made meanwhile. Opening validates database integrity and replays the queue on its base. SQLite runs in WAL mode under exclusive locking with FULL synchronization and fullfsync, each queried back: every commit is durable, and the only file beside the cache is `-wal`, which holds committed pages until a checkpoint @@ -324,7 +326,9 @@ identities, titles, dates and creation times, as OneNote does (`corpus/notebook-management`); `unrecycle_pages` takes them out again by identity, as OneNote's Undo of a page delete does. A bin or deleted-pages file its TOC does not list is placed and listed again, a bin whose TOC OneNote named otherwise keeps it, and an -unavailable bin refuses the delete (`corpus/recycle-bin-repair`). An entry a TOC still +unavailable bin refuses the delete (`corpus/recycle-bin-repair`). `empty_recycle_bin` is OneNote's +Empty Recycle Bin: Deleted Pages loses every page in one revision and each binned section's +file goes, the bin's TOC left as it was (`corpus/recycle-bin-view`). An entry a TOC still lists for a file gone from its folder gives way to the file an edit gives its name. Edits keep entries in the order their ordering numbers give; a rename or colour keeps the numbers. Every created, renamed or moved file is placed with @@ -346,13 +350,34 @@ targets are `None`. replica, and `session::stored_pages(image)` builds its pages with each page's `LastModifiedTime`: the app's search indexes the sections it has not opened this way. -With the optional `protected` feature, `Notebook::unlock(path, password)` -reads a `Locked` section as `Unlocked { pages, .. }`, and -`Notebook::apply_unlocked(path, password, &mut unlocked, author, edit)` -applies page ops and stores them under the section's key, straight to the file: -nothing of a protected section is cached or queued, a section written since -`unlocked` was read refuses the edit, and a wrong password is -`Error::Protected(PasswordMismatch)`. +A password-protected section lists as `Locked`. `Notebook::unlock(path, password)` opens +its key (a wrong password is `Error::Protected(PasswordMismatch)`), and +`section_unlocked(path, &key, notify)` (`section_unlocked_with`, or +`Replica::open_or_create(path, Some(&key), source)` for a host that opens replicas itself) +opens it as any section opens: edits queue, publish, merge and become conflict pages as an ordinary section's do, +each revision sealed under the section's key. The replica keeps none of it in the clear: +its base and transactions are the file's own ciphertext, and its queued edits and payloads +are sealed with AES-256-GCM (a random nonce each, the row's kind as associated data) under +a key HMAC-SHA256 derives from the section's, payloads named by HMAC rather than SHA-256. +Only the author's name, payload names and revision identities stay readable, and the +queue opens only under the key (a recovery archive with `Recovery::open_unlocked`). +`stored_pages_unlocked(image, &key)` reads a protected section's pages for search. The +background never opens a locked section. + +`Notebook::set_password(path, key, password)` sets, changes or removes a password as +OneNote 2010 does: the section is written anew under new identities +(`onestore::protected::rekey`), next to the file as a dot file that `Storage::supersede` +puts in its place under the writers' coordination while the file's stamp holds (on a share as +OneNote's maintenance does it: the old file aside, the new one in, the old one deleted), and +its TOC entry takes the new identity (`TocEdit::Reidentify`). The old replica, a cache of the +old file, is deleted, so the section's session must be closed and its edits published first; +a section whose edits wait refuses. + +Another device learns of the password when it reads the notebook again (`open`, `refresh`): +a replica of the file the protected section superseded, found by the placement the rewritten +header keeps, is deleted when nothing waits in it. Edits that wait stay until `unlock` on that +device queues them under the key, each page they changed coming back as a copy, as a page +another client removed does. A session open meanwhile stops as `SyncState::Protected`. `Section::import_page(page, author)` copies a page, usually read from another section, to the end of this one as one `SectionOp::Import` queued like the @@ -369,12 +394,27 @@ is `Reordered`. A failed read returns the error and keeps the previous catalog, so an unreachable share never reads as an emptied notebook. +## Packages + +`package` reads and writes OneNote packages (`.onepkg`), cabinet files of a notebook's tables +of contents and sections at their paths in its folder. `notebook_files(notebook, image)` gathers +what OneNote 2010's Save As packs (each folder's TOC and sections, groups after, the recycle bin +and copies left out, its TOC entry kept), taking a section the caller holds edits for from +`image` (a replica's `snapshot`); `pack` writes them MSZIP-compressed, each file outside any +notebook (no `guidAncestor` or `crcName`), as OneNote's are. `read` takes MSZIP or OneNote's LZX, +refusing a path leaving the folder or more than a byte limit unpacked, and `unpack(files, root)` +writes a new folder as Unpack Notebook does: every file takes an identity of its own +(`onestore::reidentify`) and is placed under its folder's TOC, whose entries follow it where +OneNote lists each anew beside the stale one. `section_copy` and `page_section` are Save As's +section and page: a copy under a new identity, and a new section holding the page with its +identity, both outside any notebook (`corpus/notebook-package`). + ## Snowbound's folder `sidecar` keeps Snowbound-only data in the notebook's `.snowbound` folder, which OneNote 2010 skips because it has the Windows hidden attribute: `Storage::hide` sets it -through `smb::Client::hide` (SET_INFO FileBasicInformation, always, since Samba reports a -dot name hidden without storing it), `SetFileAttributesW` on Windows, or macOS's +on a share with SET_INFO FileBasicInformation (always, since Samba reports a dot name hidden +without storing it), `SetFileAttributesW` on Windows, or macOS's `UF_HIDDEN`, which an smbfs mount passes to the share; Linux keeps no such attribute. Discovery skips dot names, and a notebook without the folder is whole. @@ -475,8 +515,7 @@ probing the connection, so an idle watch sends nothing. `changed` hears each bat paths relative to the directory, `""` when the server lost count, and an error when the watch ends with its connection. -`Client::read_asset(path, byte_limit)` reads an external payload under a read-only -share handle that excludes writes and deletion. Empty files succeed; limits, +An external payload on a share (`discover::Smb`) is read under a read-only share handle that excludes writes and deletion. Empty files succeed; limits, interrupted reads and failed close never return partial bytes. This payload read does not parse a OneStore header or acquire its reader-coordination bytes. diff --git a/crates/notebook/examples/document.rs b/crates/notebook/examples/document.rs index d1a68175db8f8b35932e59946be4ff683f581a7b..c0e82f8c2e305a16cc91b89c0f9c898c50e6e74c 100644 --- a/crates/notebook/examples/document.rs +++ b/crates/notebook/examples/document.rs @@ -39,7 +39,6 @@ fn main() -> Result<(), Box> { let bytes = onestore::read_file(&source_path)?; let store = Store::parse(&bytes)?; let index = RevisionIndex::parse(&store)?; - #[cfg(feature = "protected")] let unlocked = if let Some(path) = &password_file { use std::io::Read; let mut password = zeroize::Zeroizing::new(String::new()); @@ -57,20 +56,10 @@ fn main() -> Result<(), Box> { } else { None }; - #[cfg(not(feature = "protected"))] - if password_file.is_some() { - return Err( - "Build this exporter with the protected feature to open a password-protected section." - .into(), - ); - } - #[cfg(feature = "protected")] let document = match &unlocked { Some(section) => section.document()?, None => Document::parse(&index)?, }; - #[cfg(not(feature = "protected"))] - let document = Document::parse(&index)?; if let Some(destination) = destination { #[cfg(unix)] { diff --git a/crates/notebook/examples/keystroke_probe.rs b/crates/notebook/examples/keystroke_probe.rs index c45738831aa25a2046eb1bf7d1fb0df216e49473..892d062a00dad7064af7d07bfc5da93d3fe43114 100644 --- a/crates/notebook/examples/keystroke_probe.rs +++ b/crates/notebook/examples/keystroke_probe.rs @@ -135,6 +135,7 @@ fn main() -> Result<(), Box> { identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects: vec![PageObject::Outline(Outline { diff --git a/crates/notebook/examples/open_probe.rs b/crates/notebook/examples/open_probe.rs index dd7db91cbe429a8f1a23e77dad6a72f7a91a3364..aa7c8c2fd10ca6e61a6eacbaa4549f57ccbccbc7 100644 --- a/crates/notebook/examples/open_probe.rs +++ b/crates/notebook/examples/open_probe.rs @@ -44,6 +44,7 @@ fn generated(count: usize) -> Result, Box> { identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects: vec![PageObject::Outline(Outline { diff --git a/crates/notebook/examples/save_probe.rs b/crates/notebook/examples/save_probe.rs index bcd4563af8cab94d082f6a44a91cc76e0df08a24..44fa95f0e0e5e23d21370453b04c105f663bea1c 100644 --- a/crates/notebook/examples/save_probe.rs +++ b/crates/notebook/examples/save_probe.rs @@ -50,6 +50,7 @@ fn main() -> Result<(), Box> { identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects: vec![PageObject::Outline(Outline { diff --git a/crates/notebook/src/background.rs b/crates/notebook/src/background.rs index 278860329fcffce16017a78c9012de30d4ef9b08..e90889ca0f485562e1e5413d8d100c373e3db2ee 100644 --- a/crates/notebook/src/background.rs +++ b/crates/notebook/src/background.rs @@ -30,8 +30,6 @@ const STAGGER: Duration = Duration::from_millis(100); /// How long a reported change settles before its section is checked, so the writes of one /// commit cost one check. const SETTLE: Duration = Duration::from_secs(1); -/// The most entries a folder listing takes. -const ENTRIES: usize = 100_000; /// Keeps each watched section in sync: a section is checked when a watch on the notebook's /// folder reports it changed, when it could not be reached, and otherwise every interval. @@ -66,6 +64,7 @@ pub(crate) struct Shared { } /// A connection's report of its notebook folder's changes, from a watch armed on connecting. +#[cfg_attr(not(feature = "smb"), allow(dead_code))] pub(crate) struct Reports { shared: Weak, connection: u64, @@ -338,7 +337,8 @@ impl Background { let root = root.clone(); let list = move |folder: &str| { use crate::discover::Source; - crate::discover::Smb::new(&client, &root)?.entries(folder, ENTRIES) + crate::discover::Smb::new(&client, &root)? + .entries(folder, crate::session::LIMITS.entries) }; Ok(((bind, list), reported)) }, @@ -361,6 +361,7 @@ impl Background { pub fn hold(&self, path: &str, section: &Section) { let replica = section.replica(); let Some(worker) = replica + .section .worker .lock() .ok() @@ -487,6 +488,7 @@ impl Shared { } } +#[cfg_attr(not(feature = "smb"), allow(dead_code))] impl Reports { /// The sections at or below these paths changed. pub(crate) fn touched(&self, paths: &[String]) { @@ -741,7 +743,10 @@ fn list( /// Deletes the replica at `replica` if it holds nothing unpublished and no one holds it. fn discard(replica: &Path) { - if matches!(crate::peek(replica), Ok((_, 0))) { + if matches!( + crate::closed(replica).and_then(|held| crate::peek(&held)), + Ok((_, 0)) + ) { for suffix in ["-wal", "-shm", ""] { let mut file = replica.as_os_str().to_owned(); file.push(suffix); @@ -837,7 +842,7 @@ fn step( if let Some(folder) = replica.parent() { std::fs::create_dir_all(folder)?; } - Replica::seed(replica, &image)?; + Replica::seed(replica, &image, None)?; Ok(Stamp::of(&image)?) })(); return match copied { @@ -854,7 +859,7 @@ fn step( Ok(versions) => versions, Err(error) => return (None, Err(Error::RemoteIo(error))), }; - match crate::peek(replica) { + match crate::closed(replica).and_then(|held| crate::peek(&held)) { Ok((base, 0)) if base == stamp && versions.is_empty() => { return (Some(0), Ok((stamp, moved))); } diff --git a/crates/notebook/src/base.rs b/crates/notebook/src/base.rs index 070c665191a3bdb64808dc633d43e1f349098934..d102659d50a4120ec8db6c7929a928c5f64ced7f 100644 --- a/crates/notebook/src/base.rs +++ b/crates/notebook/src/base.rs @@ -28,6 +28,20 @@ fn damaged() -> crate::Error { io::Error::new(io::ErrorKind::InvalidData, "Damaged cached image").into() } +/// The base image, which every cache holds. +pub(crate) fn base(connection: &Connection) -> Result> { + read(connection, Image::Base)?.ok_or_else(missing) +} + +/// The base image's stamp. +pub(crate) fn base_stamp(connection: &Connection) -> Result { + stamp(connection, Image::Base)?.ok_or_else(missing) +} + +fn missing() -> crate::Error { + io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image").into() +} + /// The whole image, or `None` when none is stored. pub(crate) fn read(connection: &Connection, image: Image) -> Result>> { let mut query = connection.prepare_cached(&format!( diff --git a/crates/notebook/src/discover.rs b/crates/notebook/src/discover.rs index 35ff81ab5f8ec29198aa2760f1a9c0861be577f9..80b65461a241fc42e7cad78b564b7c5a3faffe67 100644 --- a/crates/notebook/src/discover.rs +++ b/crates/notebook/src/discover.rs @@ -50,10 +50,30 @@ pub struct Folder { pub toc: Option, pub sections: Vec

    , pub groups: Vec, + /// The paths of `sections` and `groups` together, in the order the TOC lists them, those + /// it doesn't last by path. + pub order: Vec, /// Child section files and groups that could not be read. pub unavailable: Vec, } +impl Folder { + /// This folder and every group under it, in catalog order. + pub(crate) fn folders(&self) -> impl Iterator { + let mut stack = vec![self]; + std::iter::from_fn(move || { + let folder = stack.pop()?; + stack.extend(folder.groups.iter().rev()); + Some(folder) + }) + } + + /// The sections of this folder and every group under it, in catalog order. + pub(crate) fn sections(&self) -> impl Iterator { + self.folders().flat_map(|folder| &folder.sections) + } +} + /// A section file or group folder denied or gone while listing; each discovery tries it again. #[derive(Debug, Serialize)] pub struct Unavailable { @@ -346,6 +366,7 @@ fn scan( toc: None, sections: Vec::new(), groups: Vec::new(), + order: Vec::new(), unavailable: Vec::new(), }; for entry in &listing { @@ -551,26 +572,26 @@ fn scan( .flat_map(|toc| &toc.unresolved) .map(|entry| (entry.file, entry.order)) .collect(); - result.sections.sort_by(|a, b| { - (order.get(&a.file_id).copied().unwrap_or(u32::MAX), &a.path) - .cmp(&(order.get(&b.file_id).copied().unwrap_or(u32::MAX), &b.path)) - }); - result.groups.sort_by(|a, b| { - ( - a.toc - .as_ref() - .and_then(|toc| order.get(&toc.file_id).copied()) - .unwrap_or(u32::MAX), - &a.path, + let rank = |file: Option<[u8; 16]>| file.and_then(|file| order.get(&file).copied()); + let ranked = |file, path: &String| (rank(file).unwrap_or(u32::MAX), path.clone()); + result + .sections + .sort_by_cached_key(|section| ranked(Some(section.file_id), §ion.path)); + let group_file = |group: &Folder| group.toc.as_ref().map(|toc| toc.file_id); + result + .groups + .sort_by_cached_key(|group| ranked(group_file(group), &group.path)); + let mut entries: Vec<(u32, String)> = (result.sections.iter()) + .map(|section| ranked(Some(section.file_id), §ion.path)) + .chain( + result + .groups + .iter() + .map(|group| ranked(group_file(group), &group.path)), ) - .cmp(&( - b.toc - .as_ref() - .and_then(|toc| order.get(&toc.file_id).copied()) - .unwrap_or(u32::MAX), - &b.path, - )) - }); + .collect(); + entries.sort(); + result.order = entries.into_iter().map(|(_, path)| path).collect(); let listed = |file: [u8; 16], path: &str| { let name = path.rsplit('/').next().unwrap_or(path); result diff --git a/crates/notebook/src/discover/source.rs b/crates/notebook/src/discover/source.rs index ee287e3a00da7a8d7534dfbb4ac6e6bc68181ef7..37c912c0c39807f8a6742e5734df84c93024749b 100644 --- a/crates/notebook/src/discover/source.rs +++ b/crates/notebook/src/discover/source.rs @@ -194,6 +194,10 @@ impl Source for Smb<'_> { return None; } let stamp = self.client.stamp(&self.path(path).ok()?).ok()?; - crate::copied(&replica, &stamp).ok().flatten() + let connection = crate::closed(&replica).ok()?; + let base = crate::base::Image::Base; + (crate::base::stamp(&connection, base).ok()?? == stamp) + .then(|| crate::base::read(&connection, base).ok()?) + .flatten() } } diff --git a/crates/notebook/src/lib.rs b/crates/notebook/src/lib.rs index 57cd05807d7330971d171e21a64cd9eb1d67900f..5545185fe49a4c7a2b3f711e91e43ed80f6aa827 100644 --- a/crates/notebook/src/lib.rs +++ b/crates/notebook/src/lib.rs @@ -10,6 +10,7 @@ use onestore::{ ExGuid, op::{Edit, OpError}, page::Page, + protected::Key, }; use rusqlite::{Connection, OpenFlags, TransactionBehavior, params}; use std::{ @@ -26,6 +27,7 @@ mod base; pub mod location; mod merge; mod migrate; +pub mod package; mod queue; mod recovery; mod resolve; @@ -61,7 +63,7 @@ pub enum Error { Rejected(#[from] OpError), #[error("External payload identity now refers to different bytes")] AssetChanged, - #[cfg(feature = "protected")] + /// A password-protected section's password did not match, or its format is unknown. #[error(transparent)] Protected(#[from] onestore::protected::Error), } @@ -98,10 +100,8 @@ pub enum Resolution { /// Edits apply on the cache's section thread, which keeps the section parsed; SQLite's /// exclusive connection retains ownership between local transactions. pub struct Replica { - connection: Arc>, section: Arc, synchronization: Mutex<()>, - worker: Arc>>, /// The section's root object space, which names the document. root: ExGuid, /// Last, so that it runs once the fields above have closed the cache. @@ -124,30 +124,31 @@ impl Replica { /// Seeds a new cache from a validated section image, refusing any existing path. /// An initialization error preserves the created file for inspection. pub fn create(path: impl AsRef, source: &[u8]) -> Result { - Self::seed(path.as_ref(), source)?; - Self::start(cache_connection(path.as_ref())?) + Self::seed(path.as_ref(), source, None)?; + Self::start(cache_connection(path.as_ref())?, None) } - /// Opens the cache at `path`, first creating it from the image `source` reads where there - /// is none. A cache another thread creates meanwhile, as the background makes an offline - /// copy, is opened instead. + /// Opens the cache at `path`, a protected section's under `key`, first creating it from + /// the image `source` reads where there is none. A cache another thread creates meanwhile, + /// as the background makes an offline copy, is opened instead. pub fn open_or_create( path: impl AsRef, + key: Option<&Key>, source: impl FnOnce() -> Result>, ) -> Result { let path = path.as_ref(); if !path.exists() { - match Self::seed(path, &source()?) { + match Self::seed(path, &source()?, key) { Err(Error::Io(error)) if error.kind() == io::ErrorKind::AlreadyExists => {} seeded => seeded?, } } - Self::open(path) + Self::open_with(path, key.cloned()) } /// `create` without opening the cache it made, as for an offline copy. - pub(crate) fn seed(path: &Path, source: &[u8]) -> Result<()> { - validate(source)?; + pub(crate) fn seed(path: &Path, source: &[u8], key: Option<&Key>) -> Result<()> { + validate(source, key)?; // Built under a name of its own and linked into place whole, so that a cache that // exists is complete, and two threads making the same one never share a build. static BUILDS: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0); @@ -201,7 +202,10 @@ impl Replica { /// a conversion that cannot reproduce every queued page leaves it untouched. /// Unrecognized databases and unsupported journal modes are rejected. pub fn open(path: impl AsRef) -> Result { - let path = path.as_ref(); + Self::open_with(path.as_ref(), None) + } + + fn open_with(path: &Path, key: Option) -> Result { let mut connection = cache_connection(path)?; let application: u32 = connection.pragma_query_value(None, "application_id", |row| row.get(0))?; @@ -233,25 +237,21 @@ impl Replica { } } write_ahead(&connection)?; - Self::start(connection) + Self::start(connection, key) } - fn start(connection: Connection) -> Result { - let connection = Arc::new(Mutex::new(connection)); - let worker = Arc::new(Mutex::new(std::sync::Weak::new())); - let (section, root) = working::spawn(Arc::clone(&connection), Arc::clone(&worker))?; + fn start(connection: Connection, key: Option) -> Result { + let (section, root) = working::spawn(connection, key)?; Ok(Self { - connection, section, synchronization: Mutex::new(()), - worker, root, released: Released::default(), }) } fn lock(&self) -> Result> { - lock(&self.connection) + lock(&self.section.connection) } /// Hands `request` to the section thread. @@ -329,9 +329,9 @@ impl Replica { /// The section image the queued edits leave, the unsealed ones sealed as one more /// revision whose identities differ per call: O(section). - pub(crate) fn snapshot(&self) -> Result> { + pub fn snapshot(&self) -> Result> { self.written()?; - working::image(&*self.lock()?) + working::image(&*self.lock()?, self.section.key.as_ref()) } /// Waits until the edits applied before it are written to the queue, as reads answer @@ -342,18 +342,51 @@ impl Replica { /// The section file's identity, which internal links name as `section-id`. pub fn identity(&self) -> Result<[u8; 16]> { - let stamp = base::stamp(&*self.lock()?, base::Image::Base)? - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "Damaged cached image"))?; + let stamp = base::base_stamp(&*self.lock()?)?; Ok(onestore::Header::parse(&stamp.header)?.file_id) } /// Queued edits, oldest first. pub fn pending(&self) -> Result> { - pending(&*self.lock()?) + pending(&*self.lock()?, self.section.key.as_ref()) + } + + /// The edits putting each page the queue changed, as the queue leaves it, into another + /// section as a copy under fresh identities, by the author of the first edit changing it; + /// content outside the page model stays behind. + pub(crate) fn copies(&self) -> Result> { + let arena = onestore::Arena::default(); + let base = base::base(&*self.lock()?)?; + let base = working::open(&arena, base, self.section.key.as_ref())?; + let mut seen = std::collections::BTreeSet::from([self.root]); + let mut copies = Vec::new(); + for queued in self.pending()? { + for space in queue::spaces(&queued.edit, self.root) { + if !seen.insert(space) { + continue; + } + let Ok(mut page) = self.page(space) else { + continue; + }; + if base.page(space).is_ok_and(|base| base == page) { + continue; + } + page.objects + .retain(|object| !matches!(object, onestore::page::PageObject::Unsupported(_))); + let creation = + onestore::PageCreation::new(None, Some(&page.title), &queued.author)?; + let ops = vec![onestore::op::Op::Section(onestore::op::SectionOp::Import { + creation, + page: page.copy()?, + })]; + copies.push((queued.author.clone(), Edit { at: now(), ops })); + } + } + Ok(copies) } fn wake_sync(&self) { - wake(&self.worker); + wake(&self.section.worker); } } @@ -386,10 +419,14 @@ fn wake(worker: &Mutex>) { } } -/// Fully validates a section image, returning its root object space. -fn validate(source: &[u8]) -> Result { +/// Fully validates a section image, a protected one under `key`, returning its root object +/// space. +fn validate(source: &[u8], key: Option<&Key>) -> Result { let arena = onestore::Arena::default(); - Ok(onestore::Section::open(&arena, source.to_vec())?.root()) + Ok(match key { + Some(key) => onestore::Section::unlock(&arena, source.to_vec(), key)?.root(), + None => onestore::Section::open(&arena, source.to_vec())?.root(), + }) } /// A closed cache, without opening the replica. @@ -405,25 +442,14 @@ fn closed(path: &Path) -> Result { } /// A closed cache's base stamp and how many edits wait. -fn peek(path: &Path) -> Result<(onestore::Stamp, u64)> { - let connection = closed(path)?; - let base = base::stamp(&connection, base::Image::Base)? - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image"))?; +fn peek(connection: &Connection) -> Result<(onestore::Stamp, u64)> { + let base = base::base_stamp(connection)?; let queued: i64 = connection.query_row("SELECT count(*) FROM edits", [], |row| row.get(0))?; Ok((base, unsigned(queued)?)) } -/// A closed cache's base image, if its stamp is `stamp`: the section file as it stands. -fn copied(path: &Path, stamp: &onestore::Stamp) -> Result>> { - let connection = closed(path)?; - if base::stamp(&connection, base::Image::Base)?.as_ref() != Some(stamp) { - return Ok(None); - } - base::read(&connection, base::Image::Base) -} - -fn pending(connection: &Connection) -> Result> { - queue::load(connection, None) +fn pending(connection: &Connection, key: Option<&Key>) -> Result> { + queue::load(connection, key, None) } fn unsigned(value: i64) -> Result { diff --git a/crates/notebook/src/location.rs b/crates/notebook/src/location.rs index 30317f9c476f58bcd5aed6fd6660d2558ad0ab25..7e3cc33e0113b0a7ba86f88f7ea1bdbf9731c788 100644 --- a/crates/notebook/src/location.rs +++ b/crates/notebook/src/location.rs @@ -110,7 +110,7 @@ pub(crate) fn claim( if !replica.exists() { continue; } - let adoptable = match crate::peek(&replica) { + let adoptable = match crate::closed(&replica).and_then(|held| crate::peek(&held)) { Ok((base, _)) => { legacy || stamp(identity).is_some_and(|file| follows(&file, &base)) } diff --git a/crates/notebook/src/migrate.rs b/crates/notebook/src/migrate.rs index 023a6dd8deeb773f3debd54d840cb5ca92465aa8..05106f6634369e02297f40bfe42f8cf351fd67e5 100644 --- a/crates/notebook/src/migrate.rs +++ b/crates/notebook/src/migrate.rs @@ -314,6 +314,7 @@ fn convert(transaction: &rusqlite::Transaction<'_>) -> Result<()> { } queue::insert( transaction, + None, Some(crate::unsigned(edit.id)?), current, &edit.author, diff --git a/crates/notebook/src/package.rs b/crates/notebook/src/package.rs new file mode 100644 index 0000000000000000000000000000000000000000..62c3f3b9c332e3d785e6b6ee3be644ddac871aac --- /dev/null +++ b/crates/notebook/src/package.rs @@ -0,0 +1,236 @@ +//! OneNote packages (`.onepkg`) and the other copies OneNote 2010's Save As writes. A +//! package is a cabinet holding a notebook's tables of contents and sections at their paths +//! in its folder, the recycle bin left out though its entry stays; OneNote writes each file +//! outside any notebook (no `guidAncestor` or `crcName`). Its Unpack Notebook gives each file +//! an identity of its own and lists it anew beside its stale entry; here the entry follows +//! the file instead (`corpus/notebook-package`). OneNote compresses with LZX; this writes +//! MSZIP, which every cabinet reader takes, and reads either. + +use crate::{ + Error, Result, + session::{Notebook, lists, moved}, +}; +use onestore::{TocEdit, op::Edit, page::Page}; +use std::{ + collections::BTreeMap, + io::{self, Cursor, Read, Write}, + path::Path, +}; + +/// A package's files: each one's path in the notebook's folder, `/`-separated, and bytes. +pub type Files = Vec<(String, Vec)>; + +fn invalid(message: &str) -> Error { + io::Error::new(io::ErrorKind::InvalidData, message.to_owned()).into() +} + +/// The files of `notebook` a package holds, as OneNote 2010 packs them: each folder's table +/// of contents and sections, then its groups', the recycle bin and copies left out. `image` +/// gives a section the caller holds edits for, by catalog path, as its replica leaves it. +pub fn notebook_files( + notebook: &Notebook, + mut image: impl FnMut(&str) -> Option>, +) -> Result { + let mut files = Vec::new(); + let mut folders = vec![notebook.catalog()]; + while let Some(folder) = folders.pop() { + let Some(toc) = &folder.toc else { + continue; + }; + files.push(( + join(&folder.path, &toc.filename), + notebook.read_toc(&folder.path)?, + )); + for section in folder.sections.iter().filter(|section| !section.copy) { + let bytes = match image(§ion.path) { + Some(bytes) => bytes, + None => notebook.read_section(§ion.path)?, + }; + files.push((section.path.clone(), bytes)); + } + folders.extend( + (folder.groups.iter().rev()) + .filter(|group| group.path.rsplit('/').next() != Some("OneNote_RecycleBin")), + ); + } + Ok(files) +} + +fn join(folder: &str, name: &str) -> String { + if folder.is_empty() { + name.to_owned() + } else { + format!("{folder}/{name}") + } +} + +/// A package holding `files`, each taken out of its notebook as OneNote writes them. +pub fn pack(files: Files) -> Result> { + let mut builder = cab::CabinetBuilder::new(); + let folder = builder.add_folder(cab::CompressionType::MsZip); + for (path, _) in &files { + folder.add_file(path.replace('/', "\\")); + } + let mut writer = builder.build(Cursor::new(Vec::new()))?; + let mut files = files.into_iter(); + while let Some(mut file) = writer.next_file()? { + let (_, mut bytes) = files.next().ok_or_else(|| invalid("A file went missing"))?; + onestore::place_image(&mut bytes, None)?; + file.write_all(&bytes)?; + } + Ok(writer.finish()?.into_inner()) +} + +/// The files the package `bytes` holds, refusing a path that leaves the notebook's folder +/// and more than `limit` bytes unpacked. +pub fn read(bytes: &[u8], limit: u64) -> Result { + let mut cabinet = cab::Cabinet::new(Cursor::new(bytes))?; + let mut listed = Vec::new(); + let mut total = 0u64; + for folder in cabinet.folder_entries() { + for file in folder.file_entries() { + total += u64::from(file.uncompressed_size()); + listed.push(file.name().to_owned()); + } + } + if total > limit { + return Err(io::Error::from(io::ErrorKind::FileTooLarge).into()); + } + let mut files = Vec::new(); + for name in listed { + let path = name.replace('\\', "/"); + if !path.split('/').all(component) { + return Err(invalid("The package names a file outside its notebook")); + } + let mut bytes = Vec::new(); + cabinet.read_file(&name)?.read_to_end(&mut bytes)?; + files.push((path, bytes)); + } + Ok(files) +} + +fn component(name: &str) -> bool { + !name.is_empty() && !name.contains([':', '\0']) && name != "." && name != ".." +} + +/// Writes package `files` to the new folder `root` as OneNote 2010's Unpack Notebook does: +/// each table of contents and section takes a new identity, placed under its folder's table +/// of contents, whose entries follow. +pub fn unpack(mut files: Files, root: &Path) -> Result<()> { + let folder = |path: &str| { + path.rsplit_once('/') + .map_or("", |(folder, _)| folder) + .to_owned() + }; + let toc = |path: &str| path.to_ascii_lowercase().ends_with(".onetoc2"); + let mut tocs: BTreeMap = BTreeMap::new(); + for (at, (path, _)) in files.iter().enumerate() { + if toc(path) && tocs.insert(folder(path), at).is_some() { + return Err(invalid( + "A folder of the package holds two tables of contents", + )); + } + } + // Parents first: a group's table of contents is placed under its parent's new identity. + let mut identities: BTreeMap = BTreeMap::new(); + let mut ordered: Vec<(&String, &usize)> = tocs.iter().collect(); + ordered.sort_by_key(|(folder, _)| folder.split('/').count() * usize::from(!folder.is_empty())); + for (path, at) in ordered { + let image = &mut files[*at].1; + let old = onestore::Store::parse(image)?.header.file_id; + let new = onestore::reidentify(image)?; + let parent = (!path.is_empty()).then(|| folder(path)); + let placed = match &parent { + Some(parent) => { + let (_, ancestor) = identities + .get(parent) + .ok_or_else(|| invalid("A section group's folder has no parent"))?; + Some((*ancestor, path.rsplit('/').next().unwrap_or_default())) + } + None => None, + }; + onestore::place_image(image, placed)?; + identities.insert(path.clone(), (old, new)); + } + // The entries each table of contents lists, by their files' old identities. + let mut followed: BTreeMap> = BTreeMap::new(); + for (path, image) in &mut files { + if toc(path) { + continue; + } + let home = folder(path); + let Some((_, ancestor)) = identities.get(&home) else { + return Err(invalid("A section's folder has no table of contents")); + }; + let old = onestore::Store::parse(image)?.header.file_id; + let new = onestore::reidentify(image)?; + onestore::place_image( + image, + Some((*ancestor, path.rsplit('/').next().unwrap_or_default())), + )?; + (followed.entry(home).or_default()).push(TocEdit::Reidentify { + identity: old, + with: new, + }); + } + for (path, (old, new)) in &identities { + if !path.is_empty() { + let edit = TocEdit::Reidentify { + identity: *old, + with: *new, + }; + followed.entry(folder(path)).or_default().push(edit); + } + } + for (home, edits) in followed { + let image = &mut files[tocs[&home]].1; + let mut listed = Vec::new(); + for edit in edits { + if let TocEdit::Reidentify { identity, .. } = &edit + && lists(image, *identity)? + { + listed.push(edit); + } + } + if let Some(transaction) = onestore::edit_table_of_contents(image, &listed)? { + transaction.apply(image)?; + } + } + std::fs::create_dir(root)?; + for (path, bytes) in &files { + let file = root.join(path); + if let Some(parent) = file.parent() { + std::fs::create_dir_all(parent)?; + } + std::fs::File::create_new(file)?.write_all(bytes)?; + } + Ok(()) +} + +/// The section `image` holds as Save As writes a copy of it: an identity of its own, outside +/// any notebook. +pub fn section_copy(mut image: Vec) -> Result> { + onestore::reidentify(&mut image)?; + onestore::place_image(&mut image, None)?; + Ok(image) +} + +/// A new section, named `name` and coloured `color` (COLORREF), holding `page` as Save As +/// writes a page: the page keeps its identity, title, date and creation time. +pub fn page_section(page: &Page, name: &str, color: Option, author: &str) -> Result> { + let mut image = onestore::create_empty_section(name, color)?; + let arena = onestore::Arena::default(); + let mut section = onestore::Section::open(&arena, image.clone())?; + section.apply( + author, + &Edit { + at: crate::now(), + ops: vec![moved(page, author)?], + }, + )?; + if let Some(transaction) = section.seal()? { + transaction.apply(&mut image)?; + } + onestore::place_image(&mut image, None)?; + Ok(image) +} diff --git a/crates/notebook/src/queue.rs b/crates/notebook/src/queue.rs index 6a3772541091f64fde08a160170b3f0fb844103c..1314ce7987bddadca3f0207fa038dd80e437bc92 100644 --- a/crates/notebook/src/queue.rs +++ b/crates/notebook/src/queue.rs @@ -1,14 +1,23 @@ //! Edit rows. An edit is stored as its serialized ops with picture and attachment bytes //! moved to the `payloads` table, named by SHA-256 in the order `slots` visits them. +//! +//! A password-protected section's queue keeps none of it in the clear: each edit and +//! payload is sealed with AES-256-GCM (a random nonce, the row's kind as associated data) +//! and payloads are named by HMAC-SHA256, both under keys HMAC-SHA256 derives from the +//! section's own key. Only the author's name and the payload names stay readable. use crate::{PendingEdit, Result, signed, unsigned}; +use aes_gcm::{Aes256Gcm, KeyInit, aead::Aead}; +use hmac::{Hmac, Mac}; use onestore::{ op::{Edit, Op, PageOp, SectionOp, TableEdit}, page::{PageObject, PageParagraph, ParagraphContent, TableCell}, + protected::Key, }; use rusqlite::{Connection, OptionalExtension, params}; use sha2::{Digest, Sha256}; use std::{io, sync::Arc}; +use zeroize::Zeroizing; type Payload = Option>; @@ -92,16 +101,79 @@ fn damaged(message: &'static str) -> crate::Error { io::Error::new(io::ErrorKind::InvalidData, message).into() } -/// Stores `edit` in `batch` under `id`, or the next id, its payloads once each by hash; +/// A key `key` derives for `purpose`. +fn derived(key: &Key, purpose: &[u8]) -> Zeroizing<[u8; 32]> { + let mut mac = + as hmac::KeyInit>::new_from_slice(key.secret()).expect("any key length"); + mac.update(purpose); + Zeroizing::new(mac.finalize().into_bytes().into()) +} + +fn cipher(key: &Key) -> Aes256Gcm { + Aes256Gcm::new_from_slice(&*derived(key, b"Snowbound queue v1")).expect("a 32-byte key") +} + +/// A payload's name: its SHA-256, or in a protected section's queue an HMAC. +fn name(key: Option<&Key>, bytes: &[u8]) -> String { + match key { + Some(key) => { + let mut mac = as hmac::KeyInit>::new_from_slice(&*derived( + key, + b"Snowbound payload names v1", + )) + .expect("any key length"); + mac.update(bytes); + hex(&mac.finalize().into_bytes()) + } + None => hex(&Sha256::digest(bytes)), + } +} + +/// `clear` sealed under `key` as `kind`: a random nonce, then the ciphertext and tag. +fn seal(key: &Key, kind: &[u8], clear: &[u8]) -> Result> { + let mut nonce = [0; 12]; + getrandom::fill(&mut nonce).map_err(|_| io::Error::other("System random source failed"))?; + let sealed = cipher(key) + .encrypt( + &nonce.into(), + aes_gcm::aead::Payload { + msg: clear, + aad: kind, + }, + ) + .map_err(|_| io::Error::other("A queued edit could not be sealed"))?; + Ok([&nonce[..], &sealed].concat()) +} + +/// The inverse of `seal`. +fn open(key: &Key, kind: &[u8], sealed: &[u8]) -> Result>> { + let (nonce, sealed) = sealed + .split_first_chunk::<12>() + .ok_or_else(|| damaged("A sealed queue row is truncated"))?; + Ok(Zeroizing::new( + cipher(key) + .decrypt( + &(*nonce).into(), + aes_gcm::aead::Payload { + msg: sealed, + aad: kind, + }, + ) + .map_err(|_| damaged("A sealed queue row does not open under the section's key"))?, + )) +} + +/// Stores `edit` in `batch` under `id`, or the next id, its payloads once each by name; /// returns the edit's id. pub(crate) fn insert( connection: &Connection, + key: Option<&Key>, id: Option, batch: i64, author: &str, edit: &Edit, ) -> Result { - let (text, names) = encode(connection, edit)?; + let (text, names) = encode(connection, key, edit)?; connection.execute( "INSERT INTO edits(id, batch, author, edit, payloads) VALUES (?1, ?2, ?3, ?4, ?5)", params![id.map(signed).transpose()?, batch, author, text, names], @@ -114,8 +186,13 @@ fn hex(digest: &[u8]) -> String { } /// Replaces a stored edit's ops. -pub(crate) fn rewrite(connection: &Connection, id: u64, edit: &Edit) -> Result<()> { - let (text, names) = encode(connection, edit)?; +pub(crate) fn rewrite( + connection: &Connection, + key: Option<&Key>, + id: u64, + edit: &Edit, +) -> Result<()> { + let (text, names) = encode(connection, key, edit)?; connection.execute( "UPDATE edits SET edit=?1, payloads=?2 WHERE id=?3", params![text, names, signed(id)?], @@ -123,26 +200,38 @@ pub(crate) fn rewrite(connection: &Connection, id: u64, edit: &Edit) -> Result<( Ok(()) } -/// The serialized edit without payload bytes and the payload names, storing the payloads. -fn encode(connection: &Connection, edit: &Edit) -> Result<(String, Option)> { +/// The serialized edit without payload bytes and the payload names, storing the payloads; +/// sealed under `key` for a protected section. +fn encode( + connection: &Connection, + key: Option<&Key>, + edit: &Edit, +) -> Result<(String, Option)> { let mut edit = edit.clone(); let mut names: Vec> = Vec::new(); let mut failure = None; slots(&mut edit, |payload| { let name = payload.take().map(|bytes| { - let digest = Sha256::digest(&bytes); - if let Err(error) = connection.execute( - "INSERT INTO payloads(sha256, bytes) VALUES (?1, ?2) ON CONFLICT DO NOTHING", - params![&digest[..], &bytes[..]], - ) { + let name = name(key, &bytes); + let stored = match key { + Some(key) => seal(key, b"payload", &bytes), + None => Ok(bytes.to_vec()), + }; + let stored = stored.and_then(|stored| { + Ok(connection.execute( + "INSERT INTO payloads(sha256, bytes) VALUES (unhex(?1), ?2) ON CONFLICT DO NOTHING", + params![&name, &stored[..]], + )?) + }); + if let Err(error) = stored { failure.get_or_insert(error); } - hex(&digest) + name }); names.push(name); }); if let Some(error) = failure { - return Err(error.into()); + return Err(error); } let names = names .iter() @@ -150,15 +239,39 @@ fn encode(connection: &Connection, edit: &Edit) -> Result<(String, Option { + use base64::Engine; + base64::engine::general_purpose::STANDARD.encode(seal(key, b"edit", text.as_bytes())?) + } + None => text.to_string(), + }; + Ok((text, names)) } -fn decode(connection: &Connection, text: &str, names: Option) -> Result { - let mut edit: Edit = serde_json::from_str(text) - .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; +/// A stored edit's ops, without its payloads. +pub(crate) fn parse(key: Option<&Key>, text: &str) -> Result { + Ok(match key { + Some(key) => { + use base64::Engine; + let sealed = base64::engine::general_purpose::STANDARD + .decode(text) + .map_err(|_| damaged("A sealed queued edit is damaged"))?; + serde_json::from_slice(&open(key, b"edit", &sealed)?) + } + None => serde_json::from_str(text), + } + .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?) +} + +fn decode( + connection: &Connection, + key: Option<&Key>, + text: &str, + names: Option, +) -> Result { + let mut edit = parse(key, text)?; let Some(names) = names else { return Ok(edit); }; @@ -176,18 +289,24 @@ fn decode(connection: &Connection, text: &str, names: Option) -> Result< let Some(name) = name else { return; }; - match query + let bytes = query .query_row([&name], |row| row.get::<_, Vec>(0)) - .optional() - { - Ok(Some(bytes)) if hex(&Sha256::digest(&bytes)) == name => { + .optional(); + let bytes = match (key, bytes) { + (Some(key), Ok(Some(sealed))) => { + open(key, b"payload", &sealed).map(|bytes| Some(bytes.to_vec())) + } + (_, bytes) => bytes.map_err(Into::into), + }; + match bytes { + Ok(Some(bytes)) if self::name(key, &bytes) == name => { *payload = Some(Arc::from(bytes)); } Ok(_) => { failure.get_or_insert(damaged("A queued payload is missing or damaged")); } Err(error) => { - failure.get_or_insert(error.into()); + failure.get_or_insert(error); } } }); @@ -201,7 +320,11 @@ fn decode(connection: &Connection, text: &str, names: Option) -> Result< } /// Queued edits, oldest first; of one batch when `batch` is given. -pub(crate) fn load(connection: &Connection, batch: Option) -> Result> { +pub(crate) fn load( + connection: &Connection, + key: Option<&Key>, + batch: Option, +) -> Result> { let mut query = connection.prepare_cached( "SELECT id, author, edit, payloads FROM edits WHERE ?1 IS NULL OR batch=?1 ORDER BY id", )?; @@ -211,7 +334,7 @@ pub(crate) fn load(connection: &Connection, batch: Option) -> Result(2)?, row.get(3)?)?, + edit: decode(connection, key, &row.get::<_, String>(2)?, row.get(3)?)?, }); } Ok(edits) @@ -304,7 +427,7 @@ mod tests { }) .collect(), }; - let id = insert(&connection, None, 1, "Author", &edit).unwrap(); + let id = insert(&connection, None, None, 1, "Author", &edit).unwrap(); let stored: String = connection .query_row("SELECT edit FROM edits WHERE id=?1", [id as i64], |row| { row.get(0) @@ -315,7 +438,7 @@ mod tests { .query_row("SELECT count(*) FROM payloads", [], |row| row.get(0)) .unwrap(); assert_eq!(payloads, 1); - let loaded = load(&connection, None).unwrap(); + let loaded = load(&connection, None, None).unwrap(); assert_eq!(loaded[0].edit, edit); let Op::Page { op: diff --git a/crates/notebook/src/recovery.rs b/crates/notebook/src/recovery.rs index d4a660e51ca851869de8c66355b2aa22b592a1e4..1a7dd86fed59a510204658d1ae1b6b4d6cebf228 100644 --- a/crates/notebook/src/recovery.rs +++ b/crates/notebook/src/recovery.rs @@ -21,11 +21,22 @@ pub struct RecoverySummary { /// Read-only recovery evidence; it cannot publish or acknowledge an edit. pub struct Recovery { connection: Connection, + /// A password-protected section's key, which opens its sealed queue. + key: Option, } impl Recovery { /// Opens an exported archive without migration or conversion into a writable replica. pub fn open(path: impl AsRef) -> Result { + Self::open_with(path.as_ref(), None) + } + + /// `open` for an archive of a password-protected section, under its `key`. + pub fn open_unlocked(path: impl AsRef, key: &Key) -> Result { + Self::open_with(path.as_ref(), Some(key.clone())) + } + + fn open_with(path: &Path, key: Option) -> Result { let connection = Connection::open_with_flags(path, OpenFlags::SQLITE_OPEN_READ_ONLY)?; connection.busy_timeout(Duration::ZERO)?; connection.execute_batch("BEGIN")?; @@ -48,10 +59,10 @@ impl Recovery { ) .into()); } - let recovery = Self { connection }; + let recovery = Self { connection, key }; recovery.snapshot()?; - for edit in pending(&recovery.connection)? { - sync::status(&recovery.connection, edit.id)?; + for edit in recovery.pending()? { + recovery.status(edit.id)?; } receipts(&recovery.connection)?; Ok(recovery) @@ -63,31 +74,23 @@ impl Recovery { /// The image the archived queue leaves, as `Replica::snapshot` gives it. pub fn snapshot(&self) -> Result> { - working::image(&self.connection) - } - - fn base(&self) -> Result> { - Ok( - base::read(&self.connection, base::Image::Base)?.ok_or_else(|| { - io::Error::new(io::ErrorKind::InvalidData, "The archive has no base image") - })?, - ) + working::image(&self.connection, self.key.as_ref()) } /// The last observed remote image. pub fn remote_snapshot(&self) -> Result> { match base::read(&self.connection, base::Image::Remote)? { Some(image) => Ok(image), - None => self.base(), + None => base::base(&self.connection), } } pub fn pending(&self) -> Result> { - pending(&self.connection) + pending(&self.connection, self.key.as_ref()) } pub fn status(&self, id: u64) -> Result> { - sync::status(&self.connection, id) + sync::status(&self.connection, id, self.key.as_ref()) } pub fn receipts(&self) -> Result> { diff --git a/crates/notebook/src/session.rs b/crates/notebook/src/session.rs index 0a0cff293d77544aeaaf4ee8a1fd460f6f11083b..4cbc83aeb2754d5185aeae814144aab200182590 100644 --- a/crates/notebook/src/session.rs +++ b/crates/notebook/src/session.rs @@ -10,9 +10,10 @@ use onestore::{ document::Document, op::{Edit, Op, SectionOp}, page::Page, + protected, }; use std::{ - collections::BTreeMap, + collections::{BTreeMap, BTreeSet}, io, io::Write, path::{Path, PathBuf}, @@ -99,14 +100,9 @@ pub trait Storage: Send + Sync { fn place(&self, path: &str, ancestor: [u8; 16], name: &str) -> Result<()>; /// Publishes a transaction made on the file's current image. fn commit(&self, path: &str, transaction: &Transaction) -> Result<()>; -} - -/// A password-protected section as `Notebook::unlock` read it. -#[cfg(feature = "protected")] -pub struct Unlocked { - pub pages: Vec<(ExGuid, Page)>, - /// The stored section the pages came from, which an edit must still find in place. - snapshot: Vec, + /// Puts the file `with` in the place of the section or TOC at `path` under the coordination + /// its writers take, provided `path` still has `base`'s stamp. + fn supersede(&self, path: &str, base: &Stamp, with: &str) -> Result<()>; } /// A mounted notebook directory. @@ -235,6 +231,14 @@ impl Storage for Directory { fn commit(&self, path: &str, transaction: &Transaction) -> Result<()> { Ok(transaction.commit_file(self.path(path))?) } + + fn supersede(&self, path: &str, base: &Stamp, with: &str) -> Result<()> { + Ok(onestore::supersede_file( + self.path(path), + base, + self.path(with), + )?) + } } /// A notebook directory on an SMB share, reached through the native-compatible client. @@ -275,7 +279,7 @@ impl Storage for Share { fn exists(&self, path: &str) -> bool { let (folder, name) = split(path); self.client - .read_dir(&self.path(folder), 100_000) + .read_dir(&self.path(folder), LIMITS.entries) .is_ok_and(|entries| entries.iter().any(|entry| entry.name == name)) } @@ -322,9 +326,15 @@ impl Storage for Share { .client .commit_transaction(&self.path(path), transaction)?) } + + fn supersede(&self, path: &str, base: &Stamp, with: &str) -> Result<()> { + Ok(self + .client + .supersede(&self.path(path), base, &self.path(with))?) + } } -const LIMITS: discover::Limits = discover::Limits { +pub(crate) const LIMITS: discover::Limits = discover::Limits { entries: 100_000, bytes_per_file: 256 * 1024 * 1024, depth: 64, @@ -415,20 +425,16 @@ impl Notebook { let catalog = storage.discover(&mut read, LIMITS)?; let location = storage.location(); let mut claims: BTreeMap> = BTreeMap::new(); - let mut folders = vec![&catalog]; - while let Some(folder) = folders.pop() { - for section in &folder.sections { - let identity = match (&root, §ion.state) { - (Some(_), discover::SectionState::Readable { document, .. }) => *document, - (None, discover::SectionState::Readable { .. }) => section.file_id, - _ => continue, - }; - claims - .entry(replica_location(&location, section)) - .or_default() - .push((identity, §ion.path)); - } - folders.extend(&folder.groups); + for section in catalog.sections() { + let identity = match (&root, §ion.state) { + (Some(_), discover::SectionState::Readable { document, .. }) => *document, + (None, discover::SectionState::Readable { .. }) => section.file_id, + _ => continue, + }; + claims + .entry(replica_location(&location, section)) + .or_default() + .push((identity, §ion.path)); } for (at, sections) in &claims { let identities: Vec<[u8; 16]> = @@ -447,6 +453,7 @@ impl Notebook { listing, }; notebook.keep_listing(); + notebook.forget_superseded(); Ok(notebook) } @@ -545,30 +552,23 @@ impl Notebook { } } self.catalog = catalog; + self.forget_superseded(); Ok(changes) } fn folder(&self, path: &str) -> Result<&discover::Folder> { - let mut folders = vec![&self.catalog]; - while let Some(folder) = folders.pop() { - if folder.path == path { - return Ok(folder); - } - folders.extend(&folder.groups); - } - Err(io::Error::from(io::ErrorKind::NotFound).into()) + self.catalog + .folders() + .find(|folder| folder.path == path) + .ok_or_else(|| io::Error::from(io::ErrorKind::NotFound).into()) } /// A catalog section's path, refusing paths the catalog does not list. fn section_path(&self, path: &str) -> Result<&discover::Section> { - let mut folders = vec![&self.catalog]; - while let Some(folder) = folders.pop() { - if let Some(section) = folder.sections.iter().find(|section| section.path == path) { - return Ok(section); - } - folders.extend(&folder.groups); - } - Err(io::Error::from(io::ErrorKind::NotFound).into()) + self.catalog + .sections() + .find(|section| section.path == path) + .ok_or_else(|| io::Error::from(io::ErrorKind::NotFound).into()) } /// A folder's TOC path and file identity, creating the TOC when the folder has none @@ -1051,6 +1051,56 @@ impl Notebook { Ok(purged) } + /// Empties the recycle bin as OneNote 2010's Empty Recycle Bin does: every page of + /// Deleted Pages goes in one revision, and every binned section's file goes, its entry + /// left in the bin's TOC (`corpus/recycle-bin-view`). + pub fn empty_recycle_bin(&mut self) -> Result<()> { + let Ok(bin) = self.folder(RECYCLE_BIN) else { + return Ok(()); + }; + let sections: Vec = (bin.sections.iter()) + .filter(|section| !section.copy) + .map(|section| section.path.clone()) + .collect(); + for path in sections { + if !split(&path) + .1 + .eq_ignore_ascii_case("OneNote_DeletedPages.one") + { + self.storage.delete(&path)?; + continue; + } + let arena = onestore::Arena::default(); + let mut section = onestore::Section::open(&arena, self.storage.read(&path)?)?; + let pages: Vec = section + .pages()? + .into_iter() + .map(|(space, ..)| space) + .collect(); + if pages.is_empty() { + continue; + } + section.apply( + "", + &Edit { + at: crate::now(), + ops: vec![Op::Section(SectionOp::Delete(pages))], + }, + )?; + if let Some(transaction) = section.seal()? { + self.storage.commit(&path, &transaction)?; + } + } + self.refresh().map(drop) + } + + /// The table of contents of the folder at catalog path `folder` as its file stores it. + pub fn read_toc(&self, folder: &str) -> Result> { + let toc = self.folder(folder)?.toc.as_ref(); + let toc = toc.ok_or_else(|| io::Error::from(io::ErrorKind::NotFound))?; + self.storage.read(&catalog_path(folder, &toc.filename)) + } + /// Moves a section or section group into the folder at catalog path `folder`, last, as /// OneNote moves one dragged onto a group: the file or folder moves and each TOC's /// entry follows it. Returns its new catalog path. @@ -1133,14 +1183,11 @@ impl Notebook { let Some(link) = onestore::page::link::parse_internal_link(url) else { return Ok(None); }; - let mut sections = Vec::new(); - let mut folders = vec![&self.catalog]; - while let Some(folder) = folders.pop() { - sections.extend(folder.sections.iter().filter(|section| { - matches!(section.state, discover::SectionState::Readable { .. }) - })); - folders.extend(&folder.groups); - } + let mut sections: Vec<_> = self + .catalog + .sections() + .filter(|section| matches!(section.state, discover::SectionState::Readable { .. })) + .collect(); sections.sort_by_key(|section| section.file_id != link.section); let Some(page) = link.page else { return Ok(sections @@ -1168,56 +1215,172 @@ impl Notebook { self.storage.read(&self.section_path(path)?.path) } - /// The pages of a password-protected section: nothing is cached, and the decoded - /// buffers go when the pages have been built. - #[cfg(feature = "protected")] - pub fn unlock(&self, path: &str, password: &str) -> Result { - let path = self.section_path(path)?.path.clone(); - let snapshot = self.storage.read(&path)?; - let pages = { - let store = Store::parse(&snapshot)?; - let index = RevisionIndex::parse(&store)?; - let unlocked = onestore::protected::UnlockedSection::open( - &index, - password, - onestore::protected::Limits::default(), - )?; - let document = unlocked.document()?; - document - .pages()? - .into_iter() - .map(|(space, _)| Ok((space, Page::from_space(&document, space)?))) - .collect::>()? - }; - Ok(Unlocked { pages, snapshot }) + /// The key of the password-protected section at catalog `path`, opened with `password`. + /// Edits this device queued before the section was protected elsewhere, held since, are + /// queued again under the key: each page they changed comes back as a copy, as a page + /// another client removed does, the section's pages having taken new identities. + pub fn unlock(&self, path: &str, password: &str) -> Result { + let section = self.section_path(path)?; + let image = self.storage.read(§ion.path)?; + let key = protected::Key::open(&image, password)?; + let held: Vec = self + .superseded(&[section]) + .into_iter() + .filter(|(.., queued)| *queued > 0) + .map(|(replica, ..)| replica) + .collect(); + if !held.is_empty() { + let replica = + Replica::open_or_create(self.replica_path(path)?, Some(&key), || Ok(image))?; + for path in held { + // A queue sealed under an earlier password waits for that password. + let Ok(old) = Replica::open(&path) else { + continue; + }; + for (author, edit) in old.copies()? { + replica.apply(&author, edit)?; + } + drop(old); + remove_replica(&path)?; + } + } + Ok(key) } - /// Applies `edit` to pages of `unlocked` and stores it under the section's key, straight - /// to the file: nothing of a protected section is cached or queued. A section written - /// since `unlocked` was read refuses the edit; unlock again for its pages. - #[cfg(feature = "protected")] - pub fn apply_unlocked( + /// The replicas of the files the protected `locked` sections superseded when their + /// passwords were set (`onestore::protected::rekey` keeps the placement a file's header + /// names), each held so that no one opens it meanwhile, with how many edits it queues. Only + /// replicas no readable section names are read; one in use is left. + fn superseded( &self, + locked: &[&discover::Section], + ) -> Vec<(PathBuf, rusqlite::Connection, u64)> { + let named: BTreeSet = self + .catalog + .sections() + .filter(|section| matches!(section.state, discover::SectionState::Readable { .. })) + .filter_map(|section| self.replica_path(§ion.path).ok()) + .collect(); + let placed: Vec<_> = locked + .iter() + .filter_map(|section| { + let (_, stamp) = self.read.found(§ion.path)?; + Some((section.file_id, stamp.header, self.replica_folder(section))) + }) + .collect(); + let folders: BTreeSet<&PathBuf> = placed.iter().map(|(.., folder)| folder).collect(); + let mut superseded = Vec::new(); + for folder in folders { + let Ok(entries) = std::fs::read_dir(folder) else { + continue; + }; + for path in entries.filter_map(|entry| Some(entry.ok()?.path())) { + if path + .extension() + .is_none_or(|extension| extension != "sqlite") + || named.contains(&path) + { + continue; + } + let Ok(held) = crate::closed(&path) else { + continue; + }; + let Ok((base, queued)) = crate::peek(&held) else { + continue; + }; + let Ok(header) = onestore::Header::parse(&base.header) else { + continue; + }; + if placed.iter().any(|(file, stamp, at)| { + at == folder + && base.header[128..148] == stamp[128..148] + && header.file_id != *file + }) { + superseded.push((path, held, queued)); + } + } + } + superseded + } + + /// Deletes the replicas holding nothing unpublished of files a protected section + /// superseded: their plaintext is the section's before its password. + fn forget_superseded(&self) { + let locked: Vec<_> = self + .catalog + .sections() + .filter(|section| matches!(section.state, discover::SectionState::Locked)) + .collect(); + if locked.is_empty() { + return; + } + for (replica, held, queued) in self.superseded(&locked) { + drop(held); + if queued == 0 { + let _ = remove_replica(&replica); + } + } + } + + /// Sets, changes or removes the password of the section at catalog `path`, as OneNote + /// 2010 does: the section is written anew under new identities (`onestore::protected:: + /// rekey`), the file replaces the old one and its folder's TOC follows it. `key` opens + /// it as it stands; `password` protects it anew, or `None` leaves it unprotected. Its + /// replica, a cache of the old file, goes too, so its session must be closed and its + /// edits published first. Returns the new key. + pub fn set_password( + &mut self, path: &str, - password: &str, - unlocked: &mut Unlocked, - author: &str, - edit: &Edit, - ) -> Result<()> { - let path = self.section_path(path)?.path.clone(); - let transaction = { - let store = Store::parse(&unlocked.snapshot)?; - let index = RevisionIndex::parse(&store)?; - onestore::protected::UnlockedSection::open( - &index, - password, - onestore::protected::Limits::default(), - )? - .apply(author, edit)? - }; - self.storage.commit(&path, &transaction)?; - transaction.apply(&mut unlocked.snapshot)?; - Ok(()) + key: Option<&protected::Key>, + password: Option<&str>, + ) -> Result> { + let section = self.section_path(path)?; + let replica = self.replica_path(path)?; + // Held until the file is replaced, so that no session queues edits to the old file. + let held = replica + .exists() + .then(|| crate::closed(&replica)) + .transpose()?; + if let Some(held) = &held + && crate::peek(held)?.1 > 0 + { + return Err(io::Error::new( + io::ErrorKind::WouldBlock, + "Edits to the section wait to be published", + ) + .into()); + } + let source = self.storage.read(§ion.path)?; + let new = password.map(protected::Key::new).transpose()?; + let image = onestore::protected::rekey(&source, key, new.as_ref())?; + let (folder, filename) = split(§ion.path); + // A dot file, which discovery and OneNote pass over, until it replaces the section. + let written = catalog_path(folder, &format!(".{filename}.snowbound")); + if self.storage.exists(&written) { + self.storage.delete(&written)?; + } + self.storage.create(&written, &image)?; + if let Err(error) = self + .storage + .supersede(§ion.path, &Stamp::of(&source)?, &written) + { + let _ = self.storage.delete(&written); + return Err(error); + } + drop(held); + remove_replica(&replica)?; + let parent = self.folder(folder)?; + if let Some(identity) = Entry::of(parent, section).identity { + self.edit_toc( + folder, + &[onestore::TocEdit::Reidentify { + identity, + with: Store::parse(&image)?.header.file_id, + }], + )?; + } + self.refresh()?; + Ok(new) } /// Where the replica of the section at catalog `path` lives, in the notebook's @@ -1250,22 +1413,16 @@ impl Notebook { /// discovery read so that each is read once. pub fn replicas(&mut self) -> Vec { let mut images = self.read.take(); - let mut sections = Vec::new(); - let mut folders = vec![&self.catalog]; - while let Some(folder) = folders.pop() { - for section in &folder.sections { - if matches!(section.state, discover::SectionState::Readable { .. }) { - sections.push(Known { - path: section.path.clone(), - replica: self.replica_path(§ion.path).ok(), - found: self.read.found(§ion.path), - image: images.remove(§ion.path), - }); - } - } - folders.extend(folder.groups.iter().rev()); - } - sections + self.catalog + .sections() + .filter(|section| matches!(section.state, discover::SectionState::Readable { .. })) + .map(|section| Known { + path: section.path.clone(), + replica: self.replica_path(§ion.path).ok(), + found: self.read.found(§ion.path), + image: images.remove(§ion.path), + }) + .collect() } /// Keeps the sections of a mounted notebook in sync while they are not open @@ -1326,6 +1483,37 @@ impl Notebook { path: &str, connect: impl FnMut(&Path) -> io::Result + Send + 'static, notify: impl Fn() + Send + 'static, + ) -> Result
    { + self.open_section(path, None, connect, notify) + } + + /// `section` for a password-protected section, under the `key` `unlock` gave. + pub fn section_unlocked( + &self, + path: &str, + key: &protected::Key, + notify: impl Fn() + Send + 'static, + ) -> Result
    { + self.section_unlocked_with(path, key, |file| Ok(FileRemote(file.to_owned())), notify) + } + + /// `section_with` for a password-protected section, under its `key`. + pub fn section_unlocked_with( + &self, + path: &str, + key: &protected::Key, + connect: impl FnMut(&Path) -> io::Result + Send + 'static, + notify: impl Fn() + Send + 'static, + ) -> Result
    { + self.open_section(path, Some(key), connect, notify) + } + + fn open_section( + &self, + path: &str, + key: Option<&protected::Key>, + connect: impl FnMut(&Path) -> io::Result + Send + 'static, + notify: impl Fn() + Send + 'static, ) -> Result
    { let section = self.section_path(path)?; let (path, replicas) = (section.path.clone(), self.replica_folder(section)); @@ -1355,7 +1543,7 @@ impl Notebook { std::fs::create_dir_all(&replicas)?; Ok(replica_file(&replicas, identity)) }; - Section::open_in(file, replica, connect, notify) + Section::open_in(file, key, replica, connect, notify) } } @@ -1411,7 +1599,18 @@ pub struct StoredPage { pub fn stored_pages(image: &[u8]) -> Result> { let store = Store::parse(image)?; let index = RevisionIndex::parse(&store)?; - let document = Document::parse(&index)?; + pages_of(&Document::parse(&index)?) +} + +/// `stored_pages` of a password-protected section, under its `key`. +pub fn stored_pages_unlocked(image: &[u8], key: &protected::Key) -> Result> { + let store = Store::parse(image)?; + let index = RevisionIndex::parse(&store)?; + let unlocked = protected::UnlockedSection::unlock(&index, key, Default::default())?; + pages_of(&unlocked.document()?) +} + +fn pages_of(document: &Document<'_>) -> Result> { Ok(document .pages()? .into_iter() @@ -1461,7 +1660,7 @@ fn component(name: &str) -> bool { } /// Whether the TOC `image` holds has an entry for the file identity `file`. -fn lists(image: &[u8], file: [u8; 16]) -> Result { +pub(crate) fn lists(image: &[u8], file: [u8; 16]) -> Result { let store = Store::parse(image)?; let index = RevisionIndex::parse(&store)?; let document = Document::parse(&index)?; @@ -1508,6 +1707,19 @@ fn replica_location(notebook: &str, section: &discover::Section) -> String { } } +/// Deletes the closed replica at `replica`, with the files SQLite keeps beside it. +fn remove_replica(replica: &Path) -> io::Result<()> { + for suffix in ["", "-wal", "-shm"] { + let mut file = replica.as_os_str().to_owned(); + file.push(suffix); + match std::fs::remove_file(file) { + Err(error) if error.kind() != io::ErrorKind::NotFound => return Err(error), + _ => {} + } + } + Ok(()) +} + /// The replica in `cache` of the section `identity` names. pub(crate) fn replica_file(cache: &Path, identity: &[u8; 16]) -> PathBuf { let name: String = identity.iter().map(|byte| format!("{byte:02x}")).collect(); @@ -1635,13 +1847,14 @@ impl Section { })?; Ok(replica_file(&folder, identity)) }; - Self::open_in(file, replicas, connect, notify) + Self::open_in(file, None, replicas, connect, notify) } - /// Opens the canonical section `file` through the replica `replica` names for its document - /// identity and image. + /// Opens the canonical section `file`, a protected one under `key`, through the replica + /// `replica` names for its document identity and image. fn open_in( file: PathBuf, + key: Option<&protected::Key>, replica: impl FnOnce(&[u8; 16], &[u8]) -> Result, mut connect: impl FnMut(&Path) -> io::Result + Send + 'static, notify: impl Fn() + Send + 'static, @@ -1650,7 +1863,7 @@ impl Section { let store = Store::parse(&source)?; let identity = RevisionIndex::parse(&store)?.root; let cache = replica(&identity.guid, &source)?; - let replica = Replica::open_or_create(&cache, || Ok(source))?; + let replica = Replica::open_or_create(&cache, key, || Ok(source))?; let remote = file.clone(); Self::start(file, replica, move || connect(&remote), notify) } @@ -2015,3 +2228,6 @@ impl Drop for Section { drop(self.worker.take()); } } + +#[cfg(test)] +mod tests; diff --git a/crates/notebook/src/session/tests.rs b/crates/notebook/src/session/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..7559087d22808d42cf4e16069d354a7b1f5501eb --- /dev/null +++ b/crates/notebook/src/session/tests.rs @@ -0,0 +1,123 @@ +use super::*; + +/// A mounted notebook where another writer commits `revision` to the section file just +/// before Snowbound's rewritten file takes its place. +struct Racing { + inner: Directory, + revision: Mutex>, +} + +impl Racing { + fn race(&self, path: &str) { + let revision = self.revision.lock().unwrap().take(); + if let Some((section, transaction)) = revision { + assert_eq!(section, path); + self.inner.commit(§ion, &transaction).unwrap(); + } + } +} + +impl Storage for Racing { + fn discover( + &self, + cache: &mut discover::Cache, + limits: discover::Limits, + ) -> Result { + self.inner.discover(cache, limits) + } + fn location(&self) -> String { + self.inner.location() + } + fn exists(&self, path: &str) -> bool { + self.inner.exists(path) + } + fn read(&self, path: &str) -> Result> { + self.inner.read(path) + } + fn read_file(&self, path: &str, limit: usize) -> Result> { + self.inner.read_file(path, limit) + } + fn create(&self, path: &str, bytes: &[u8]) -> Result<()> { + self.inner.create(path, bytes) + } + fn create_directory(&self, path: &str) -> Result<()> { + self.inner.create_directory(path) + } + fn hide(&self, path: &str) -> Result<()> { + self.inner.hide(path) + } + fn rename(&self, from: &str, to: &str) -> Result<()> { + self.inner.rename(from, to) + } + fn replace(&self, from: &str, to: &str) -> Result<()> { + self.inner.replace(from, to) + } + fn delete(&self, path: &str) -> Result<()> { + self.inner.delete(path) + } + fn place(&self, path: &str, ancestor: [u8; 16], name: &str) -> Result<()> { + self.inner.place(path, ancestor, name) + } + fn commit(&self, path: &str, transaction: &Transaction) -> Result<()> { + self.inner.commit(path, transaction) + } + fn supersede(&self, path: &str, base: &Stamp, with: &str) -> Result<()> { + self.race(path); + self.inner.supersede(path, base, with) + } +} + +/// A revision another writer commits while a password is being set is never overwritten: +/// the section keeps it, and the password waits for a later try. +#[test] +fn a_password_never_overwrites_a_concurrent_revision() { + let temporary = tempfile::tempdir().unwrap(); + let folder = temporary.path().join("notebook"); + let cache = temporary.path().join("cache"); + let creation = PageCreation::new(None, Some("Mine"), "Fixture").unwrap(); + let path = Notebook::create(&folder, &cache, 0x00f0_a0c0, &creation) + .unwrap() + .catalog() + .sections[0] + .path + .clone(); + let file = folder.canonicalize().unwrap().join(&path); + let image = std::fs::read(&file).unwrap(); + let arena = onestore::Arena::default(); + let mut section = onestore::Section::open(&arena, image).unwrap(); + let theirs = PageCreation::new(None, Some("Theirs"), "OneNote").unwrap(); + section + .apply( + "OneNote", + &Edit { + at: crate::now(), + ops: vec![Op::Section(SectionOp::Create(theirs))], + }, + ) + .unwrap(); + let revision = section.seal().unwrap().unwrap(); + + let root = folder.canonicalize().unwrap(); + let storage = Racing { + inner: Directory(root.clone()), + revision: Mutex::new(Some((path.clone(), revision))), + }; + let mut notebook = Notebook::with(Box::new(storage), Some(root), &cache).unwrap(); + let set = notebook.set_password(&path, None, Some("secret")); + let titles = |image: &[u8]| -> Vec { + stored_pages(image) + .unwrap() + .into_iter() + .map(|page| page.page.title) + .collect() + }; + let stored = std::fs::read(&file).unwrap(); + match set { + Ok(key) => { + let key = key.unwrap(); + let pages = stored_pages_unlocked(&stored, &key).unwrap(); + assert!(pages.iter().any(|page| page.page.title == "Theirs")); + } + Err(_) => assert_eq!(titles(&stored), ["Mine", "Theirs"]), + } +} diff --git a/crates/notebook/src/sidecar/tests.rs b/crates/notebook/src/sidecar/tests.rs index ce34bdd42eec244d26d0c14b1961a6e20e6598be..a5d3d72c08955711f659846212ad10acbec053b9 100644 --- a/crates/notebook/src/sidecar/tests.rs +++ b/crates/notebook/src/sidecar/tests.rs @@ -165,6 +165,10 @@ impl Storage for Folder { fn commit(&self, _: &str, _: &Transaction) -> Result<()> { unimplemented!() } + + fn supersede(&self, _: &str, _: &onestore::Stamp, _: &str) -> Result<()> { + unimplemented!() + } } #[test] diff --git a/crates/notebook/src/smb/mod.rs b/crates/notebook/src/smb/mod.rs index 2f551539e23d0f779fd474a37268d1c646f81cf2..a290414060cf65ce538c6ec8023bf5057bc7b098 100644 --- a/crates/notebook/src/smb/mod.rs +++ b/crates/notebook/src/smb/mod.rs @@ -331,7 +331,7 @@ impl Client { /// Gives a file or directory the hidden attribute, keeping its others, as OneNote 2010 /// skips a hidden folder. - pub fn hide(&self, path: &str) -> io::Result<()> { + pub(crate) fn hide(&self, path: &str) -> io::Result<()> { // FILE_READ_ATTRIBUTES and FILE_WRITE_ATTRIBUTES. let file = self.open_with(path, 0x180, 7, CreateDisposition::FileOpen, 0)?; let file_id = file.id.ok_or(io::ErrorKind::InvalidInput)?; @@ -389,7 +389,7 @@ impl Client { /// Reads a bounded external payload while denying concurrent writes and deletion. /// Empty files succeed; limits, sharing contention and failed close return no payload. - pub fn read_asset(&self, path: &str, limit: usize) -> io::Result> { + pub(crate) fn read_asset(&self, path: &str, limit: usize) -> io::Result> { let mut file = self.open_shared(path, false, 1)?; let mut bytes = Vec::new(); let mut block = [0; 65536]; @@ -493,6 +493,33 @@ impl Client { self.commit(path, &checked(base), |file| onestore::confirm(file, base)) } + /// Puts the file `with` in the place of the revision store at `path`, provided `path` still + /// has `base`'s stamp, as OneNote 2010's maintenance puts a file it wrote anew in place: + /// under writer coordination the old file goes aside, `with` takes its name, and the old + /// file is deleted once released. A server renames nothing over an open file. + pub(crate) fn supersede( + &self, + path: &str, + base: &onestore::Stamp, + with: &str, + ) -> Result<(), CommitError> { + let aside = format!("{with}.old"); + let failed = |state| move |error| CommitError { state, error }; + self.commit(path, &checked(base), |file| { + base.check(file) + .and_then(|()| self.rename(path, &aside)) + .map_err(failed(CommitState::NotCommitted))?; + self.rename(with, path).map_err(|error| CommitError { + state: match self.rename(&aside, path) { + Ok(()) => CommitState::NotCommitted, + Err(_) => CommitState::Unknown, + }, + error, + }) + })?; + self.delete(&aside).map_err(failed(CommitState::Committed)) + } + /// Opens `path` for writing under OneNote's coordination, making `reads` with the locks. fn commit( &self, diff --git a/crates/notebook/src/smb/tests.rs b/crates/notebook/src/smb/tests.rs index 45bb709dd4018c36071cc963fda83e86257f3d19..9ec2e446c8516c7c468f7e9940ab1b95631c4853 100644 --- a/crates/notebook/src/smb/tests.rs +++ b/crates/notebook/src/smb/tests.rs @@ -463,9 +463,16 @@ fn live_watch() { #[ignore = "requires ONESTORE_SMB_LAB pointing to disposable Samba"] fn live_storage_inspection() { let reader = client(); - for (index, fixture) in [ - "native-encrypted/encrypted-01/notebook/synthetic.one", - "native-encrypted/cold-encrypted-02/notebook/Open Notebook.one", + // Stably unreadable, never contention: a protected section, and a file too damaged to say. + for (index, (fixture, unreadable)) in [ + ( + "native-encrypted/encrypted-01/notebook/synthetic.one", + io::ErrorKind::Unsupported, + ), + ( + "native-encrypted/cold-encrypted-02/notebook/Open Notebook.one", + io::ErrorKind::InvalidData, + ), ] .into_iter() .enumerate() @@ -482,7 +489,7 @@ fn live_storage_inspection() { assert_eq!(reader.read_storage(&path, source.len()).unwrap(), source); assert_eq!( reader.read(&path, source.len()).unwrap_err().kind(), - io::ErrorKind::WouldBlock + unreadable ); let maintenance = client(); let guard = maintenance.open(&path, false).unwrap(); @@ -777,6 +784,42 @@ fn live_structure() { assert_eq!(header.ancestor, toc_id); assert_eq!(header.name_crc, 0x6108912a); assert!(fresh.section("Renamed.one", || {}).is_err()); + // A password supersedes the file under writer coordination, never over a newer stamp, and + // while a reader holds it open, as OneNote's readers share it with deletion. + let section = format!("{root}/Renamed.one"); + let written = format!("{root}/.Renamed.one.snowbound"); + client.create(&written, &renamed).unwrap(); + let mut stale = onestore::Stamp::of(&renamed).unwrap(); + stale.length += 1; + let refused = client.supersede(§ion, &stale, &written).unwrap_err(); + assert_eq!(refused.state, CommitState::NotCommitted); + assert_eq!(client.read_storage(§ion, 1 << 20).unwrap(), renamed); + client.delete(&written).unwrap(); + let mut fresh = fresh; + let reader = client.open(§ion, false).unwrap(); + let key = fresh + .set_password("Renamed.one", None, Some("secret")) + .unwrap() + .unwrap(); + reader.close().unwrap(); + let protected = client.read_storage(§ion, 1 << 20).unwrap(); + assert_eq!( + onestore::protected::Key::open(&protected, "secret") + .unwrap() + .secret(), + key.secret() + ); + assert!(matches!( + fresh.catalog().sections[0].state, + crate::discover::SectionState::Locked + )); + let names: Vec = client + .read_dir(&root, 100) + .unwrap() + .into_iter() + .map(|entry| entry.name) + .collect(); + assert!(!names.iter().any(|name| name.starts_with('.')), "{names:?}"); for path in [ "Renamed.one", "Kept/Inner.one", diff --git a/crates/notebook/src/sync.rs b/crates/notebook/src/sync.rs index 30b89bfbb69159b28cf1e29a0458d8752d6c2e11..2f0f0a0628b751d31a9bc0597bb254b4b0ca16d3 100644 --- a/crates/notebook/src/sync.rs +++ b/crates/notebook/src/sync.rs @@ -84,8 +84,7 @@ struct Blocked { } fn state(connection: &Connection) -> Result { - let base = base::stamp(connection, base::Image::Base)? - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image"))?; + let base = base::base_stamp(connection)?; let blocked = connection .query_row( "SELECT id, revisions FROM batches WHERE attempted=1 ORDER BY id LIMIT 1", @@ -158,20 +157,17 @@ fn newest(connection: &Connection, batch: i64) -> Result { impl Replica { /// Returns a durable receipt or the persisted state of a locally acknowledged edit. pub fn status(&self, id: u64) -> Result> { - status(&*self.lock()?, id) + status(&*self.lock()?, id, self.section.key.as_ref()) } /// The last observed remote image. Observation alone does not acknowledge any pending /// edit's remote durability. pub(crate) fn remote_snapshot(&self) -> Result> { let connection = self.lock()?; - let image = match base::read(&connection, base::Image::Remote)? { - Some(image) => Some(image), - None => base::read(&connection, base::Image::Base)?, - }; - Ok(image.ok_or_else(|| { - io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image") - })?) + match base::read(&connection, base::Image::Remote)? { + Some(image) => Ok(image), + None => base::base(&connection), + } } /// Publishes the oldest unpublished batch, rebasing the queue first when the remote @@ -208,7 +204,8 @@ impl Replica { return Ok(Synced { edit: Some(( id, - status(&*self.lock()?, id)?.unwrap_or(EditStatus::Pending), + status(&*self.lock()?, id, self.section.key.as_ref())? + .unwrap_or(EditStatus::Pending), )), changed: Vec::new(), }); @@ -217,9 +214,15 @@ impl Replica { observed if observed == state.base => None, _ => { let image = remote.read().map_err(Error::RemoteIo)?; + // Protected elsewhere: a section written anew, which only its key reads. + if self.section.key.is_none() && crate::discover::locked(&Store::parse(&image)?) { + return Err(Error::RemoteIo(io::Error::new( + io::ErrorKind::Unsupported, + "Password protected", + ))); + } // A read image is compared whole: a stamp stands for it only when read alone. - let base = base::read(&*self.lock()?, base::Image::Base)?; - (base.as_deref() != Some(&image[..])).then_some(image) + (base::base(&*self.lock()?)? != image).then_some(image) } }; let mut changed = Vec::new(); @@ -265,7 +268,8 @@ impl Replica { return Ok(Synced { edit: Some(( id, - status(&*self.lock()?, id)?.unwrap_or(EditStatus::Pending), + status(&*self.lock()?, id, self.section.key.as_ref())? + .unwrap_or(EditStatus::Pending), )), changed, }); @@ -301,7 +305,8 @@ impl Replica { return Ok(Synced { edit: Some(( id, - status(&*self.lock()?, id)?.unwrap_or(EditStatus::Pending), + status(&*self.lock()?, id, self.section.key.as_ref())? + .unwrap_or(EditStatus::Pending), )), changed, }); @@ -329,9 +334,7 @@ impl Replica { let id = newest(&*self.lock()?, batch)?; let Some(transaction) = transaction else { // Edits that changed nothing are published once the remote's image is durable. - let base = base::stamp(&*self.lock()?, base::Image::Base)?.ok_or_else(|| { - io::Error::new(io::ErrorKind::InvalidData, "The cache holds no base image") - })?; + let base = base::base_stamp(&*self.lock()?)?; if let Err(error) = remote.confirm(&base) { if error.state == CommitState::Committed { self.acknowledge(batch, None, None)?; @@ -373,15 +376,13 @@ impl Replica { sealed: Option<&Transaction>, revisions: &BTreeMap, ) -> Result { - let base = base::read(&*self.lock()?, base::Image::Base)?.ok_or_else(|| { - io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image") - })?; + let base = base::base(&*self.lock()?)?; let (local, remote) = (onestore::Arena::default(), onestore::Arena::default()); - let mut local = onestore::Section::open(&local, base)?; + let mut local = working::open(&local, base, self.section.key.as_ref())?; if let Some(sealed) = sealed { local.replay(sealed)?; } - let mut remote = onestore::Section::open(&remote, image.to_vec())?; + let mut remote = working::open(&remote, image.to_vec(), self.section.key.as_ref())?; // A page's versions change without its page changing. let versions = |section: &mut onestore::Section<'_>| { section.versions().map(|versions| { @@ -403,7 +404,7 @@ impl Replica { } fn receipt(&self, id: u64) -> Result { - match status(&*self.lock()?, id)? { + match status(&*self.lock()?, id, self.section.key.as_ref())? { Some(EditStatus::Published { revision }) => Ok(revision), _ => Err(io::Error::other("A published edit has no receipt").into()), } @@ -431,7 +432,7 @@ impl Replica { |row| row.get::<_, String>(0), )?)?, }; - for queued in queue::load(&database, Some(batch))? { + for queued in queue::load(&database, self.section.key.as_ref(), Some(batch))? { database.execute( "INSERT INTO receipts(edit_id, revision) VALUES (?1, ?2)", params![ @@ -527,7 +528,11 @@ impl Replica { } } -pub(crate) fn status(connection: &Connection, id: u64) -> Result> { +pub(crate) fn status( + connection: &Connection, + id: u64, + key: Option<&onestore::protected::Key>, +) -> Result> { let id = signed(id)?; if let Some(revision) = connection .query_row( @@ -563,8 +568,7 @@ pub(crate) fn status(connection: &Connection, id: u64) -> Result None, Some((true, revisions, edit)) => { let revisions = decode_revisions(revisions.as_deref().unwrap_or("{}"))?; - let edit: onestore::op::Edit = serde_json::from_str(&edit) - .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?; + let edit = queue::parse(key, &edit)?; let revision = revision_of(&edit, &revisions)?; Some(EditStatus::AwaitingConfirmation { revision }) } diff --git a/crates/notebook/src/worker.rs b/crates/notebook/src/worker.rs index 0ab15018e2f9a00dfde82567b1e7d9b2c04bb9e4..be6537a1ab685878d74084c4888379d483db9363 100644 --- a/crates/notebook/src/worker.rs +++ b/crates/notebook/src/worker.rs @@ -166,6 +166,7 @@ impl Replica { )); } let mut owner = self + .section .worker .lock() .map_err(|_| io::Error::other("Synchronization worker registration panicked"))?; diff --git a/crates/notebook/src/working.rs b/crates/notebook/src/working.rs index c0f7f1f0830939da3a955406df265ab444631a62..0ccb3fbeea69fc76e86c6df393900e63e9f3259c 100644 --- a/crates/notebook/src/working.rs +++ b/crates/notebook/src/working.rs @@ -8,6 +8,7 @@ use onestore::{ Arena, ExGuid, Section, Transaction, op::{Edit, OpError}, page::Page, + protected::Key, }; use rusqlite::{Connection, OptionalExtension, TransactionBehavior, params}; use std::{ @@ -96,18 +97,19 @@ impl Request { } } -type Worker = Arc>>; - /// The section thread as the replica sees it. Rereading the section after the queue was /// replaced (a rebase, a released attempt) happens on a new thread while the current one /// keeps answering page reads from the section as it was; the new thread then takes the /// requests over, so reads never wait for a rebuild. pub(crate) struct Thread { - connection: Arc>, - worker: Worker, + pub(crate) connection: Mutex, + /// The sync worker, which a durable burst of edits wakes. + pub(crate) worker: Mutex>, /// Taken when the replica drops, which ends every section thread. sender: Mutex>>, threads: Mutex>>, + /// A password-protected section's key, under which its queue is sealed too. + pub(crate) key: Option, } impl Thread { @@ -148,16 +150,14 @@ impl Thread { } /// Starts the section thread once the queue opens. -pub(crate) fn spawn( - connection: Arc>, - worker: Worker, -) -> Result<(Arc, ExGuid)> { +pub(crate) fn spawn(connection: Connection, key: Option) -> Result<(Arc, ExGuid)> { let (sender, requests) = mpsc::channel(); let shared = Arc::new(Thread { - connection, - worker, + connection: Mutex::new(connection), + worker: Mutex::new(Weak::new()), sender: Mutex::new(Some(sender)), threads: Mutex::new(Vec::new()), + key, }); let (ready, opened) = mpsc::sync_channel(1); shared.start(move |shared| run(shared, requests, VecDeque::new(), Some(ready)))?; @@ -188,7 +188,7 @@ fn run( ) { loop { let arena = Arena::default(); - let working = match Working::open(&arena, &shared.connection) { + let working = match Working::open(&arena, &shared.connection, shared.key.as_ref()) { Ok(working) => working, Err(error) => { if let Some(ready) = ready.take() { @@ -237,17 +237,19 @@ enum Job { fn build(shared: Arc, job: Job, signal: mpsc::Sender) { let answer: Box = match job { Job::Reopen { reply } => Box::new(move || reply(Ok(()))), - Job::Rebase { image, reply } => match rebase(&shared.connection, image) { - Ok(changed) => Box::new(move || reply(Ok(changed))), - Err(error) => { - reply(Err(error)); - let _ = signal.send(Request::Resume); - return; + Job::Rebase { image, reply } => { + match rebase(&shared.connection, image, shared.key.as_ref()) { + Ok(changed) => Box::new(move || reply(Ok(changed))), + Err(error) => { + reply(Err(error)); + let _ = signal.send(Request::Resume); + return; + } } - }, + } }; let arena = Arena::default(); - let opened = Working::open(&arena, &shared.connection); + let opened = Working::open(&arena, &shared.connection, shared.key.as_ref()); let (to, from) = mpsc::sync_channel(1); if signal.send(Request::Handover(to)).is_err() { return; @@ -286,8 +288,8 @@ struct Working<'a> { } impl<'a> Working<'a> { - fn open(arena: &'a Arena, connection: &Mutex) -> Result { - let (section, open, touched) = replay(arena, &*lock(connection)?)?; + fn open(arena: &'a Arena, connection: &Mutex, key: Option<&Key>) -> Result { + let (section, open, touched) = replay(arena, &*lock(connection)?, key)?; Ok(Self { section, open, @@ -301,7 +303,7 @@ impl<'a> Working<'a> { requests: &mpsc::Receiver, backlog: &mut VecDeque, ) -> Next { - let (connection, worker) = (&*shared.connection, &shared.worker); + let connection = &shared.connection; // While another thread rebuilds the section, reads answer from this one and every // other request waits for the rebuilt section. let mut held: Option> = None; @@ -356,7 +358,7 @@ impl<'a> Working<'a> { edit, reply, } => self - .accept(author, edit, reply, &mut accepted, connection, worker) + .accept(author, edit, reply, &mut accepted, shared) .err() .unwrap_or(false), Request::Page { space, reply } => { @@ -390,7 +392,7 @@ impl<'a> Working<'a> { false } Request::Flush { reply } => { - let written = self.flush(connection, worker, &mut accepted); + let written = self.flush(shared, &mut accepted); reply(if written { Ok(()) } else { @@ -399,7 +401,7 @@ impl<'a> Working<'a> { !written } Request::Seal { reply } => { - if !self.flush(connection, worker, &mut accepted) { + if !self.flush(shared, &mut accepted) { reply(Err( io::Error::other("The queue could not be written").into() )); @@ -412,7 +414,7 @@ impl<'a> Working<'a> { } } Request::Rebase { image, reply } => { - if self.flush(connection, worker, &mut accepted) { + if self.flush(shared, &mut accepted) { held = self .rebuild(shared, Job::Rebase { image, reply }) .then(VecDeque::new); @@ -425,7 +427,7 @@ impl<'a> Working<'a> { } } Request::Reopen { reply } => { - self.flush(connection, worker, &mut accepted); + self.flush(shared, &mut accepted); held = self .rebuild(shared, Job::Reopen { reply }) .then(VecDeque::new); @@ -438,7 +440,7 @@ impl<'a> Working<'a> { return Next::Reopen; } } - if !self.flush(connection, worker, &mut accepted) { + if !self.flush(shared, &mut accepted) { return Next::Reopen; } } @@ -476,8 +478,7 @@ impl<'a> Working<'a> { edit: Edit, reply: Reply, accepted: &mut Vec, - connection: &Mutex, - worker: &Worker, + shared: &Thread, ) -> std::result::Result<(), bool> { match self.section.apply(&author, &edit) { Ok(()) => { @@ -493,7 +494,7 @@ impl<'a> Working<'a> { Err(error) => { let broken = matches!(error, OpError::Failed(_)); if broken { - self.flush(connection, worker, accepted); + self.flush(shared, accepted); } reply(Err(error.into())); Err(broken) @@ -503,17 +504,12 @@ impl<'a> Working<'a> { /// Writes the accepted edits in one transaction, then answers their senders; false /// when the write failed and the section holds edits the queue lacks. - fn flush( - &mut self, - connection: &Mutex, - worker: &Worker, - accepted: &mut Vec, - ) -> bool { + fn flush(&mut self, shared: &Thread, accepted: &mut Vec) -> bool { if accepted.is_empty() { return true; } let written = (|| -> Result> { - let mut connection = lock(connection)?; + let mut connection = lock(&shared.connection)?; let transaction = connection.transaction_with_behavior(TransactionBehavior::Immediate)?; let batch = match self.open { @@ -527,6 +523,7 @@ impl<'a> Working<'a> { for edit in accepted.iter() { ids.push(queue::insert( &transaction, + shared.key.as_ref(), None, batch, &edit.author, @@ -543,7 +540,7 @@ impl<'a> Working<'a> { for (edit, id) in accepted.drain(..).zip(ids) { (edit.reply)(Ok(id)); } - crate::edited(worker); + crate::edited(&shared.worker); } Err(error) => { let message = error.to_string(); @@ -600,7 +597,11 @@ impl<'a> Working<'a> { /// Replays every queued edit on `image`, which becomes the base; each page whose local /// version the remote could not take gains a conflict page holding it, queued as a new edit. /// Returns the pages the remote changed. -fn rebase(connection: &Mutex, image: Option>) -> Result> { +fn rebase( + connection: &Mutex, + image: Option>, + key: Option<&Key>, +) -> Result> { let (base_image, image, edits) = { let connection = lock(connection)?; if connection.query_row( @@ -614,22 +615,20 @@ fn rebase(connection: &Mutex, image: Option>) -> Result image, None => { base::read(&connection, base::Image::Remote)?.unwrap_or_else(|| base_image.clone()) } }; - (base_image, image, queue::load(&connection, None)?) + (base_image, image, queue::load(&connection, key, None)?) }; let old_arena = Arena::default(); - let mut old = Section::open(&old_arena, base_image)?; + let mut old = open(&old_arena, base_image, key)?; let before: BTreeMap = old.revisions().collect(); let remote_arena = Arena::default(); - let remote = Section::open(&remote_arena, image.clone())?; + let remote = open(&remote_arena, image.clone(), key)?; if old.root() != remote.root() { return Err(io::Error::new( io::ErrorKind::InvalidInput, @@ -645,10 +644,10 @@ fn rebase(connection: &Mutex, image: Option>) -> Result = merged .conflicts @@ -694,10 +693,10 @@ fn rebase(connection: &Mutex, image: Option>) -> Result?1", [batch])?; for (id, edit) in rewritten { - queue::rewrite(&transaction, id, &edit)?; + queue::rewrite(&transaction, key, id, &edit)?; } for (author, edit) in &added { - queue::insert(&transaction, None, batch, author, edit)?; + queue::insert(&transaction, key, None, batch, author, edit)?; } if transaction.query_row("SELECT count(*) FROM edits", [], |row| row.get::<_, i64>(0))? == 0 { transaction.execute("DELETE FROM batches", [])?; @@ -743,10 +742,10 @@ fn batches(connection: &Connection) -> Result( arena: &'a Arena, connection: &Connection, + key: Option<&Key>, ) -> Result<(Section<'a>, Option, BTreeSet)> { - let image = base::read(connection, base::Image::Base)? - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "The cache has no base image"))?; - let mut section = Section::open(arena, image)?; + let image = base::base(connection)?; + let mut section = open(arena, image, key)?; let mut open = None; let mut touched = BTreeSet::new(); for (batch, sealed) in batches(connection)? { @@ -761,7 +760,7 @@ fn replay<'a>( Some(Some(transaction)) => section.replay(&transaction)?, Some(None) => {} None => { - for queued in queue::load(connection, Some(batch))? { + for queued in queue::load(connection, key, Some(batch))? { section .apply(&queued.author, &queued.edit) .map_err(|error| { @@ -781,13 +780,21 @@ fn replay<'a>( /// The image the queue leaves, its unsealed edits sealed as one more revision; that /// revision's identities are fresh on every call. O(section), for tests and recovery. -pub(crate) fn image(connection: &Connection) -> Result> { +pub(crate) fn image(connection: &Connection, key: Option<&Key>) -> Result> { let arena = Arena::default(); - let (mut section, ..) = replay(&arena, connection)?; + let (mut section, ..) = replay(&arena, connection, key)?; section.seal()?; Ok(section.image()) } +/// A section image, a password-protected one under `key`. +pub(crate) fn open<'a>(arena: &'a Arena, image: Vec, key: Option<&Key>) -> Result> { + Ok(match key { + Some(key) => Section::unlock(arena, image, key)?, + None => Section::open(arena, image)?, + }) +} + /// The sealed batch waiting for publication, if any. pub(crate) fn sealed(connection: &Connection) -> Result> { let row: Option<(i64, String)> = connection diff --git a/crates/notebook/tests/cache.rs b/crates/notebook/tests/cache.rs index b30c501790eaa6de68ff82ce6f967278e3c69ee7..f547954ad14140124ec2f7e612965d2ef622d6b7 100644 --- a/crates/notebook/tests/cache.rs +++ b/crates/notebook/tests/cache.rs @@ -66,14 +66,14 @@ fn a_cache_created_meanwhile_opens() { let source = onestore::create_section("Raced.one", "Raced", "Fixture").unwrap(); let directory = tempfile::tempdir().unwrap(); let path = directory.path().join("raced.sqlite"); - let replica = Replica::open_or_create(&path, || { + let replica = Replica::open_or_create(&path, None, || { drop(Replica::create(&path, &source)?); Ok(source.clone()) }) .unwrap(); assert_eq!(replica.pages().unwrap()[0].1, "Raced"); drop(replica); - let reopened = Replica::open_or_create(&path, || unreachable!()).unwrap(); + let reopened = Replica::open_or_create(&path, None, || unreachable!()).unwrap(); assert_eq!(reopened.pages().unwrap()[0].1, "Raced"); } diff --git a/crates/notebook/tests/package.rs b/crates/notebook/tests/package.rs new file mode 100644 index 0000000000000000000000000000000000000000..1227410baf531b8063a76134c53ccf7a6209e998 --- /dev/null +++ b/crates/notebook/tests/package.rs @@ -0,0 +1,265 @@ +//! OneNote packages and the copies Save As writes (`corpus/notebook-package`). + +use notebook::{package, session::Notebook}; +use std::path::Path; + +fn header(image: &[u8]) -> onestore::Header { + onestore::Store::parse(image).unwrap().header +} + +/// Each entry of the table of contents `image` holds: its filename and file identity. +fn listed(image: &[u8]) -> Vec<(String, [u8; 16])> { + let store = onestore::Store::parse(image).unwrap(); + let index = onestore::RevisionIndex::parse(&store).unwrap(); + let document = onestore::document::Document::parse(&index).unwrap(); + let revision = document.active(document.root).unwrap(); + let onestore::document::Kind::Toc { entries, .. } = &revision.nodes[&revision.roots[&1]].kind + else { + panic!() + }; + (entries.iter()) + .map(|id| match &revision.nodes[id].kind { + onestore::document::Kind::Toc { + filename, identity, .. + } => (filename.clone().unwrap_or_default(), identity.unwrap()), + _ => panic!(), + }) + .collect() +} + +/// A notebook of a section, a group holding one, and a page deleted into the recycle bin. +fn notebook(root: &Path, cache: &Path) -> Notebook { + let page = |title: &str| onestore::PageCreation::new(None, Some(title), "Author").unwrap(); + let mut notebook = Notebook::create(root, cache, 0x00d7ff, &page("First")).unwrap(); + notebook.create_group("", "Group").unwrap(); + notebook + .create_section("Group", "Inner", &page("Inside")) + .unwrap(); + notebook + .create_section("", "Doomed", &page("Binned")) + .unwrap(); + let image = notebook.read_section("Doomed.one").unwrap(); + let pages = notebook::session::stored_pages(&image).unwrap(); + notebook + .recycle_pages(&[pages[0].page.clone()], "Author") + .unwrap(); + notebook.delete("Doomed.one").unwrap(); + notebook +} + +/// Pack writes the notebook's tables of contents and sections, the recycle bin left out, +/// outside any notebook; Unpack Notebook gives every file a new identity, placed under its +/// folder's table of contents, whose entries follow, and the notebook opens as it was. +/// `NOTEBOOK_PACKAGE_EXPORT` names a new directory receiving the package and the notebook +/// unpacked, for OneNote 2010 to unpack and to open cold. +#[test] +fn a_notebook_packs_and_unpacks_as_onenote_packs_one() { + let temporary = tempfile::tempdir().unwrap(); + let root = temporary.path().join("Packed"); + let cache = temporary.path().join("cache"); + let notebook = notebook(&root, &cache); + let files = package::notebook_files(¬ebook, |_| None).unwrap(); + let paths: Vec<&str> = files.iter().map(|(path, _)| path.as_str()).collect(); + assert_eq!( + paths, + [ + "Open Notebook.onetoc2", + "New Section 1.one", + "Group/Open Notebook.onetoc2", + "Group/Inner.one" + ] + ); + let packed = package::pack(files.clone()).unwrap(); + let read = package::read(&packed, 1 << 30).unwrap(); + assert_eq!(read.len(), files.len()); + for ((path, bytes), (stored, original)) in read.iter().zip(&files) { + assert_eq!(path, stored); + let (unplaced, placed) = (header(bytes), header(original)); + assert_eq!( + unplaced.file_id, placed.file_id, + "{path} keeps its identity" + ); + assert_eq!( + (unplaced.ancestor, unplaced.name_crc), + ([0; 16], 0), + "{path}" + ); + assert_eq!(bytes[..128], original[..128]); + assert_eq!(bytes[148..], original[148..]); + } + + let unpacked = temporary.path().join("Unpacked"); + package::unpack(read, &unpacked).unwrap(); + let opened = Notebook::open(&unpacked, &cache).unwrap(); + let catalog = opened.catalog(); + let sections = |folder: ¬ebook::discover::Folder| -> Vec { + (folder.sections.iter()) + .map(|section| section.path.clone()) + .collect() + }; + assert_eq!(sections(catalog), ["New Section 1.one"]); + assert_eq!(sections(&catalog.groups[0]), ["Group/Inner.one"]); + assert!(catalog.unavailable.is_empty() && catalog.groups[0].unavailable.is_empty()); + let read = |path: &str| std::fs::read(unpacked.join(path)).unwrap(); + let root_toc = read("Open Notebook.onetoc2"); + let group_toc = read("Group/Open Notebook.onetoc2"); + let section = read("New Section 1.one"); + let inner = read("Group/Inner.one"); + for (unpacked, (_, original)) in [&root_toc, §ion, &group_toc, &inner] + .into_iter() + .zip(&files) + { + assert_ne!(header(unpacked).file_id, header(original).file_id); + } + assert_eq!(header(&root_toc).ancestor, [0; 16]); + assert_eq!(header(§ion).ancestor, header(&root_toc).file_id); + assert_eq!(header(&group_toc).ancestor, header(&root_toc).file_id); + assert_eq!(header(&inner).ancestor, header(&group_toc).file_id); + // The recycle bin's entry stays, as in OneNote's packages, naming a folder not there. + let bin = listed(&files[0].1)[2].clone(); + assert_eq!(bin.0, "OneNote_RecycleBin"); + assert_eq!( + listed(&root_toc), + [ + ("New Section 1.one".to_owned(), header(§ion).file_id), + ("Group".to_owned(), header(&group_toc).file_id), + bin + ] + ); + assert_eq!( + listed(&group_toc), + [("Inner.one".to_owned(), header(&inner).file_id)] + ); + let pages = notebook::session::stored_pages(&inner).unwrap(); + assert_eq!(pages[0].page.title, "Inside"); + // Placed as they are, nothing is re-identified when the notebook is read again. + drop(opened); + let reopened = Notebook::open(&unpacked, &cache).unwrap(); + assert_eq!( + reopened.catalog().sections[0].file_id, + header(§ion).file_id + ); + assert!( + package::unpack(Vec::new(), &unpacked).is_err(), + "the folder is new" + ); + + if let Some(directory) = std::env::var_os("NOTEBOOK_PACKAGE_EXPORT") { + let directory = Path::new(&directory); + std::fs::create_dir(directory).unwrap(); + std::fs::write(directory.join("Packed.onepkg"), &packed).unwrap(); + copy(&unpacked, &directory.join("Unpacked")); + } +} + +fn copy(from: &Path, to: &Path) { + std::fs::create_dir(to).unwrap(); + for entry in std::fs::read_dir(from).unwrap() { + let entry = entry.unwrap(); + if entry.file_type().unwrap().is_dir() { + copy(&entry.path(), &to.join(entry.file_name())); + } else { + std::fs::copy(entry.path(), to.join(entry.file_name())).unwrap(); + } + } +} + +/// OneNote 2010's own package (LZX) unpacks and opens. +#[test] +fn onenotes_package_unpacks() { + let package = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../corpus/notebook-package/native/Lab.onepkg"); + let files = package::read(&std::fs::read(package).unwrap(), 1 << 30).unwrap(); + let paths: Vec<&str> = files.iter().map(|(path, _)| path.as_str()).collect(); + assert_eq!(paths, ["Alpha.one", "Beta.one", "Open Notebook.onetoc2"]); + let temporary = tempfile::tempdir().unwrap(); + let root = temporary.path().join("Lab"); + package::unpack(files, &root).unwrap(); + let notebook = Notebook::open(&root, temporary.path().join("cache")).unwrap(); + let sections: Vec<&str> = (notebook.catalog().sections.iter()) + .map(|section| section.path.as_str()) + .collect(); + assert_eq!(sections, ["Alpha.one", "Beta.one"]); + let alpha = + notebook::session::stored_pages(¬ebook.read_section("Alpha.one").unwrap()).unwrap(); + let titles: Vec<&str> = alpha.iter().map(|page| page.page.title.as_str()).collect(); + assert_eq!(titles, ["Alpha one", "Alpha three"]); +} + +/// A package naming a file outside its folder, or unpacking past the limit, is refused. +#[test] +fn a_package_stays_in_its_folder() { + let section = onestore::create_empty_section("A.one", None).unwrap(); + for path in ["../A.one", "Group/../../A.one", "C:/A.one", ""] { + let packed = package::pack(vec![(path.to_owned(), section.clone())]).unwrap(); + assert!(package::read(&packed, 1 << 30).is_err(), "{path}"); + } + let packed = package::pack(vec![("A.one".to_owned(), section.clone())]).unwrap(); + assert!(package::read(&packed, 10).is_err()); +} + +/// Save As writes a section as a copy outside any notebook, and a page as a section of its +/// own holding it, as OneNote 2010 does. `NOTEBOOK_SAVE_AS_EXPORT` names a new directory +/// receiving both, for OneNote 2010 to open cold. +#[test] +fn save_as_writes_copies_outside_the_notebook() { + let temporary = tempfile::tempdir().unwrap(); + let notebook = notebook( + &temporary.path().join("Notebook"), + &temporary.path().join("cache"), + ); + let image = notebook.read_section("Group/Inner.one").unwrap(); + let copy = package::section_copy(image.clone()).unwrap(); + assert_ne!(header(©).file_id, header(&image).file_id); + assert_eq!(header(©).ancestor, [0; 16]); + assert_eq!( + notebook::session::stored_pages(©).unwrap()[0] + .page + .title, + "Inside" + ); + + let page = notebook::session::stored_pages(&image) + .unwrap() + .remove(0) + .page; + let saved = package::page_section(&page, "Inside.one", Some(0xe4a88a), "Author").unwrap(); + let pages = notebook::session::stored_pages(&saved).unwrap(); + assert_eq!(pages.len(), 1); + assert_eq!( + (pages[0].page.title.as_str(), pages[0].page.identity), + ("Inside", page.identity) + ); + assert_eq!(header(&saved).ancestor, [0; 16]); + if let Some(directory) = std::env::var_os("NOTEBOOK_SAVE_AS_EXPORT") { + let directory = Path::new(&directory); + std::fs::create_dir(directory).unwrap(); + std::fs::write(directory.join("Inner copy.one"), ©).unwrap(); + std::fs::write(directory.join("Inside.one"), &saved).unwrap(); + } +} + +/// Empty Recycle Bin deletes Deleted Pages' pages and every binned section's file, leaving the +/// bin's table of contents as it was, as OneNote 2010 does. +#[test] +fn emptying_the_recycle_bin_leaves_its_table_of_contents() { + let temporary = tempfile::tempdir().unwrap(); + let root = temporary.path().join("Notebook"); + let mut notebook = notebook(&root, &temporary.path().join("cache")); + let bin = root.join("OneNote_RecycleBin"); + let toc = std::fs::read(bin.join("Open Notebook.onetoc2")).unwrap(); + assert!(bin.join("Doomed.one").exists()); + notebook.empty_recycle_bin().unwrap(); + assert!(!bin.join("Doomed.one").exists()); + let deleted = std::fs::read(bin.join("OneNote_DeletedPages.one")).unwrap(); + assert!( + notebook::session::stored_pages(&deleted) + .unwrap() + .is_empty() + ); + assert_eq!( + std::fs::read(bin.join("Open Notebook.onetoc2")).unwrap(), + toc + ); + notebook.empty_recycle_bin().unwrap(); +} diff --git a/crates/notebook/tests/protected.rs b/crates/notebook/tests/protected.rs index 926222b59e1fe7bece32bb17de561b5a64cbd82a..feb4f6196ba8de50b34b28a03eda6ec9d2c5dc3e 100644 --- a/crates/notebook/tests/protected.rs +++ b/crates/notebook/tests/protected.rs @@ -1,133 +1,666 @@ -#![cfg(feature = "protected")] +//! Password-protected sections: unlocking, sealed queues, publishing, merging and conflict +//! pages, and setting, changing and removing a password. -use notebook::{discover::SectionState, session::Notebook}; +use notebook::{EditStatus, Replica, discover::SectionState, session::Notebook}; +use onestore::{ + Arena, ExGuid, Section, + op::{Edit, Op, PageOp}, + page::{Page, PageObject}, + protected::{Error, Key, rekey}, +}; use std::path::Path; -/// A locked section is discovered as such and reads with its password, page by page. -#[test] -fn a_locked_section_unlocks_for_reading() { - let root = Path::new(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../corpus/native-protected-boundaries" - )); +#[path = "support/server.rs"] +mod server; +use server::Server; + +fn fixture(name: &str) -> (std::path::PathBuf, String) { + let root = Path::new(concat!(env!("CARGO_MANIFEST_DIR"), "/../../corpus")).join(name); let manifest: serde_json::Value = serde_json::from_slice(&std::fs::read(root.join("manifest.json")).unwrap()).unwrap(); - let password = manifest["password"].as_str().unwrap(); - let temporary = tempfile::tempdir().unwrap(); - let notebook = Notebook::open(root.join("notebook"), temporary.path()).unwrap(); - let section = ¬ebook.catalog().sections[0]; - assert!(matches!(section.state, SectionState::Locked)); - let pages = notebook.unlock(§ion.path, password).unwrap().pages; - assert_eq!(pages.len(), 11); - assert!(pages.iter().all(|(_, page)| !page.title.is_empty())); - assert!(matches!( - notebook.unlock(§ion.path, "wrong"), - Err(notebook::Error::Protected( - onestore::protected::Error::PasswordMismatch - )) - )); + (root, manifest["password"].as_str().unwrap().to_owned()) } -/// An unlocked page is edited as ops stored under the section's key, then reads back with -/// the same password. `ONESTORE_PROTECTED_EXPORT` names a directory receiving the notebook for -/// a cold reopen in OneNote. -#[test] -fn an_unlocked_page_is_saved_under_the_section_key() { - use onestore::page::{PageObject, Paragraph, text::new_id}; - let root = Path::new(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../corpus/native-encrypted" - )); - let manifest: serde_json::Value = - serde_json::from_slice(&std::fs::read(root.join("manifest.json")).unwrap()).unwrap(); - let password = manifest["password"].as_str().unwrap(); - let temporary = tempfile::tempdir().unwrap(); - let copy = temporary.path().join("notebook"); - std::fs::create_dir(©).unwrap(); - for entry in std::fs::read_dir(root.join("encrypted-01/notebook")).unwrap() { +/// A copy of a notebook folder. +fn copy(from: &Path, to: &Path) { + std::fs::create_dir_all(to).unwrap(); + for entry in std::fs::read_dir(from).unwrap() { let entry = entry.unwrap(); - std::fs::copy(entry.path(), copy.join(entry.file_name())).unwrap(); + std::fs::copy(entry.path(), to.join(entry.file_name())).unwrap(); } - let notebook = Notebook::open(©, temporary.path().join("cache")).unwrap(); - let section = notebook - .catalog() - .sections +} + +/// A protected one-page section holding `text`, with its key. +fn protected(text: &str) -> (Vec, Key) { + let plain = onestore::create_section("sealed.one", text, "Fixture").unwrap(); + let key = Key::new("fixture password").unwrap(); + (rekey(&plain, None, Some(&key)).unwrap(), key) +} + +/// The first text object of `image` with its page. +fn first_text(image: &[u8], key: &Key) -> (ExGuid, ExGuid, String) { + let arena = Arena::default(); + let mut section = Section::unlock(&arena, image.to_vec(), key).unwrap(); + let (space, ..) = section.pages().unwrap()[0]; + let page = section.page(space).unwrap(); + texts(&page) + .into_iter() + .next() + .map(|(id, text)| (space, id, text)) + .unwrap() +} + +fn texts(page: &Page) -> Vec<(ExGuid, String)> { + page.objects .iter() - .find(|section| matches!(section.state, SectionState::Locked)) - .unwrap() - .path - .clone(); - let mut unlocked = notebook.unlock(§ion, password).unwrap(); - let (space, mut page) = unlocked.pages[0].clone(); - let before = page.clone(); - let paragraphs = page - .objects - .iter_mut() - .find_map(|object| match object { - PageObject::Outline(outline) if !outline.title => Some(&mut outline.paragraphs), + .filter_map(|object| match object { + PageObject::Outline(outline) => Some(&outline.paragraphs), _ => None, }) - .unwrap(); - let at = paragraphs.iter().position(|p| p.text().is_some()).unwrap(); - let mut added = paragraphs[at].clone(); - added.id = new_id().unwrap(); - added.style = None; - added.lists.clear(); - added.tags.clear(); - let text = added.text_mut().unwrap(); - text.id = new_id().unwrap(); - let format = text.text.format_at(0).unwrap().clone(); - text.text = Paragraph::new( - "Written while protected 🦀".to_owned(), - onestore::document::Format { - font: Some("Calibri".into()), - font_size: Some(11.0), - language: Some(1033), - ..Default::default() - }, - ); - paragraphs.insert(at + 1, added); - paragraphs[at] - .text_mut() - .unwrap() - .text - .append(Paragraph::new( - " and edited under its key".to_owned(), - format, - )) - .unwrap(); - let edit = onestore::op::Edit { + .flatten() + .filter_map(|paragraph| { + let text = paragraph.text()?; + Some((text.id, text.text.text().to_owned())) + }) + .collect() +} + +fn replace(space: ExGuid, text: ExGuid, range: std::ops::Range, with: &str) -> Edit { + Edit { at: 134_000_000_000_000_000, - ops: onestore::op::lower_page(&before, &page) - .unwrap() - .into_iter() - .map(|op| onestore::op::Op::Page { space, op }) - .collect(), + ops: vec![Op::Page { + space, + op: PageOp::Text { + text, + range, + with: with.into(), + }, + }], + } +} + +/// Whether any file of a replica holds `clear`, as UTF-8 or UTF-16. +fn leaks(replica: &Path, clear: &str) -> bool { + let utf16: Vec = clear.encode_utf16().flat_map(u16::to_le_bytes).collect(); + ["", "-wal", "-shm"].iter().any(|suffix| { + let mut file = replica.as_os_str().to_owned(); + file.push(suffix); + std::fs::read(file).is_ok_and(|bytes| { + [clear.as_bytes(), &utf16[..]] + .iter() + .any(|clear| bytes.windows(clear.len()).any(|w| w == *clear)) + }) + }) +} + +/// A locked section is discovered as such, unlocks with its password and opens as a session. +#[test] +fn a_locked_section_unlocks_into_a_session() { + let (root, password) = fixture("native-protected-boundaries"); + let temporary = tempfile::tempdir().unwrap(); + let folder = temporary.path().join("notebook"); + copy(&root.join("notebook"), &folder); + let notebook = Notebook::open(&folder, temporary.path().join("cache")).unwrap(); + let section = ¬ebook.catalog().sections[0]; + assert!(matches!(section.state, SectionState::Locked)); + assert!(matches!( + notebook.unlock(§ion.path, "wrong"), + Err(notebook::Error::Protected(Error::PasswordMismatch)) + )); + assert!(notebook.section(§ion.path, || {}).is_err()); + let key = notebook.unlock(§ion.path, &password).unwrap(); + let session = notebook + .section_unlocked(§ion.path, &key, || {}) + .unwrap(); + let pages = session.pages().unwrap(); + assert_eq!(pages.len(), 11); + assert!(pages.iter().all(|(_, title, _)| !title.is_empty())); + let title = &pages[0].1; + session.close().unwrap(); + // The replica holds the section as its file does: encrypted. + assert!(!leaks( + ¬ebook.replica_path(§ion.path).unwrap(), + title + )); +} + +/// Queued edits and their payloads are sealed in the replica, which opens again only under +/// the section's key, and publish into the file under it. +#[test] +fn queued_edits_are_sealed_and_publish_under_the_key() { + const SECRET: &str = "Queued in confidence"; + let (source, key) = protected("Opening line"); + let (space, text, _) = first_text(&source, &key); + let directory = tempfile::tempdir().unwrap(); + let path = directory.path().join("cache.sqlite"); + let cache = Replica::open_or_create(&path, Some(&key), || Ok(source.clone())).unwrap(); + cache + .apply("Fixture", replace(space, text, 0..0, SECRET)) + .unwrap(); + let mut page = cache.page(space).unwrap(); + let PageObject::Outline(outline) = page + .objects + .iter_mut() + .find(|object| matches!(object, PageObject::Outline(_))) + .unwrap() + else { + unreachable!() }; + let mut file = outline.paragraphs[0].clone(); + file.id = onestore::page::text::new_id().unwrap(); + file.content = onestore::page::ParagraphContent::Attachment(onestore::page::Attachment { + id: onestore::page::text::new_id().unwrap(), + filename: "sealed.txt".into(), + source_path: None, + size: Some([24.0, 24.0]), + layout: Default::default(), + bytes: Some(std::sync::Arc::from(SECRET.as_bytes())), + preview: None, + recording: None, + tags: Vec::new(), + }); + outline.paragraphs.push(file); + let before = cache.page(space).unwrap(); + let ops = onestore::op::lower_page(&before, &page).unwrap(); + cache + .apply( + "Fixture", + Edit { + at: 134_000_000_000_000_001, + ops: ops.into_iter().map(|op| Op::Page { space, op }).collect(), + }, + ) + .unwrap(); + drop(cache); + assert!(!leaks(&path, SECRET)); + assert!(Replica::open(&path).is_err()); + assert!( + Replica::open_or_create( + &path, + Some(&Key::new("another").unwrap()), + || unreachable!() + ) + .is_err() + ); + let cache = Replica::open_or_create(&path, Some(&key), || unreachable!()).unwrap(); + assert_eq!(cache.pending().unwrap().len(), 2); + let mut server = Server::new(&source); + assert!(matches!( + cache.sync_once(&mut server).unwrap().edit, + Some((_, EditStatus::Published { .. })) + )); + drop(cache); + assert!(!leaks(&path, SECRET)); + assert!( + !server + .durable + .windows(SECRET.len()) + .any(|w| w == SECRET.as_bytes()) + ); + let arena = Arena::default(); + let stored = Section::unlock(&arena, server.durable.clone(), &key).unwrap(); + let published = stored.page(space).unwrap(); + assert!(texts(&published)[0].1.starts_with(SECRET)); + assert!(format!("{published:?}").contains("sealed.txt")); + let archived = directory.path().join("recovery.sqlite"); + Replica::open_or_create(&path, Some(&key), || unreachable!()) + .unwrap() + .export_recovery(&archived) + .unwrap(); + assert!(!leaks(&archived, SECRET)); + assert!(notebook::Recovery::open(&archived).is_err()); + assert!(notebook::Recovery::open_unlocked(&archived, &key).is_ok()); +} + +/// Edits of the same text on two copies of a protected section merge as an ordinary +/// section's do: the remote's stays the page, the local one becomes a conflict page, and +/// every revision stays under the key. +#[test] +fn a_conflict_in_a_protected_section_becomes_a_conflict_page() { + let (source, key) = protected("alpha beta gamma"); + let (space, text, _) = first_text(&source, &key); + let directory = tempfile::tempdir().unwrap(); + let cache = Replica::open_or_create(directory.path().join("c.sqlite"), Some(&key), || { + Ok(source.clone()) + }) + .unwrap(); + cache + .apply("Local", replace(space, text, 6..10, "LOCAL")) + .unwrap(); + let remote = { + let arena = Arena::default(); + let mut section = Section::unlock(&arena, source.clone(), &key).unwrap(); + section + .apply("Remote", &replace(space, text, 6..10, "REMOTE")) + .unwrap(); + section.seal().unwrap(); + section.image() + }; + let mut server = Server::new(&remote); + assert!(matches!( + cache.sync_once(&mut server).unwrap().edit, + Some((_, EditStatus::Published { .. })) + )); + let arena = Arena::default(); + let mut merged = Section::unlock(&arena, server.durable.clone(), &key).unwrap(); + assert_eq!( + texts(&merged.page(space).unwrap())[0].1, + "alpha REMOTE gamma" + ); + let conflicts = merged.conflicts().unwrap(); + assert_eq!(conflicts.len(), 1); + let conflict = merged.page(conflicts[0].1[0].space).unwrap(); + assert_eq!(texts(&conflict)[0].1, "alpha LOCAL gamma"); + let store = onestore::Store::parse(&server.durable).unwrap(); + assert!( + onestore::RevisionIndex::parse(&store) + .unwrap() + .spaces + .values() + .flat_map(|space| space.revisions.values()) + .all(|revision| revision.encrypted) + ); +} + +/// Setting a password rewrites the section under new identities that its TOC follows and +/// drops the plaintext replica; changing and removing it rewrite it again. +#[test] +fn a_password_is_set_changed_and_removed_in_a_notebook() { + const TEXT: &str = "Kept through every password"; + let temporary = tempfile::tempdir().unwrap(); + let folder = temporary.path().join("notebook"); + let cache = temporary.path().join("cache"); + let creation = onestore::PageCreation::new(None, Some(TEXT), "Fixture").unwrap(); + let mut notebook = Notebook::create(&folder, &cache, 0x00f0_a0c0, &creation).unwrap(); + let path = notebook.catalog().sections[0].path.clone(); + let plain = notebook.replica_path(&path).unwrap(); + notebook.section(&path, || {}).unwrap().close().unwrap(); + assert!(plain.exists()); + let identity = notebook.catalog().sections[0].file_id; + + let first = notebook + .set_password(&path, None, Some("first")) + .unwrap() + .unwrap(); + assert!(!plain.exists()); + let section = ¬ebook.catalog().sections[0]; + assert!(matches!(section.state, SectionState::Locked)); + assert_ne!(section.file_id, identity); + assert!( + notebook + .catalog() + .toc + .as_ref() + .unwrap() + .unresolved + .is_empty() + ); + let image = notebook.read_section(&path).unwrap(); + let utf16: Vec = TEXT.encode_utf16().flat_map(u16::to_le_bytes).collect(); + assert!(!image.windows(utf16.len()).any(|w| w == utf16)); + let key = notebook.unlock(&path, "first").unwrap(); + assert_eq!(key.secret(), first.secret()); + let session = notebook.section_unlocked(&path, &key, || {}).unwrap(); + assert_eq!(session.pages().unwrap()[0].1, TEXT); + session.close().unwrap(); + assert!(!leaks(¬ebook.replica_path(&path).unwrap(), TEXT)); + + assert!(notebook.set_password(&path, None, Some("second")).is_err()); + let second = notebook + .set_password(&path, Some(&key), Some("second")) + .unwrap() + .unwrap(); + assert!(notebook.unlock(&path, "first").is_err()); + let session = notebook.section_unlocked(&path, &second, || {}).unwrap(); + assert_eq!(session.pages().unwrap()[0].1, TEXT); + session.close().unwrap(); + + assert!( + notebook + .set_password(&path, Some(&second), None) + .unwrap() + .is_none() + ); + let section = ¬ebook.catalog().sections[0]; + assert!(matches!(section.state, SectionState::Readable { .. })); + let session = notebook.section(&path, || {}).unwrap(); + assert_eq!(session.pages().unwrap()[0].1, TEXT); +} + +/// A section whose edits wait to be published keeps its password until they are. +#[test] +fn a_password_waits_for_queued_edits() { + let temporary = tempfile::tempdir().unwrap(); + let folder = temporary.path().join("notebook"); + let creation = onestore::PageCreation::new(None, Some("Waiting"), "Fixture").unwrap(); + let mut notebook = Notebook::create( + &folder, + temporary.path().join("cache"), + 0x00f0_a0c0, + &creation, + ) + .unwrap(); + let path = notebook.catalog().sections[0].path.clone(); + let session = notebook.section(&path, || {}).unwrap(); + session.set_offline(true); + let (space, ..) = session.pages().unwrap()[0].clone(); + let page = session.page(space).unwrap(); + let mut edited = page.clone(); + edited.title = "Waiting still".into(); + let ops = onestore::op::lower_page(&page, &edited).unwrap(); + session + .apply( + "Fixture", + Edit { + at: 134_000_000_000_000_000, + ops: ops.into_iter().map(|op| Op::Page { space, op }).collect(), + }, + ) + .unwrap(); + session.written().unwrap(); + session.close().unwrap(); + assert!(notebook.set_password(&path, None, Some("early")).is_err()); + assert!(matches!( + notebook.catalog().sections[0].state, + SectionState::Readable { .. } + )); +} + +/// A notebook `here` makes, also opened `there` as another device opens it, with its first +/// section's path and the page title it starts with. +fn two_devices(temporary: &Path, title: &str) -> (Notebook, Notebook, String) { + let folder = temporary.join("notebook"); + let creation = onestore::PageCreation::new(None, Some(title), "Fixture").unwrap(); + let here = Notebook::create(&folder, temporary.join("here"), 0x00f0_a0c0, &creation).unwrap(); + let path = here.catalog().sections[0].path.clone(); + let there = Notebook::open(&folder, temporary.join("there")).unwrap(); + (here, there, path) +} + +/// Another device's replica of a section, plaintext, holds none of it once the section is +/// protected here and that device reads the notebook again. +#[test] +fn a_replica_drops_its_plaintext_once_its_section_is_protected_elsewhere() { + const TITLE: &str = "Read on the other device"; + let temporary = tempfile::tempdir().unwrap(); + let (mut here, mut there, path) = two_devices(temporary.path(), TITLE); + there.section(&path, || {}).unwrap().close().unwrap(); + let replica = there.replica_path(&path).unwrap(); + assert!(leaks(&replica, TITLE)); + here.set_password(&path, None, Some("secret")).unwrap(); + there.refresh().unwrap(); + assert!(!leaks(&replica, TITLE)); + let again = Notebook::open( + temporary.path().join("notebook"), + temporary.path().join("there"), + ); assert!(matches!( - notebook.apply_unlocked(§ion, "wrong", &mut unlocked, "Rust", &edit), - Err(notebook::Error::Protected( - onestore::protected::Error::PasswordMismatch - )) + again.unwrap().catalog().sections[0].state, + SectionState::Locked )); - let mut stale = notebook.unlock(§ion, password).unwrap(); - notebook - .apply_unlocked(§ion, password, &mut unlocked, "Rust", &edit) + assert!(!leaks(&replica, TITLE)); +} + +/// An open section that another device protects stops synchronizing as protected, and its +/// plaintext goes once it closes. +#[test] +fn an_open_section_protected_elsewhere_stops_as_protected() { + const TITLE: &str = "Open while protected"; + let temporary = tempfile::tempdir().unwrap(); + let (mut here, mut there, path) = two_devices(temporary.path(), TITLE); + let session = there.section(&path, || {}).unwrap(); + let replica = there.replica_path(&path).unwrap(); + here.set_password(&path, None, Some("secret")).unwrap(); + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); + loop { + session.wake(); + let state = session.sync_status().unwrap().state(); + if state == notebook::session::SyncState::Protected { + break; + } + assert!(std::time::Instant::now() < deadline, "still {state:?}"); + std::thread::sleep(std::time::Duration::from_millis(50)); + } + session.close().unwrap(); + there.refresh().unwrap(); + assert!(!leaks(&replica, TITLE)); +} + +/// Edits another device queued before the section was protected wait in its replica until +/// that device unlocks the section, then publish under the key, the page they changed coming +/// back as a copy, as a page another client removed does; nothing stays in the clear. +#[test] +fn edits_queued_before_a_password_publish_under_it_once_unlocked() { + const TITLE: &str = "Protected meanwhile"; + const TYPED: &str = "Typed offline meanwhile"; + let temporary = tempfile::tempdir().unwrap(); + let (mut here, mut there, path) = two_devices(temporary.path(), TITLE); + let session = there.section(&path, || {}).unwrap(); + session.set_offline(true); + let (space, ..) = session.pages().unwrap()[0].clone(); + let page = session.page(space).unwrap(); + let Some(PageObject::Title(title)) = page.objects.first() else { + panic!("no title") + }; + let text = title.outlines[0].paragraphs[0].text().unwrap().id; + let end = TITLE.encode_utf16().count() as u32; + session + .apply("Fixture", replace(space, text, 0..end, TYPED)) .unwrap(); - // A view read before that edit no longer matches the file. + session.written().unwrap(); + session.close().unwrap(); + let held = there.replica_path(&path).unwrap(); + + here.set_password(&path, None, Some("secret")).unwrap(); + there.refresh().unwrap(); + assert_eq!(Replica::open(&held).unwrap().pending().unwrap().len(), 1); + + let key = there.unlock(&path, "secret").unwrap(); + assert!(!held.exists()); + let session = there.section_unlocked(&path, &key, || {}).unwrap(); + let titles: Vec = session + .pages() + .unwrap() + .into_iter() + .map(|(_, title, _)| title) + .collect(); + assert_eq!(titles, [TITLE, TYPED]); + published(&session); + session.close().unwrap(); + assert!(!leaks(&there.replica_path(&path).unwrap(), TYPED)); + let image = there.read_section(&path).unwrap(); + let utf16: Vec = TYPED.encode_utf16().flat_map(u16::to_le_bytes).collect(); + assert!(!image.windows(utf16.len()).any(|w| w == utf16)); + let stored = notebook::session::stored_pages_unlocked(&image, &key).unwrap(); + assert!(stored.iter().any(|page| page.page.title == TYPED)); +} + +/// Waits until `section` has published every edit. +fn published(section: ¬ebook::session::Section) { + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); + section.wake(); + while !section.pending().unwrap().is_empty() { + assert!( + std::time::Instant::now() < deadline, + "edits were not published" + ); + std::thread::sleep(std::time::Duration::from_millis(20)); + } +} + +/// Appends `text` to the first paragraph of every page of `section`. +fn append(section: ¬ebook::session::Section, text: &str) { + for (space, ..) in section.pages().unwrap() { + let page = section.page(space).unwrap(); + let Some((id, current)) = texts(&page).into_iter().next() else { + continue; + }; + let end = current.encode_utf16().count() as u32; + section + .apply("Snowbound Test", replace(space, id, end..end, text)) + .unwrap(); + } + section.written().unwrap(); +} + +/// The native gate's candidate: a notebook whose sections Snowbound protected, edited under +/// their keys, gave another password, unprotected, and merged into a conflict page, each +/// from OneNote 2010's pages. `ONESTORE_PROTECTED_EXPORT` names a new directory receiving it +/// and its passwords for a cold open in OneNote. +#[test] +fn a_notebook_protected_through_its_sessions() { + let source = std::fs::read(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../corpus/protected-sections/source/synthetic.one" + )) + .unwrap(); + let pages = notebook::session::stored_pages(&source).unwrap(); + let temporary = tempfile::tempdir().unwrap(); + let folder = temporary.path().join("notebook"); + let cache = temporary.path().join("cache"); + let creation = onestore::PageCreation::new(None, Some("Gate"), "Snowbound Test").unwrap(); + let mut notebook = Notebook::create(&folder, &cache, 0x00f0_a0c0, &creation).unwrap(); + let names = ["Protected", "Edited", "Changed", "Removed", "Conflicted"]; + for name in names { + let path = notebook.create_section("", name, &creation).unwrap(); + let section = notebook.section(&path, || {}).unwrap(); + for stored in &pages { + section.import_page(&stored.page, "Snowbound Test").unwrap(); + } + published(§ion); + section.close().unwrap(); + } + let path = |name: &str| format!("{name}.one"); + let mut passwords = serde_json::Map::new(); + let mut keys = std::collections::BTreeMap::new(); + for name in names { + let password = format!("{name} gate password"); + let key = notebook + .set_password(&path(name), None, Some(&password)) + .unwrap() + .unwrap(); + passwords.insert(path(name), password.into()); + keys.insert(name, key); + } + // Edited under its key: text on every page, published as dependent revisions. + let section = notebook + .section_unlocked(&path("Edited"), &keys["Edited"], || {}) + .unwrap(); + for round in ["first", "second", "third"] { + append(§ion, &format!(" Edited {round} under the key.")); + published(§ion); + } + section.close().unwrap(); + // Changed: another password. + let changed = notebook + .set_password( + &path("Changed"), + Some(&keys["Changed"]), + Some("Changed again"), + ) + .unwrap() + .unwrap(); + passwords.insert(path("Changed"), "Changed again".into()); + let section = notebook + .section_unlocked(&path("Changed"), &changed, || {}) + .unwrap(); + append(§ion, " Written under the changed password."); + published(§ion); + section.close().unwrap(); + // Removed: no password. + assert!( + notebook + .set_password(&path("Removed"), Some(&keys["Removed"]), None) + .unwrap() + .is_none() + ); + passwords.insert(path("Removed"), serde_json::Value::Null); + // Conflicted: two copies edit one paragraph offline; the second to publish keeps a + // conflict page. + let second = Notebook::open(&folder, temporary.path().join("second")).unwrap(); + let key = &keys["Conflicted"]; + let ours = notebook + .section_unlocked(&path("Conflicted"), key, || {}) + .unwrap(); + let theirs = second + .section_unlocked(&path("Conflicted"), key, || {}) + .unwrap(); + for (section, word) in [(&ours, " Ours offline."), (&theirs, " Theirs offline.")] { + section.set_offline(true); + append(section, word); + } + ours.set_offline(false); + published(&ours); + theirs.set_offline(false); + published(&theirs); + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); + while theirs.conflicts().unwrap().is_empty() { + assert!(std::time::Instant::now() < deadline, "no conflict page"); + std::thread::sleep(std::time::Duration::from_millis(20)); + } + published(&theirs); + ours.close().unwrap(); + theirs.close().unwrap(); + + let notebook = Notebook::open(&folder, temporary.path().join("check")).unwrap(); + for name in names { + let image = notebook.read_section(&path(name)).unwrap(); + let clear = |word: &str| { + let utf16: Vec = word.encode_utf16().flat_map(u16::to_le_bytes).collect(); + image.windows(utf16.len()).any(|w| w == utf16) + || image.windows(word.len()).any(|w| w == word.as_bytes()) + }; + for word in [ + "Edited first", + "Ours offline", + "Theirs offline", + "changed password", + ] { + assert!(!clear(word), "{name} holds {word} in the clear"); + } + assert_eq!(clear("positioned outline"), name == "Removed", "{name}"); + let state = ¬ebook + .catalog() + .sections + .iter() + .find(|section| section.path == path(name)) + .unwrap() + .state; + assert_eq!( + matches!(state, SectionState::Locked), + name != "Removed", + "{name}" + ); + } assert!( notebook - .apply_unlocked(§ion, password, &mut stale, "Rust", &edit) - .is_err() + .catalog() + .toc + .as_ref() + .unwrap() + .unresolved + .is_empty() ); - let (_, stored) = notebook.unlock(§ion, password).unwrap().pages.remove(0); - assert!(stored.objects == page.objects); + let key = notebook + .unlock(&path("Conflicted"), "Conflicted gate password") + .unwrap(); + let stored = Section::unlock( + &Arena::default(), + notebook.read_section(&path("Conflicted")).unwrap(), + &key, + ) + .unwrap() + .conflicts() + .unwrap(); + // Each page's first paragraph clashed, so each keeps a conflict page. + assert_eq!(stored.len(), 2); if let Some(export) = std::env::var_os("ONESTORE_PROTECTED_EXPORT") { let export = Path::new(&export); - std::fs::create_dir_all(export).unwrap(); - for entry in std::fs::read_dir(©).unwrap() { - let entry = entry.unwrap(); - std::fs::copy(entry.path(), export.join(entry.file_name())).unwrap(); - } + copy(&folder, &export.join("notebook")); + std::fs::write( + export.join("passwords.json"), + serde_json::to_vec_pretty(&passwords).unwrap(), + ) + .unwrap(); } } diff --git a/crates/notebook/tests/support/page_schedule.rs b/crates/notebook/tests/support/page_schedule.rs index 3fef6572686f99b94b5e8e0769fd47ddb5b8effe..d5226f90432e71a67bd44eb1382e0d62a7964ccb 100644 --- a/crates/notebook/tests/support/page_schedule.rs +++ b/crates/notebook/tests/support/page_schedule.rs @@ -5,12 +5,9 @@ use crate::{ use notebook::{Remote, Replica}; use onestore::{ CommitError, ExGuid, PageEdit, RevisionIndex, Stamp, Store, Transaction, - document::{Document, Format, Kind, Layout}, + document::{Document, Kind}, op::SectionOp, - page::{ - Outline, Page, PageObject, PageParagraph, Paragraph, ParagraphContent, TextObject, - text::new_id, - }, + page::{Page, PageObject}, }; use std::{io, sync::LazyLock}; @@ -54,50 +51,15 @@ fn pages(source: &[u8]) -> Vec<(ExGuid, ExGuid, u32)> { /// Adds a body outline holding one plain paragraph, returning its text identity. A page the /// section just created has no body text for `model_ops::insert_outline` to copy formatting from. pub fn body_outline(page: &mut Page, text: &str) -> ExGuid { - // The writer creates outline text with the store's default style; the model must state it. - let format = Format { - font: Some("Calibri".to_owned()), - font_size: Some(11.0), - language: Some(0x409), - ..Default::default() - }; - let content = TextObject { - id: new_id().unwrap(), - date_field: None, - text: Paragraph::new(text.into(), format), - tags: Vec::new(), - }; - let id = content.id; - let outline = Outline { - id: new_id().unwrap(), - title: false, - min_width: None, - layout: Layout { - x: Some(36.0), - y: Some(36.0), - ..Default::default() - }, - indents: Vec::new(), - paragraphs: vec![PageParagraph { - id: new_id().unwrap(), - parent: None, - level: 1, - style: None, - format: Default::default(), - content: ParagraphContent::Text(content), - lists: Vec::new(), - tags: Vec::new(), - media: Default::default(), - collapsed: false, - }], - unsupported: Vec::new(), - }; + let paragraph = ops::paragraph(text); + let id = paragraph.text().unwrap().id; let at = page .objects .iter() .position(|object| matches!(object, PageObject::Title(_))) .unwrap_or(page.objects.len()); - page.objects.insert(at, PageObject::Outline(outline)); + page.objects + .insert(at, ops::outline(36.0, 36.0, vec![paragraph])); id } diff --git a/crates/onestore/Cargo.toml b/crates/onestore/Cargo.toml index 2ed9a944a1fcb4fd27ef124559f00c92497c80a9..e0134c9a34ebc2834e8c1f6605f101f4c4131e45 100644 --- a/crates/onestore/Cargo.toml +++ b/crates/onestore/Cargo.toml @@ -4,9 +4,6 @@ version = "0.1.0" edition = "2024" publish = false -[features] -protected = ["dep:aes", "dep:cbc", "dep:roxmltree", "dep:sha1", "dep:subtle", "dep:zeroize"] - [dependencies] base64 = "0.22.1" bumpalo = "3.20.3" @@ -14,12 +11,12 @@ serde_json = "1.0.151" md5 = "0.8.1" getrandom = "0.4.3" serde = { version = "1.0.229", features = ["derive"] } -aes = { version = "0.9.3", features = ["zeroize"], optional = true } -cbc = { version = "0.2.1", features = ["zeroize"], optional = true } -roxmltree = { version = "0.21.1", optional = true } -sha1 = { version = "0.11.0", features = ["zeroize"], optional = true } -subtle = { version = "2.6.1", optional = true } -zeroize = { version = "1.9.0", optional = true } +aes = { version = "0.9.3", features = ["zeroize"] } +cbc = { version = "0.2.1", features = ["zeroize"] } +roxmltree = "0.21.1" +sha1 = { version = "0.11.0", features = ["zeroize"] } +subtle = "2.6.1" +zeroize = "1.9.0" [target.'cfg(target_os = "macos")'.dependencies] nix = { version = "0.31.3", default-features = false, features = ["fs"] } diff --git a/crates/onestore/README.md b/crates/onestore/README.md index 3f7f9b98c2c192cd879732ec221ccb7f1346db93..b96a852d7c890aaea1ccc22932ae849d06308221 100644 --- a/crates/onestore/README.md +++ b/crates/onestore/README.md @@ -47,7 +47,9 @@ harness also accepts `--client-profile release`. | `page::link::internal_link`, `page::link::parse_internal_link` | Build and read the `onenote:#…` URLs OneNote stores for links to sections, pages and paragraphs, by identity | | `page::Recording`, `page::MediaIndex`, `PageOp::Media` | An audio or video file's recording identity, kind and length, and a paragraph's link to a moment in recordings, as OneNote stores them; the page lists its recordings as they come and go | | `page::Page`, `page::Paragraph`, `page::Ink`, `page::Math` | Build an editable page model (title, outlines, paragraphs with coalesced text spans, tables, images, attachments in paragraphs or on the page, ink drawings and handwriting decoded to stroke polylines in page points with each point's pen pressure, a moved drawing offset by its position, a highlighter's raster operation, a drawn shape's kind and anchors) with stored identities; equations parse from their linear text and run data into a tree that renders the MathML OneNote exports; content outside the model is retained as `Unsupported` | -| `protected::UnlockedSection` (optional feature) | Own decoded buffers for explicit known-password inspection; clear those buffers on drop; derived document strings/exports remain caller-owned | +| `protected::Key`, `Section::unlock` | Open a password-protected section's key with its password (`Key::open`), or make one for a new password with OneNote 2010's encryption data (`Key::new`); keep the section open under it, decoding every object and payload, and seal edits under it as OneNote does (a fresh IV per object) | +| `protected::rekey` | Set, change or remove a section's password as OneNote 2010 does: the section written anew under fresh file, space and payload identities, each space keeping its labelled revisions as checkpoints | +| `protected::UnlockedSection` | A protected section's labelled revisions decoded into a `Document` for inspection and export, by password or `Key`; cleared on drop, while strings and exports made from it are the caller's | | `create_section` | Create one page containing one plain-text paragraph and an author, including Unicode | | `PageCreation`, `SectionOp::Create` | Add an empty top-level page and its section entry atomically, under identities the intent retains across retries | | `PageEdit`, `SectionOp::Pages` | Publish explicitly selected page moves and indentation changes together, preserving page content and historical revisions | @@ -55,6 +57,7 @@ harness also accepts `--client-profile release`. | `create_table_of_contents` | Create ordered section entries from filenames and file identities | | `TocEdit`, `edit_table_of_contents` | Add, rename, order and remove a table of contents' section and group entries, and colour the notebook, as one revision's `Transaction`; a section's colour is `SectionOp::Color` in its own metadata | | `place`, `place_file` | Name a file for its notebook as OneNote does on adoption (parent TOC identity and name CRC in the header), so OneNote keeps its identity, on any `CommitIo` or under the filesystem adapter | +| `place_image`, `reidentify` | The same on an image held whole, or outside any notebook; and a new file identity and version, as OneNote's Save As copies and Unpack Notebook give (`corpus/notebook-package`) | | `TextAttribute`, `PageOp::Format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs | | `PageOp::Style`, `PageOp::Restyle`, `op::restyle` | Give a paragraph a paragraph style (with its NextStyle, as OneNote 2010 writes its headings), or move every paragraph of a style to a new style object of the same name; style objects are read-only, and run or paragraph values equal to what the old style gave are cleared so they follow the new one. `op::restyle(page, sheet)` brings a page's named styles to a sheet of definitions, joining styles that share a name | | `OutlineEdit`, `PageOp::Outline` | Change ordinary outline position/width, the position of a file or ink drawing on the page, or a paragraph's saved expansion default, preserving identities and content | @@ -68,7 +71,8 @@ harness also accepts `--client-profile release`. | `op::predict` | The page an op leaves, as the section stores it and reading it back shows it | | `read_file` | Read a snapshot under whole-file exclusion | | `read_snapshot` | Read a validated snapshot through fresh positioned I/O while the caller excludes maintenance | -| `CommitIo`, `confirm`, `confirm_file` | Supply another storage backend with equivalent exclusion and ordered durability; check that a stamp still holds | +| `CommitIo`, `confirm`, `confirm_file`, `Stamp::check` | Supply another storage backend with equivalent exclusion and ordered durability; check that a stamp still holds | +| `supersede_file` | Put a file written anew (`protected::rekey`) in place of a section under the exclusion `commit_file` takes, while its stamp holds; on Windows the old file goes aside first, as OneNote's maintenance does | Edits enter a kept-open `Section` as ops and leave as one appended revision per changed space; only section and page creation, imports and opening files handle @@ -78,14 +82,12 @@ navigation titles update in the same transaction; unsupported fields, protected objects and split surrogate pairs are rejected before writing. Appended snapshots cap revision dependency depth at 512 while retaining historical revisions. TOC snapshots can remap encoded CompactIDs -without changing their resolved references. Password-protected -sections retain their encrypted structure and payloads. With the optional -`protected` feature, `protected::UnlockedSection` opens native OneNote 2010 -AES-128/CBC, SHA-1 password wrappers into a borrowed document view. Incorrect -passwords, unsupported protection profiles and work-limit failures remain distinct. -The source stays encrypted. `UnlockedSection::apply` applies page ops and seals them -under the section's key (fresh IV per object, payloads under the file IV); `Section` -rejects protected sections. +without changing their resolved references. A password-protected section opens with +`Section::unlock` under the `Key` its password opens, and every revision it seals names +the key (MS-ONESTORE 2.5.19 asks that of each revision; OneNote names it only in those +without a dependency, and reads both). `Section::open` refuses one. Incorrect +passwords, unsupported protection profiles and work-limit failures remain distinct +(`protected::Error`). `PageCreation::new` appends, or inserts before the first page space of an existing series. `Some("")` creates an empty title field; `None` omits the title node. `dated(date, time)` gives the title OneNote 2010's date and time fields showing that @@ -331,34 +333,44 @@ a dedicated loopback test session; its control JSON selects the successful respo and occurrence to withhold. The captured trace and result files are the regression oracle; replaying the native experiments requires the supplied Windows/share setup. -## Protected inspection +## Password-protected sections + +OneNote 2010 wraps an AES-128 key in Office's Agile password encryption (MS-OFFCRYPTO: +SHA-1 of a 16-byte salt and the UTF-16LE password, then 100,000 rounds of SHA-1 over the +round number and the hash; three block keys decrypt, with the salt as IV, the verifier +input, its SHA-1 zero-padded to 32 bytes, and the key). The XML sits after the words +`3, length, 16, length - 16` and the version `4.4` with flags `0x40`, inside the +encryption-data container every revision names. Each property object is stored as its +reference streams, a length, a random IV and the CBC encryption of a padding count, the +property bytes and random padding; read-only objects hash the clear bytes zero-padded to +8 bytes. Payloads are their length and bytes, randomly padded, under CBC with the IV +SHA-1(key data salt, block 0). Setting, changing or removing a password writes the section +anew, as OneNote does, under fresh identities so that no cache confuses the old file's +objects or payloads with the new ones (`corpus/protected-sections`). ```rust,no_run -# #[cfg(feature = "protected")] -# fn example() { -use onestore::{RevisionIndex, Store, protected::{Limits, UnlockedSection}}; -# fn inspect(bytes: &[u8], password: &str) -> Result<(), Box> { -let store = Store::parse(bytes)?; -let index = RevisionIndex::parse(&store)?; -let unlocked = UnlockedSection::open(&index, password, Limits::default())?; -let document = unlocked.document()?; -assert!(!document.pages()?.is_empty()); -drop(document); -drop(unlocked); +use onestore::{Arena, Section, protected::{Key, rekey}}; +# fn example(image: Vec, password: &str) -> Result<(), Box> { +let key = Key::open(&image, password)?; +let arena = Arena::default(); +let mut section = Section::unlock(&arena, image.clone(), &key)?; +assert!(!section.pages()?.is_empty()); +let changed = rekey(&image, Some(&key), Some(&Key::new("another password")?))?; +# drop(changed); # Ok(()) } -# } ``` -This example requires `features = ["protected"]`. The owner retains no password; -its derived key is cleared on drop. Its source-buffer views cannot outlive it; copies of parsed -strings, serialized models and exports have their own lifetimes. These copies are -plaintext, and dropping the unlock owner does not clear them. CBC has no general +A `Key` holds no password; its key is cleared when its last clone drops. A `Section` +decodes into its `Arena`, which is not cleared; drop both when the section locks. +`UnlockedSection` owns its decoded buffers and clears them on drop; the views it lends +cannot outlive it, while copies of parsed strings, serialized models and exports are +plaintext with lifetimes of their own. CBC has no general ciphertext-authentication guarantee; native read-only hashes and model validation check the corresponding structure. Internal payloads are decoded; external payload references remain references, and their protected decoding is not implemented. -For a deliberate plaintext diagnostic export, build the notebook exporter with -`--features protected` and pass `--password-file PATH` after the source and optional +For a deliberate plaintext diagnostic export, run the notebook exporter +(`examples/document`) with `--password-file PATH` after the source and optional new output directory. The file contains exact UTF-8 password bytes; no newline is removed or Unicode normalization applied. The exporter creates protected exports under an owner-only directory on Unix and reports protected external payloads as diff --git a/crates/onestore/examples/scratch_dump.rs b/crates/onestore/examples/scratch_dump.rs deleted file mode 100644 index cfe266dde6fec24fc8582ab552d823e8306dd21b..0000000000000000000000000000000000000000 --- a/crates/onestore/examples/scratch_dump.rs +++ /dev/null @@ -1,53 +0,0 @@ -use onestore::{ObjectData, PropertySets, RevisionIndex, Store, Value}; -use std::{env, fs}; - -fn main() -> Result<(), Box> { - let want: Vec = env::var("IDS") - .unwrap_or_default() - .split(',') - .filter(|s| !s.is_empty()) - .map(|s| u32::from_str_radix(s.trim_start_matches("0x"), 16).unwrap()) - .collect(); - for path in env::args_os().skip(1) { - let bytes = fs::read(&path)?; - let store = Store::parse(&bytes)?; - let index = RevisionIndex::parse(&store)?; - println!("== {path:?}"); - for space in index.spaces.keys() { - let Ok(resolved) = index.resolve_active(*space) else { continue }; - for (id, object) in &resolved.objects { - let ObjectData::Properties(data) = object.data else { continue }; - let sets = PropertySets::parse(data)?; - let root = &sets.sets[0]; - if !want.is_empty() && !root.iter().any(|p| want.contains(&p.id)) { - continue; - } - if env::var("LINE").is_ok() { - let get = |want: u32| root.iter().find(|p| p.id == want).and_then(|p| match p.value { Value::Bytes(b) => Some(b), _ => None }); - let text = get(0x1c003498).map(|b| String::from_utf8_lossy(b).into_owned()).or_else(|| get(0x1c001c22).map(|b| String::from_utf16_lossy(&b.chunks_exact(2).map(|c| u16::from_le_bytes([c[0], c[1]])).collect::>()))).unwrap_or_default(); - let ids: Vec = root.iter().map(|p| format!("{:x}", p.id)).collect(); - println!("{:#x} cc8={:02x?} media={} text={text:?} ids={}", object.jcid, get(0x1c001cc8), get(0x1c001c98).is_some(), ids.join(",")); - continue; - } - println!("{space:?} {id:?} jcid {:#x}", object.jcid); - for p in root { - match p.value { - Value::Bytes(b) => { - let text = if p.id == 0x1c001c22 { - String::from_utf16_lossy(&b.chunks_exact(2).map(|c| u16::from_le_bytes([c[0], c[1]])).collect::>()) - } else if p.id == 0x1c003498 { - String::from_utf8_lossy(b).into_owned() - } else { - String::new() - }; - println!(" {:#010x} {:02x?} {text}", p.id, &b[..b.len().min(48)]) - } - Value::NoData => println!(" {:#010x} -", p.id), - ref v => println!(" {:#010x} {v:?}", p.id), - } - } - } - } - } - Ok(()) -} diff --git a/crates/onestore/src/active.rs b/crates/onestore/src/active.rs index ccbce21a1520e6287d455d74c35eb3a2fc51d207..4413eedcf249dab2661cc25e2adb01c9b67ebc7c 100644 --- a/crates/onestore/src/active.rs +++ b/crates/onestore/src/active.rs @@ -4,11 +4,7 @@ use crate::{ write::{Commit, LiveRevision, PropertyObject, declared, differing}, }; #[cfg(test)] -use crate::{ - RevisionIndex, Store, - document::{Document, Space}, - write::chain_depth, -}; +use crate::{RevisionIndex, Store, document::Document, write::chain_depth}; use bumpalo::Bump; use std::{ collections::{BTreeMap, BTreeSet}, @@ -50,7 +46,10 @@ impl<'a> ActivePage<'a> { let view = document .spaces .remove(&space) - .and_then(Space::into_active) + .and_then(|mut space| { + let active = *space.contexts.get(&ExGuid::default())?; + space.revisions.remove(&active) + }) .ok_or(Error { offset: 0, message: "The active page is unavailable", diff --git a/crates/onestore/src/commit.rs b/crates/onestore/src/commit.rs index f01ce266633b9b0a75448f71244e369ae270c0b7..a1c8544768ef2008adc12a79c6ade2487beb5d34 100644 --- a/crates/onestore/src/commit.rs +++ b/crates/onestore/src/commit.rs @@ -65,9 +65,17 @@ impl FileIo { } })?); #[cfg(unix)] - let file = options.open(path)?; + let file = options.open(path.as_ref())?; #[cfg(all(unix, not(target_os = "macos")))] - file.try_lock()?; + { + use std::os::unix::fs::MetadataExt; + file.try_lock()?; + // Locked after it was opened, the file may since have been superseded. + let (open, named) = (file.metadata()?, std::fs::metadata(path)?); + if (open.dev(), open.ino()) != (named.dev(), named.ino()) { + return Err(ErrorKind::ResourceBusy.into()); + } + } Ok(Self { #[cfg(windows)] locks: onenote_locks(&file, write)?, @@ -255,6 +263,45 @@ pub fn confirm_file(path: impl AsRef, base: &Stamp) -> Result<(), CommitEr io.finish(result) } +/// Puts the file at `with` in the place of the file at `path`, provided `path` still has +/// `base`'s stamp, under the exclusion `commit_file` takes: the whole-image write OneNote 2010 +/// makes when it writes a section anew. +#[cfg(any(unix, windows))] +pub fn supersede_file( + path: impl AsRef, + base: &Stamp, + with: impl AsRef, +) -> Result<(), CommitError> { + let (path, with) = (path.as_ref(), with.as_ref()); + let failed = |state| move |error| CommitError { state, error }; + // Windows renames nothing over an open file, so there the old file goes aside first and is + // deleted once released, as OneNote's maintenance does. + let mut aside = path.as_os_str().to_owned(); + if cfg!(windows) { + aside.push(".old"); + } + let aside = std::path::PathBuf::from(aside); + let mut io = FileIo::open(path, true).map_err(failed(CommitState::NotCommitted))?; + let result = base + .check(&mut io) + .and_then(|()| std::fs::rename(path, &aside)) + .map_err(failed(CommitState::NotCommitted)) + .and_then(|()| { + std::fs::rename(with, path).map_err(|error| CommitError { + state: match std::fs::rename(&aside, path) { + Ok(()) => CommitState::NotCommitted, + Err(_) => CommitState::Unknown, + }, + error, + }) + }); + io.finish(result)?; + if aside != path { + std::fs::remove_file(aside).map_err(failed(CommitState::Committed))?; + } + Ok(()) +} + /// Checks that the file still has `base`'s stamp and flushes it, then refreshes its header /// version metadata. No revision is added; reread before committing on `base` again. /// The caller must hold OneNote-compatible exclusion and independently establish which @@ -357,8 +404,10 @@ impl Stamp { }) } - /// Reads the header and probes the length, without reading the body. - fn check(&self, io: &mut impl CommitIo) -> io::Result<()> { + /// Checks that the file `io` reads still has this stamp, reading its header and probing its + /// length without reading the body; `ResourceBusy` when it moved on. The caller holds + /// OneNote-compatible exclusion for whatever the check guards. + pub fn check(&self, io: &mut impl CommitIo) -> io::Result<()> { let mut header = [0; 1024]; crate::snapshot::read_exact( &mut |offset, output| io.read_at(offset, output), diff --git a/crates/onestore/src/create.rs b/crates/onestore/src/create.rs index 82ef2506ebdf24894c74acb4557fcfaa3a7de74f..cb60c5d436039370866608c35da7b4ece4a9b992 100644 --- a/crates/onestore/src/create.rs +++ b/crates/onestore/src/create.rs @@ -615,6 +615,30 @@ fn create(file_name: &str, file_type: FileType, spaces: Vec) -> Result } else { None }; + finish( + &mut output, + file_type, + log, + hashed_chunk, + root_chunk, + placement([0; 16], file_name), + )?; + let store = Store::parse(&output)?; + RevisionIndex::parse(&store)?.validate_current()?; + Ok(output) +} + +/// Ends an image whose lists `output` holds: the transaction log committing `log`'s +/// entries, then the header naming it, the root list and the hashed-chunk list. +fn finish( + output: &mut Vec, + file_type: FileType, + mut log: Vec, + hashed: Option, + root: Chunk, + placement: [u8; 20], +) -> Result<()> { + let is_section = file_type == FileType::Section; let checksum = if is_section { !crc(u32::MAX, &log, file_type) } else { @@ -624,7 +648,7 @@ fn create(file_name: &str, file_type: FileType, spaces: Vec) -> Result log.extend_from_slice(&checksum.to_le_bytes()); log.extend_from_slice(&u64::MAX.to_le_bytes()); log.extend_from_slice(&0_u32.to_le_bytes()); - let log_chunk = append(&mut output, &log)?; + let log_chunk = append(output, &log)?; output[..16].copy_from_slice(&[ 0xe4, 0x52, 0x5c, 0x7b, 0x8c, 0xd8, 0xa7, 0x4d, 0xae, 0xb1, 0x53, 0x78, 0xd0, 0x29, 0x96, 0xd3, @@ -648,11 +672,11 @@ fn create(file_name: &str, file_type: FileType, spaces: Vec) -> Result output[at..at + 4].copy_from_slice(&u32::MAX.to_le_bytes()); } output[96..100].copy_from_slice(&1_u32.to_le_bytes()); - output[128..148].copy_from_slice(&placement([0; 16], file_name)); - for (at, chunk) in hashed_chunk + output[128..148].copy_from_slice(&placement); + for (at, chunk) in hashed .map(|chunk| (148, chunk)) .into_iter() - .chain([(160, log_chunk), (172, root_chunk)]) + .chain([(160, log_chunk), (172, root)]) { output[at..at + 8].copy_from_slice(&chunk.offset.to_le_bytes()); output[at + 8..at + 12].copy_from_slice(&(chunk.length as u32).to_le_bytes()); @@ -662,8 +686,34 @@ fn create(file_name: &str, file_type: FileType, spaces: Vec) -> Result output[212..228].copy_from_slice(&fresh_guid()?); output[228..236].copy_from_slice(&1_u64.to_le_bytes()); output[236..252].copy_from_slice(&fresh_guid()?); - let store = Store::parse(&output)?; - RevisionIndex::parse(&store)?.validate_current()?; + Ok(()) +} + +/// A new section file declaring only its root object space `root`, which has no revision +/// yet, placed as `placement`: what a whole section's revisions are appended to. +pub(crate) fn skeleton(root: ExGuid, placement: [u8; 20]) -> Result> { + let mut output = vec![0; 1024]; + let mut payload = Vec::new(); + root.encode(&mut payload); + let mut start = payload.clone(); + start.extend_from_slice(&0_u32.to_le_bytes()); + let manifest = append_list(&mut output, 16, &[node(0x14, None, &start)?])?; + let space = [ + node(0xc, None, &payload)?, + node(0x10, Some(Reference::NodeList(manifest)), &[])?, + ]; + let space = append_list(&mut output, 17, &space)?; + let roots = [ + node(8, Some(Reference::NodeList(space)), &payload)?, + node(4, None, &payload)?, + ]; + let roots = append_list(&mut output, 18, &roots)?; + let mut log = Vec::new(); + for (id, count) in [(16_u32, 1_u32), (17, 2), (18, 2)] { + log.extend_from_slice(&id.to_le_bytes()); + log.extend_from_slice(&count.to_le_bytes()); + } + finish(&mut output, FileType::Section, log, None, roots, placement)?; Ok(output) } diff --git a/crates/onestore/src/document.rs b/crates/onestore/src/document.rs index 1df66edf660b164bbbe1964d4813b3e76c8f55e8..e49c25558d71f3c1663d866cf945caecef75de41 100644 --- a/crates/onestore/src/document.rs +++ b/crates/onestore/src/document.rs @@ -39,11 +39,6 @@ impl<'a> Space<'a> { pub fn active(&self) -> Option<&Revision<'a>> { self.revisions.get(self.contexts.get(&ExGuid::default())?) } - - pub fn into_active(mut self) -> Option> { - self.revisions - .remove(self.contexts.get(&ExGuid::default())?) - } } #[derive(Debug, Clone, Serialize)] diff --git a/crates/onestore/src/identity.rs b/crates/onestore/src/identity.rs new file mode 100644 index 0000000000000000000000000000000000000000..69efe9245e07b87a98fa59545ca65cb58e9745f5 --- /dev/null +++ b/crates/onestore/src/identity.rs @@ -0,0 +1,54 @@ +//! A file's identity and place, rewritten in an image held whole: OneNote 2010 saves a +//! section as a copy, and writes a package's files, outside any notebook, and gives each +//! file it unpacks an identity of its own (`corpus/notebook-package`). + +use crate::{Error, Header, create::placement, write::fresh_guid}; + +type Result = std::result::Result; + +/// Gives the file `image` holds a new `guidFile` and version (`guidFileVersion`, +/// `nFileVersionGeneration`, `guidDenyReadFileVersion`), returning the identity. +pub fn reidentify(image: &mut [u8]) -> Result<[u8; 16]> { + let header = Header::parse(image)?; + let identity = fresh_guid()?; + let generation = header.generation.checked_add(1).ok_or(Error { + offset: 228, + message: "File generation counter is exhausted", + })?; + image[16..32].copy_from_slice(&identity); + image[212..228].copy_from_slice(&fresh_guid()?); + image[228..236].copy_from_slice(&generation.to_le_bytes()); + image[236..252].copy_from_slice(&fresh_guid()?); + Ok(identity) +} + +/// Places the file `image` holds as `place` does a file on disk; without `at`, outside any +/// notebook, its `guidAncestor` and `crcName` zero. +pub fn place_image(image: &mut [u8], at: Option<([u8; 16], &str)>) -> Result<()> { + Header::parse(image)?; + image[128..148] + .copy_from_slice(&at.map_or([0; 20], |(ancestor, name)| placement(ancestor, name))); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_file_takes_a_new_identity_and_leaves_its_notebook() { + let mut image = crate::create_empty_section("A.one", None).unwrap(); + let before = Header::parse(&image).unwrap(); + place_image(&mut image, Some(([7; 16], "A.one"))).unwrap(); + assert_eq!(Header::parse(&image).unwrap().ancestor, [7; 16]); + let identity = reidentify(&mut image).unwrap(); + place_image(&mut image, None).unwrap(); + let after = Header::parse(&image).unwrap(); + assert_eq!(after.file_id, identity); + assert_ne!(after.file_id, before.file_id); + assert_ne!(after.version_id, before.version_id); + assert_eq!(after.generation, before.generation + 1); + assert_eq!((after.ancestor, after.name_crc), ([0; 16], 0)); + crate::Store::parse(&image).unwrap(); + } +} diff --git a/crates/onestore/src/lib.rs b/crates/onestore/src/lib.rs index d0a66ab0c5d0ea0d17dc754bfc1494f6858eeca5..3c63bd1870901eb7d0376719601b8991d0bf202c 100644 --- a/crates/onestore/src/lib.rs +++ b/crates/onestore/src/lib.rs @@ -10,6 +10,7 @@ mod edit; mod files; mod flush; mod formatting; +mod identity; mod insertion; mod objects; pub mod op; @@ -18,7 +19,6 @@ pub mod page; mod pages; mod paragraph; mod properties; -#[cfg(feature = "protected")] pub mod protected; mod revisions; mod section; @@ -33,10 +33,11 @@ mod write; pub use commit::{CommitError, CommitIo, CommitState, Stamp, Transaction, confirm, place}; #[cfg(any(unix, windows))] -pub use commit::{confirm_file, place_file, read_file, read_file_limited}; +pub use commit::{confirm_file, place_file, read_file, read_file_limited, supersede_file}; pub use create::{create_empty_section, create_section, create_table_of_contents}; pub use files::FileDataReference; pub use formatting::{FONT_SIZES, TextAttribute}; +pub use identity::{place_image, reidentify}; pub(crate) use insertion::Insertion; pub use objects::{Object, ObjectData, ObjectReferences, ResolvedRevision}; pub use outline::OutlineEdit; diff --git a/crates/onestore/src/objects.rs b/crates/onestore/src/objects.rs index 67f4d47fc5e9ed525d42998e30642101eb15ee4c..c031fbfbfbae80b43f9e99f5369f2d55b41eef96 100644 --- a/crates/onestore/src/objects.rs +++ b/crates/onestore/src/objects.rs @@ -190,11 +190,20 @@ impl<'a> Cursor<'a> { impl<'a> RevisionIndex<'a> { pub fn validate_current(&self) -> Result<()> { + self.validate_with(|space, rid| self.resolve(space, rid)) + } + + /// `validate_current`, each revision read through `resolve`, as a protected section's + /// decoded. + pub(crate) fn validate_with<'r>( + &self, + resolve: impl Fn(ExGuid, ExGuid) -> Result>, + ) -> Result<()> { let mut edges = BTreeMap::new(); let mut incoming = BTreeMap::<_, usize>::new(); for (osid, space) in &self.spaces { for rid in space.labels.values().copied().collect::>() { - let revision = self.resolve(*osid, rid)?; + let revision = resolve(*osid, rid)?; let mut targets = BTreeSet::new(); for oid in revision.reachable()? { let references = revision.objects[&oid].references()?; diff --git a/crates/onestore/src/op/content.rs b/crates/onestore/src/op/content.rs index c6d8bd2f322691db477ce155192fdf0a80545eba..66beee779032e6a1b64b079418aed314bf53e869 100644 --- a/crates/onestore/src/op/content.rs +++ b/crates/onestore/src/op/content.rs @@ -16,7 +16,7 @@ fn invalid(message: &'static str) -> Error { } /// The `{GUID}` form a file-data declaration uses to name a payload in the file-data store. -fn payload_reference(guid: [u8; 16]) -> String { +pub(crate) fn payload_reference(guid: [u8; 16]) -> String { let id = ExGuid { guid, n: 0 }.to_string(); format!("{}", id.split(',').next().unwrap()) } diff --git a/crates/onestore/src/op/lower.rs b/crates/onestore/src/op/lower.rs index 7f6f5638c06495ef977aebd2380b4fa496af92a9..9be09d99c47e29467816e25799fc71d1b9e985ef 100644 --- a/crates/onestore/src/op/lower.rs +++ b/crates/onestore/src/op/lower.rs @@ -44,6 +44,7 @@ pub fn lower( identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects: vec![PageObject::Outline(Outline { diff --git a/crates/onestore/src/page/mod.rs b/crates/onestore/src/page/mod.rs index 5f96483457a6c5701258e20b1a6a61ab3a5de5b0..f8e0afa3d96195589ddda9de739ac154280c6316 100644 --- a/crates/onestore/src/page/mod.rs +++ b/crates/onestore/src/page/mod.rs @@ -159,6 +159,9 @@ pub struct Page { /// FILETIME ticks from the page's TopologyCreationTimeStamp. pub created: Option, pub margin_origin: [f32; 2], + /// Right-to-left page direction, whose positions keep the left-to-right frame. + #[serde(default)] + pub rtl: bool, /// The page's colour (View, Page Color), COLORREF; `None` is OneNote's "No color". #[serde(default)] pub color: Option, @@ -814,6 +817,7 @@ impl Page { let Kind::Page { margin_origin_x, margin_origin_y, + rtl, .. } = &root.kind else { @@ -845,6 +849,7 @@ impl Page { margin_origin_x.unwrap_or(1.0_f32 * 36.0), margin_origin_y.unwrap_or(0.4_f32 * 36.0), ], + rtl: rtl.unwrap_or(false), color: root .extra .first() diff --git a/crates/onestore/src/protected/crypto.rs b/crates/onestore/src/protected/crypto.rs index fa5863eab5211ac43249755892eac6b2997890b1..6f23363ca18c9138cef190684fc6828a6bc0486a 100644 --- a/crates/onestore/src/protected/crypto.rs +++ b/crates/onestore/src/protected/crypto.rs @@ -89,6 +89,48 @@ fn encrypt(key: &[u8; 16], iv: &[u8; 16], bytes: &mut [u8]) { .expect("block aligned"); } +/// Password-hash rounds OneNote 2010 writes. +const SPINS: u32 = 100_000; +/// MS-OFFCRYPTO's block keys for the verifier input, its hash and the wrapped key. +const VERIFIER_INPUT: [u8; 8] = [0xfe, 0xa7, 0xd2, 0x76, 0x3b, 0x4b, 0x9e, 0x79]; +const VERIFIER_VALUE: [u8; 8] = [0xd7, 0xaa, 0x0f, 0x6d, 0x30, 0x61, 0x34, 0x4e]; +const KEY_VALUE: [u8; 8] = [0x14, 0x6e, 0x0b, 0xe7, 0xab, 0xac, 0xd0, 0xd6]; + +/// The iterated password hash: SHA-1 of salt and UTF-16LE password, then `count` rounds of +/// SHA-1 over the round number and the previous hash. +fn seed(salt: &[u8; 16], password: &str, count: u32) -> Zeroizing<[u8; 20]> { + let mut hash = Sha1::new(); + hash.update(salt); + for word in password.encode_utf16() { + hash.update(word.to_le_bytes()); + } + let mut seed = Zeroizing::new(<[u8; 20]>::from(hash.finalize())); + for index in 0..count { + let mut hash = Sha1::new(); + hash.update(index.to_le_bytes()); + hash.update(seed.as_ref()); + *seed = hash.finalize().into(); + } + seed +} + +/// The AES key a block key derives from the password hash. +fn block(seed: &[u8; 20], label: [u8; 8]) -> Zeroizing<[u8; 16]> { + let mut hash = Sha1::new(); + hash.update(seed); + hash.update(label); + let derived = Zeroizing::new(<[u8; 20]>::from(hash.finalize())); + Zeroizing::new(derived[..16].try_into().unwrap()) +} + +/// The IV of payloads: SHA-1 of the key data's salt and block 0. +fn file_iv(salt: &[u8; 16]) -> [u8; 16] { + let mut hash = Sha1::new(); + hash.update(salt); + hash.update(0_u32.to_le_bytes()); + hash.finalize()[..16].try_into().unwrap() +} + impl Key { pub(super) fn open(data: &[u8], password: &str, rounds: &mut u64) -> Result { if data.len() > 65536 || password.len() > 65536 { @@ -146,47 +188,83 @@ impl Key { let mut verifier = Zeroizing::new(decoded::<16>(wrapped, "encryptedVerifierHashInput")?); let mut expected = Zeroizing::new(decoded::<32>(wrapped, "encryptedVerifierHashValue")?); let mut value = Zeroizing::new(decoded::<16>(wrapped, "encryptedKeyValue")?); - let mut hash = Sha1::new(); - hash.update(salt); - for word in password.encode_utf16() { - hash.update(word.to_le_bytes()); - } - let mut seed = Zeroizing::new(<[u8; 20]>::from(hash.finalize())); - for index in 0..count { - let mut hash = Sha1::new(); - hash.update(index.to_le_bytes()); - hash.update(seed.as_ref()); - *seed = hash.finalize().into(); - } + let seed = seed(&salt, password, count); for (label, bytes) in [ - ( - [0xfe, 0xa7, 0xd2, 0x76, 0x3b, 0x4b, 0x9e, 0x79], - verifier.as_mut_slice(), - ), - ( - [0xd7, 0xaa, 0x0f, 0x6d, 0x30, 0x61, 0x34, 0x4e], - expected.as_mut_slice(), - ), - ( - [0x14, 0x6e, 0x0b, 0xe7, 0xab, 0xac, 0xd0, 0xd6], - value.as_mut_slice(), - ), + (VERIFIER_INPUT, verifier.as_mut_slice()), + (VERIFIER_VALUE, expected.as_mut_slice()), + (KEY_VALUE, value.as_mut_slice()), ] { - let mut hash = Sha1::new(); - hash.update(seed.as_ref()); - hash.update(label); - let derived = Zeroizing::new(<[u8; 20]>::from(hash.finalize())); - decrypt(derived[..16].try_into().unwrap(), &salt, bytes)?; + decrypt(&block(&seed, label), &salt, bytes)?; } let actual = Zeroizing::new(<[u8; 20]>::from(Sha1::digest(verifier.as_slice()))); if !bool::from(actual.as_slice().ct_eq(&expected[..20])) { return Err(Error::PasswordMismatch); } - let mut hash = Sha1::new(); - hash.update(decoded::<16>(data_key, "saltValue")?); - hash.update(0_u32.to_le_bytes()); - let file_iv = hash.finalize()[..16].try_into().unwrap(); - Ok(Self { value, file_iv }) + Ok(Self { + value, + file_iv: file_iv(&decoded::<16>(data_key, "saltValue")?), + }) + } + + /// A fresh key for `password` and the encryption data that opens it, as OneNote 2010 + /// writes them: random salts, key and verifier, 100,000 SHA-1 rounds, no integrity block. + pub(super) fn create(password: &str) -> Result<(Self, Vec)> { + if password.len() > 65536 { + return Err(Error::Limit); + } + let random = |bytes: &mut [u8]| { + getrandom::fill(bytes).map_err(|_| invalid("System random source failed")) + }; + let (mut data_salt, mut salt) = ([0; 16], [0; 16]); + let mut value = Zeroizing::new([0; 16]); + let mut verifier = Zeroizing::new([0; 16]); + random(&mut data_salt)?; + random(&mut salt)?; + random(value.as_mut_slice())?; + random(verifier.as_mut_slice())?; + let seed = seed(&salt, password, SPINS); + let mut hash = Zeroizing::new([0; 32]); + hash[..20].copy_from_slice(&Sha1::digest(verifier.as_slice())); + let mut wrapped_value = *value; + let mut wrapped_verifier = *verifier; + let mut wrapped_hash = *hash; + encrypt(&block(&seed, VERIFIER_INPUT), &salt, &mut wrapped_verifier); + encrypt(&block(&seed, VERIFIER_VALUE), &salt, &mut wrapped_hash); + encrypt(&block(&seed, KEY_VALUE), &salt, &mut wrapped_value); + let profile = r#"saltSize="16" blockSize="16" keyBits="128" hashSize="20" cipherAlgorithm="AES" cipherChaining="ChainingModeCBC" hashAlgorithm="SHA1""#; + let xml = format!( + "\r\n\ + \ + \ + \ + ", + STANDARD.encode(data_salt), + STANDARD.encode(salt), + STANDARD.encode(wrapped_verifier), + STANDARD.encode(wrapped_hash), + STANDARD.encode(wrapped_value), + ); + let length = u32::try_from(24 + xml.len()).map_err(|_| Error::Limit)?; + let mut data = Vec::with_capacity(length as usize); + for word in [3, length, 16, length - 16] { + data.extend_from_slice(&word.to_le_bytes()); + } + data.extend_from_slice(&[4, 0, 4, 0, 64, 0, 0, 0]); + data.extend_from_slice(xml.as_bytes()); + Ok(( + Self { + value, + file_iv: file_iv(&data_salt), + }, + data, + )) + } + + /// The AES key the section's objects and payloads are encrypted under. + pub(super) fn value(&self) -> &[u8; 16] { + &self.value } pub(super) fn property(&self, input: &[u8]) -> Result>> { @@ -246,17 +324,21 @@ impl Key { Ok(output) } - /// The stored form of a file payload, the inverse of `file`. - pub(super) fn seal_file(&self, clear: &[u8]) -> Vec { + /// The stored form of a file payload, the inverse of `file`: its length, the bytes and + /// random padding to the block, as OneNote pads. + pub(super) fn seal_file(&self, clear: &[u8]) -> Result> { if clear.is_empty() { - return Vec::new(); + return Ok(Vec::new()); } - let mut output = Vec::with_capacity((8 + clear.len()).next_multiple_of(16)); + let length = (8 + clear.len()).next_multiple_of(16); + let mut output = Vec::with_capacity(length); output.extend_from_slice(&(clear.len() as u64).to_le_bytes()); output.extend_from_slice(clear); - output.resize(output.len().next_multiple_of(16), 0); + let end = output.len(); + output.resize(length, 0); + getrandom::fill(&mut output[end..]).map_err(|_| invalid("System random source failed"))?; encrypt(&self.value, &self.file_iv, &mut output); - output + Ok(output) } pub(super) fn file(&self, input: &[u8]) -> Result>> { diff --git a/crates/onestore/src/protected/mod.rs b/crates/onestore/src/protected/mod.rs index 44dfeffcc498bca32680a5d745f5a43e24e0a627..6896fcd68dbd57b9588ee8eca9964ad7ecd9bcac 100644 --- a/crates/onestore/src/protected/mod.rs +++ b/crates/onestore/src/protected/mod.rs @@ -1,24 +1,26 @@ -//! Explicit, in-memory opening of native OneNote 2010 protected sections. -//! -//! AES-128/CBC and SHA-1 Agile password wrappers are supported. Unknown wrappers -//! remain opaque through the ordinary storage/document APIs. CBC provides no -//! general ciphertext authentication; native read-only hashes and model checks -//! detect structural inconsistencies, not arbitrary changes to all content. +//! OneNote 2010's password-protected sections: an Office Agile password wrapper +//! (MS-OFFCRYPTO; SHA-1, 100,000 rounds) around an AES-128 key that encrypts every +//! property object (CBC, an IV of its own) and payload (CBC, one IV from the key data's +//! salt). Unknown wrappers stay opaque. CBC authenticates nothing; read-only hashes and +//! model checks catch structural damage, not every change to content. mod crypto; use crate::{ - ExGuid, FileDataReference, ObjectData, Reference, RevisionIndex, Transaction, + Chunk, ExGuid, FileDataReference, ObjectData, Reference, RevisionIndex, Store, document::Document, - op::{Edit, Op, OpError}, }; +use bumpalo::Bump; use std::{ + cell::RefCell, collections::{BTreeMap, BTreeSet}, fmt, + sync::Arc, }; use zeroize::Zeroizing; type Result = std::result::Result; +type Format = std::result::Result; #[derive(Debug)] pub enum Error { @@ -34,15 +36,34 @@ impl From for Error { } } +impl Error { + fn message(&self) -> &'static str { + match self { + Self::PasswordMismatch => "The password did not match the section verifier", + Self::Unsupported => "This protection format is not supported", + Self::Limit => "Opening the protected section exceeded its work limit", + Self::Invalid(error) => error.message, + } + } +} + +impl From for crate::Error { + fn from(error: Error) -> Self { + match error { + Error::Invalid(error) => error, + other => crate::Error { + offset: 0, + message: other.message(), + }, + } + } +} + impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::PasswordMismatch => { - f.write_str("The password did not match the section verifier") - } - Self::Unsupported => f.write_str("This protection format is not supported"), - Self::Limit => f.write_str("Opening the protected section exceeded its work limit"), Self::Invalid(error) => error.fmt(f), + other => f.write_str(other.message()), } } } @@ -79,17 +100,10 @@ impl Default for Limits { } } -struct Decoded<'a> { - stored: &'a [u8], - clear: Zeroizing>, -} - -/// Owns decoded buffers until dropped; returned views cannot outlive this owner. -/// -/// Passwords are not retained. Dropping this owner clears its derived key and -/// decoded buffers; a protected save works on ordinary buffers, which are not cleared. Owned strings or exports made from a `Document` are separate -/// caller-owned copies and must be disposed of by the caller when locking. -/// Opening never rewrites the source image or changes its protection state. +/// A protected section's labelled revisions decoded for reading as a `Document`, which +/// cannot outlive it. Holds no password; dropping it clears its keys and decoded buffers, +/// while strings and exports made from the `Document` are the caller's to dispose of. +/// Edits go through `Section::unlock`. /// /// ```compile_fail /// # use onestore::{RevisionIndex, protected::{Limits, UnlockedSection}}; @@ -103,22 +117,30 @@ struct Decoded<'a> { pub struct UnlockedSection<'a> { index: &'a RevisionIndex<'a>, /// By object space and stored address. - objects: BTreeMap<(ExGuid, usize), Decoded<'a>>, + objects: BTreeMap<(ExGuid, usize), Zeroizing>>, files: BTreeMap<[u8; 16], Zeroizing>>, - keys: BTreeMap<&'a [u8], crypto::Key>, } impl<'a> UnlockedSection<'a> { /// Verifies the password and every labeled revision before exposing a view. /// Metadata and password input are each bounded to 64 KiB. pub fn open(index: &'a RevisionIndex<'a>, password: &str, limits: Limits) -> Result { - Self::unlock(index, limits, |metadata, rounds| { + Self::open_with(index, limits, |metadata, rounds| { crypto::Key::open(metadata, password, rounds) }) } - /// `open` with each distinct encryption metadata's key from `key`. - fn unlock( + /// `open` with the key `Key::open` gave, which every space's encryption data must name. + pub fn unlock(index: &'a RevisionIndex<'a>, key: &Key, limits: Limits) -> Result { + Self::open_with(index, limits, |metadata, _| { + match metadata == &key.metadata[..] { + true => Ok(key.key.clone()), + false => Err(Error::PasswordMismatch), + } + }) + } + + fn open_with( index: &'a RevisionIndex<'a>, mut limits: Limits, mut key: impl FnMut(&[u8], &mut u64) -> Result, @@ -133,31 +155,10 @@ impl<'a> UnlockedSection<'a> { index, objects: BTreeMap::new(), files: BTreeMap::new(), - keys: BTreeMap::new(), }; let mut keys = BTreeMap::new(); let mut file_keys = BTreeMap::new(); - let mut hashes = BTreeMap::new(); - for node in index.store.lists.values().flat_map(|list| &list.nodes) { - if !matches!(node.id, 0xc4 | 0xc5) { - continue; - } - let Some(Reference::Data(chunk)) = node.reference else { - return Err(invalid("Read-only object has no data reference")); - }; - let bytes = index.store.chunk_data(chunk)?; - let expected: [u8; 16] = node - .payload - .last_chunk::<16>() - .copied() - .ok_or_else(|| invalid("Missing read-only object hash"))?; - if hashes - .insert(bytes.as_ptr().addr(), expected) - .is_some_and(|old| old != expected) - { - return Err(invalid("Inconsistent read-only hashes for one payload")); - } - } + let hashes = hashes(index.store)?; for (space_id, space) in &index.spaces { let mut metadata = None; for revision in space.revisions.values() { @@ -203,23 +204,10 @@ impl<'a> UnlockedSection<'a> { .checked_sub(bytes.len()) .ok_or(Error::Limit)?; let decoded = key.property(bytes)?; - if let Some(expected) = expected { - let mut hash = md5::Context::new(); - hash.consume(&decoded); - hash.consume(&[0; 7][..(8 - decoded.len() % 8) % 8]); - if hash.finalize().0 != *expected { - return Err(invalid( - "Decrypted read-only object hash mismatch", - )); - } + if expected.is_some_and(|expected| digest(&decoded) != *expected) { + return Err(invalid("Decrypted read-only object hash mismatch")); } - result.objects.insert( - identity, - Decoded { - stored: bytes, - clear: decoded, - }, - ); + result.objects.insert(identity, decoded); } ObjectData::File { .. } => { if let Some(FileDataReference::Internal(guid)) = @@ -251,7 +239,6 @@ impl<'a> UnlockedSection<'a> { } } } - result.keys = keys; for (space, info) in &index.spaces { for rid in info.labels.values().copied().collect::>() { result.resolve(*space, rid)?.reachable()?; @@ -276,7 +263,7 @@ impl<'a> UnlockedSection<'a> { offset: 0, message: "Protected object was not decoded", })?; - object.data = ObjectData::Properties(&decoded.clear); + object.data = ObjectData::Properties(decoded); } } Ok(revision) @@ -299,216 +286,345 @@ impl<'a> UnlockedSection<'a> { } } -impl UnlockedSection<'_> { - /// A plaintext section holding every object space's current revision and payloads - /// under their own identities, for writers that read ordinary sections. - fn twin(&self) -> std::result::Result>, crate::Error> { - use crate::write::{PropertyObject, RevisionEdit, append_revisions}; - let copy = |space: ExGuid, revision: ExGuid| { - let revision = self.resolve(space, revision)?; - // A revision still declares objects its edits detached; a new one holds live ones. - let live = revision.reachable()?; +/// A protected section's key, opened with its password or made for a new one. Holds no +/// password; the key is cleared when its last clone drops. +#[derive(Clone)] +pub struct Key { + key: crypto::Key, + /// The encryption data (MS-ONESTORE 2.5.19) that opens the key. + metadata: Arc<[u8]>, +} + +impl fmt::Debug for Key { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("Key") + } +} + +impl Key { + /// Opens the key of the protected section `image` with `password`. + pub fn open(image: &[u8], password: &str) -> Result { + let store = Store::parse(image)?; + let metadata = metadata(&store)?.ok_or(Error::Unsupported)?; + Ok(Self { + key: crypto::Key::open(metadata, password, &mut Limits::default().kdf_rounds)?, + metadata: Arc::from(metadata), + }) + } + + /// A fresh key for `password`, with OneNote 2010's encryption data. + pub fn new(password: &str) -> Result { + let (key, metadata) = crypto::Key::create(password)?; + Ok(Self { + key, + metadata: Arc::from(metadata), + }) + } + + /// The AES key the section's content is encrypted under, for keys derived from it. + pub fn secret(&self) -> &[u8; 16] { + self.key.value() + } + + pub(crate) fn metadata(&self) -> &[u8] { + &self.metadata + } +} + +/// The section `image` written anew, under `new` or in the clear, as OneNote 2010 rewrites +/// a section whose password it sets, changes or removes: the file and its object spaces +/// take new identities, each space keeps its labelled revisions, every one a checkpoint, +/// and the payloads come along. A protected `image` opens under `key`. +pub fn rekey(image: &[u8], key: Option<&Key>, new: Option<&Key>) -> Result> { + let store = Store::parse(image)?; + if !store.checksum_mismatches.is_empty() { + return Err(invalid( + "Cannot write a file with transaction checksum damage", + )); + } + let index = RevisionIndex::parse(&store)?; + let opened = match (key, metadata(&store)?) { + (Some(key), Some(_)) => Some(Opened::new(&store, key)?), + (None, None) => None, + (None, Some(_)) => return Err(Error::PasswordMismatch), + (Some(_), None) => return Err(invalid("The section is not protected")), + }; + let arena = Bump::new(); + let mut fresh = BTreeMap::new(); + for space in index.spaces.keys() { + if let std::collections::btree_map::Entry::Vacant(entry) = fresh.entry(space.guid) { + entry.insert(crate::write::fresh_guid()?); + } + } + // OneNote gives the payloads new identities too. + let mut files = BTreeMap::new(); + for guid in crate::write::declared_payloads(&store) { + files.insert(guid, crate::write::fresh_guid()?); + } + let rename = |id: ExGuid| ExGuid { + guid: fresh.get(&id.guid).copied().unwrap_or(id.guid), + n: id.n, + }; + let mut spaces = Vec::new(); + for (space, info) in &index.spaces { + let mut labelled: Vec<(ExGuid, Vec<(ExGuid, u32)>)> = Vec::new(); + // The current revision first, as OneNote writes it. + let mut labels: Vec<_> = info.labels.iter().collect(); + labels.sort_by_key(|(label, _)| **label != (ExGuid::default(), 1)); + for (label, rid) in labels { + match labelled.iter_mut().find(|(known, _)| known == rid) { + Some((_, names)) => names.push(*label), + None => labelled.push((*rid, vec![*label])), + } + } + let mut revisions = Vec::new(); + for (rid, labels) in labelled { + let mut resolved = index.resolve(*space, rid)?; + if let Some(opened) = &opened { + for object in resolved.objects.values_mut() { + if let ObjectData::Encrypted(stored) = object.data { + object.data = ObjectData::Properties(opened.property(&arena, stored)?); + } + } + } let mut objects = BTreeMap::new(); - for (id, object) in revision.objects.iter().filter(|(id, _)| live.contains(id)) { - let copy = match object.data { - ObjectData::File { - reference, + for id in resolved.reachable()? { + let mut object = resolved.objects[&id].clone(); + if let (Some(FileDataReference::Internal(guid)), ObjectData::File { extension, .. }) = + (object.file_reference()?, object.data) + && let Some(renamed) = files.get(&guid) + { + let reference: Vec = crate::op::content::payload_reference(*renamed) + .encode_utf16() + .flat_map(u16::to_le_bytes) + .collect(); + object.data = ObjectData::File { + reference: arena.alloc_slice_copy(&reference), extension, - } => { - let text = |bytes: &[u8]| { - String::from_utf16( - &bytes - .chunks_exact(2) - .map(|pair| u16::from_le_bytes([pair[0], pair[1]])) - .collect::>(), - ) - .map_err(|_| crate::Error { - offset: 0, - message: "Invalid UTF-16 file-data declaration", - }) - }; - let mut copy = - PropertyObject::file(*id, &text(reference)?, &text(extension)?)?; - copy.jcid = object.jcid; - copy.global_ids = std::sync::Arc::clone(&object.global_ids); - copy - } - _ => PropertyObject::from_object(object)?, - }; - objects.insert(*id, copy); - } - Ok::<_, crate::Error>((revision.roots, objects)) - }; - let payloads: Vec<_> = self - .files - .iter() - .map(|(id, bytes)| (*id, bytes.as_slice())) - .collect(); - let current = (ExGuid::default(), 1); - // The scaffold's root space takes the section's identity, then its content. - let mut scaffold = crate::create_section("twin.one", "", "")?; - let identity = |id: ExGuid| { - let mut bytes = Vec::new(); - id.encode(&mut bytes); - bytes - }; - let store = crate::Store::parse(&scaffold)?; - let placeholder = identity(RevisionIndex::parse(&store)?.root); - for at in 0..=scaffold.len() - 20 { - if scaffold[at..at + 20] == placeholder { - scaffold[at..at + 20].copy_from_slice(&identity(self.index.root)); - } - } - let mut twin = Zeroizing::new(append_revisions(&scaffold, &payloads, None, |_| { - let mut spaces = BTreeMap::new(); - for id in self.index.spaces.keys() { - let (roots, objects) = copy(*id, self.index.active(*id)?)?; - let edit = if *id == self.index.root { - RevisionEdit::Label { - context: current.0, - role: current.1, - roots, - objects, - } - } else { - RevisionEdit::Create { roots, objects } - }; - spaces.insert(*id, edit); - } - Ok(spaces) - })?); - // One revision per call and space: the remaining labels follow in rounds. - for round in 0.. { - let mut spaces = BTreeMap::new(); - for (id, space) in &self.index.spaces { - let label = space.labels.iter().filter(|(label, _)| **label != current); - if let Some(((context, role), revision)) = label.clone().nth(round) { - let (roots, objects) = copy(*id, *revision)?; - spaces.insert( - *id, - RevisionEdit::Label { - context: *context, - role: *role, - roots, - objects, - }, - ); + }; } + object.global_ids = Arc::new( + object + .global_ids + .iter() + .map(|(entry, guid)| (*entry, fresh.get(guid).copied().unwrap_or(*guid))) + .collect(), + ); + objects.insert(rename(id), object); } - if spaces.is_empty() { - break; - } - twin = Zeroizing::new(append_revisions(&twin, &[], None, |_| Ok(spaces))?); + let roots = resolved + .roots + .iter() + .map(|(role, id)| (*role, rename(*id))) + .collect(); + revisions.push(crate::write::Labelled { + labels, + revision: crate::ResolvedRevision { roots, objects }, + }); + } + spaces.push((rename(*space), revisions)); + } + let mut payloads = Vec::new(); + for (guid, renamed) in &files { + let stored = store.file_data(*guid)?; + let clear = match &opened { + Some(opened) => opened.file(&arena, stored)?, + None => stored, + }; + payloads.push((*renamed, clear)); + } + let placement = image[128..148].try_into().unwrap(); + let skeleton = crate::create::skeleton(rename(index.root), placement)?; + let written = crate::write::rewrite(skeleton, &spaces, &payloads, new)?; + let arena = crate::Arena::default(); + match new { + Some(new) => drop(crate::Section::unlock(&arena, written.clone(), new)?), + None => drop(crate::Section::open(&arena, written.clone())?), + } + Ok(written) +} + +/// The encryption data every revision of `store` names; none in a section without any. +fn metadata<'a>(store: &Store<'a>) -> Result> { + let mut found = None; + for node in store.lists.values().flat_map(|list| &list.nodes) { + if node.id != 0x7c { + continue; + } + let Some(Reference::Data(chunk)) = node.reference else { + return Err(invalid("Missing encryption key reference")); + }; + let data = store.encryption_key(chunk)?; + if found.replace(data).is_some_and(|old| old != data) { + return Err(Error::Unsupported); } - Ok(twin) } + Ok(found) } -impl UnlockedSection<'_> { - /// Applies `edit` to this section as `Section::apply` applies it to an ordinary one and - /// seals the result as one revision per changed space, stored under the section's key. - /// Page ops only: a protected section's page list is not edited. - pub fn apply(&self, author: &str, edit: &Edit) -> std::result::Result { - let failed = |error: crate::Error| OpError::Failed(error); - if self.keys.len() != 1 { - return Err(OpError::Unsupported( - "Only a section under one key takes edits", - )); +/// The hashes read-only declarations give their stored bytes, by address. +fn hashes(store: &Store<'_>) -> Result> { + let mut hashes = BTreeMap::new(); + for node in store.lists.values().flat_map(|list| &list.nodes) { + if !matches!(node.id, 0xc4 | 0xc5) { + continue; } - if edit.ops.iter().any(|op| matches!(op, Op::Section(_))) { - return Err(OpError::Unsupported( - "A protected section's page list is not edited", - )); + let Some(Reference::Data(chunk)) = node.reference else { + return Err(invalid("Read-only object has no data reference")); + }; + let bytes = store.chunk_data(chunk)?; + let expected: [u8; 16] = node + .payload + .last_chunk::<16>() + .copied() + .ok_or_else(|| invalid("Missing read-only object hash"))?; + if hashes + .insert(bytes.as_ptr().addr(), expected) + .is_some_and(|old| old != expected) + { + return Err(invalid("Inconsistent read-only hashes for one payload")); + } + } + Ok(hashes) +} + +/// A protected read-only declaration's hash: MD5 of the clear bytes zero-padded to 8. +pub(crate) fn digest(clear: &[u8]) -> [u8; 16] { + let mut hash = md5::Context::new(); + hash.consume(clear); + hash.consume(&[0; 7][..(8 - clear.len() % 8) % 8]); + hash.finalize().0 +} + +/// A `Section`'s key, with what it decoded under it: clear bytes by the address of the +/// stored bytes they decode, and stored bytes by the address of their clear bytes. +pub(crate) struct Opened<'a> { + key: Key, + /// The encryption data each revision names. + chunk: Chunk, + /// Read-only declarations' hashes by the address of their stored bytes. + hashes: BTreeMap, + clear: RefCell>, + stored: RefCell>, +} + +impl<'a> Opened<'a> { + /// `key` for the section `store` holds, every object space of which it must encrypt. + pub(crate) fn new(store: &Store<'_>, key: &Key) -> Result { + if metadata(store)?.ok_or(Error::Unsupported)? != &key.metadata[..] { + return Err(Error::PasswordMismatch); } - let twin = self.twin().map_err(failed)?; - let arena = crate::Arena::default(); - let mut section = crate::Section::open(&arena, twin.to_vec()).map_err(failed)?; - section.apply(author, edit)?; - section.seal().map_err(failed)?; - let applied = Zeroizing::new(section.image()); - drop(section); - let applied_store = crate::Store::parse(&applied).map_err(failed)?; - let applied_index = RevisionIndex::parse(&applied_store).map_err(failed)?; - // The twin's scaffold spaces are not the section's. - let edited = self - .index + let index = RevisionIndex::parse(store)?; + if index .spaces - .keys() - .map(|space| Ok((*space, applied_index.resolve_active(*space)?))) - .collect::, crate::Error>>() - .map_err(failed)?; - let edited: Vec<_> = edited - .iter() - .map(|(space, after)| (*space, after)) - .collect(); - let payloads = crate::write::declared_payloads(&applied_store) - .into_iter() - .map(|guid| Ok((guid, applied_store.file_data(guid)?))) - .collect::, crate::Error>>() - .map_err(failed)?; - let transaction = crate::write::squash(self.index, &edited, &payloads, Some(self)) - .map_err(failed)? - .ok_or(OpError::Unsupported("The edit changes nothing"))?; - let written = - crate::write::applied(self.index.store.data, Some(&transaction)).map_err(failed)?; - let store = crate::Store::parse(&written).map_err(failed)?; - let index = RevisionIndex::parse(&store).map_err(failed)?; - UnlockedSection::unlock(&index, Limits::default(), |metadata, _| { - self.keys - .get(metadata) - .cloned() - .ok_or(Error::PasswordMismatch) - }) - .map_err(|error| match error { - Error::Invalid(error) => failed(error), - _ => failed(crate::Error { - offset: 0, - message: "The written section does not unlock under its key", - }), - })?; - Ok(transaction) - } -} - -impl UnlockedSection<'_> { - /// The section key; `apply` admits sections with exactly one. - fn key(&self) -> &crypto::Key { - self.keys.values().next().expect("one section key") - } -} - -impl crate::write::Protection for UnlockedSection<'_> { - fn resolve( - &self, - space: ExGuid, - revision: ExGuid, - ) -> std::result::Result, crate::Error> { - self.resolve(space, revision) - } - - fn stored(&self, clear: &[u8]) -> Option<&[u8]> { - self.objects .values() - .find(|decoded| std::ptr::eq(decoded.clear.as_ptr(), clear.as_ptr())) - .map(|decoded| decoded.stored) - } - - fn seal_property(&self, clear: &[u8]) -> std::result::Result, crate::Error> { - let random = crate::Error { - offset: 0, - message: "System random source failed", - }; - let mut iv = [0; 16]; - getrandom::fill(&mut iv).map_err(|_| random)?; - self.key() - .seal_property(clear, iv) - .map_err(|error| match error { - Error::Invalid(error) => error, - _ => random, + .flat_map(|space| space.revisions.values()) + .any(|revision| !revision.encrypted) + { + return Err(invalid( + "A protected section stores a revision in the clear", + )); + } + let chunk = store + .lists + .values() + .flat_map(|list| &list.nodes) + .find_map(|node| match node.reference { + Some(Reference::Data(chunk)) if node.id == 0x7c => Some(chunk), + _ => None, }) + .ok_or(Error::Unsupported)?; + Ok(Self { + key: key.clone(), + chunk, + hashes: hashes(store)?, + clear: RefCell::default(), + stored: RefCell::default(), + }) } - fn seal_file(&self, clear: &[u8]) -> Vec { - self.key().seal_file(clear) + /// `key` for writing a new image whose encryption data lies at `chunk`. + pub(crate) fn sealing(key: &Key, chunk: Chunk) -> Self { + Self { + key: key.clone(), + chunk, + hashes: BTreeMap::new(), + clear: RefCell::default(), + stored: RefCell::default(), + } } + + /// The clear bytes of a stored object, decoded once into `arena`. + pub(crate) fn property(&self, arena: &'a Bump, stored: &'a [u8]) -> Format<&'a [u8]> { + if let Some(clear) = self.clear.borrow().get(&stored.as_ptr().addr()) { + return Ok(clear); + } + let decoded = self.key.key.property(stored).map_err(crate::Error::from)?; + if let Some(expected) = self.hashes.get(&stored.as_ptr().addr()) + && digest(&decoded) != *expected + { + return Err(crate::Error { + offset: 0, + message: "Decrypted read-only object hash mismatch", + }); + } + let clear: &'a [u8] = arena.alloc_slice_copy(&decoded); + self.sealed(clear, stored); + Ok(clear) + } + + /// The clear bytes of a stored payload, in `arena`. + pub(crate) fn file(&self, arena: &'a Bump, stored: &[u8]) -> Format<&'a [u8]> { + Ok(arena.alloc_slice_copy(&self.key.key.file(stored).map_err(crate::Error::from)?)) + } + + pub(crate) fn key(&self) -> &Key { + &self.key + } + + /// Records that `clear` is stored as `stored`. + pub(crate) fn sealed(&self, clear: &'a [u8], stored: &'a [u8]) { + self.clear + .borrow_mut() + .insert(stored.as_ptr().addr(), clear); + self.stored + .borrow_mut() + .insert(clear.as_ptr().addr(), stored); + } +} + +impl crate::write::Protection for Opened<'_> { + fn stored(&self, clear: &[u8]) -> Option<&[u8]> { + self.stored.borrow().get(&clear.as_ptr().addr()).copied() + } + + fn seal_property(&self, clear: &[u8]) -> Format> { + seal_property(&self.key, clear) + } + + fn seal_file(&self, clear: &[u8]) -> Format> { + self.key.key.seal_file(clear).map_err(crate::Error::from) + } + + fn open_property(&self, stored: &[u8]) -> Format>> { + self.key.key.property(stored).map_err(crate::Error::from) + } + + fn open_file(&self, stored: &[u8]) -> Format>> { + self.key.key.file(stored).map_err(crate::Error::from) + } + + fn metadata(&self) -> Chunk { + self.chunk + } +} + +/// A property object's stored form under `key`, with a fresh IV. +fn seal_property(key: &Key, clear: &[u8]) -> Format> { + let mut iv = [0; 16]; + getrandom::fill(&mut iv).map_err(|_| crate::Error { + offset: 0, + message: "System random source failed", + })?; + key.key.seal_property(clear, iv).map_err(crate::Error::from) } diff --git a/crates/onestore/src/section.rs b/crates/onestore/src/section.rs index 5e15d6e1754b7e9642a407329bd9820781295bbd..dfa489a32ab926a48810a488da8dfa4d41fe4f8b 100644 --- a/crates/onestore/src/section.rs +++ b/crates/onestore/src/section.rs @@ -7,9 +7,10 @@ use crate::{ active::{ActivePage, Changes, Files}, document::Revision, page::Page, + protected::{Key, Opened}, store::StoreState, write::{ - Appending, Commit, LiveRevision, PropertyObject, Sealing, Written, chain_depth, + Appending, Commit, LiveRevision, PropertyObject, Protection, Sealing, Written, chain_depth, check_transaction, declared, label_payload, node, replacement, unchanged, }, }; @@ -34,8 +35,8 @@ pub struct Section<'a> { /// The in-place writes of the sealed transactions, in order. patches: Vec<(u64, Vec)>, state: StoreState, - /// Payloads the opened images embed, by identity, with the image holding each. - files: &'a [([u8; 16], Chunk, &'a [u8])], + /// Payloads the opened images embed, by identity, as they read. + files: &'a [([u8; 16], Result<&'a [u8]>)], /// Payload identities the file-data store declares. declared: BTreeSet<[u8; 16]>, spaces: BTreeMap>, @@ -48,6 +49,8 @@ pub struct Section<'a> { root: ExGuid, /// While an edit applies, the spaces it changed as they were before it. undo: Option>, + /// A password-protected section's key and what it decoded. + unlocked: Option>, } #[derive(Default)] @@ -139,9 +142,17 @@ struct Open<'a> { impl<'a> Section<'a> { /// Parses and fully validates a section image. pub fn open(arena: &'a Arena, image: Vec) -> Result { - Self::open_with(arena, vec![image], |_, space| { - space.labels.get(&(ExGuid::default(), 1)).copied() - }) + Ok(Self::open_with(arena, vec![image], None, current)?) + } + + /// `open` for a password-protected section, decoding it under `key`, which edits are + /// sealed under too. Decoded bytes live in `arena` until it drops. + pub fn unlock( + arena: &'a Arena, + image: Vec, + key: &Key, + ) -> std::result::Result { + Self::open_with(arena, vec![image], Some(key), current) } /// Opens an earlier state of a section: each object space in `revisions` at the revision @@ -153,7 +164,7 @@ impl<'a> Section<'a> { images: Vec>, revisions: &BTreeMap, ) -> Result { - let section = Self::open_with(arena, images, |id, space| { + let section = Self::open_with(arena, images, None, |id, space| { revisions .get(id) .copied() @@ -170,15 +181,17 @@ impl<'a> Section<'a> { /// `open`, each object space at the revision `revision` chooses in the first image where it /// chooses one; a space it chooses none for is left out. Payloads are read from the image - /// that first declares them. + /// that first declares them. A protected section opens under `key`. fn open_with( arena: &'a Arena, images: Vec>, + key: Option<&Key>, revision: impl Fn(&ExGuid, &crate::ObjectSpace<'_>) -> Option, - ) -> Result { + ) -> std::result::Result { let mut opened = None; + let mut unlocked = None; let mut spaces = BTreeMap::new(); - let mut files: Vec<([u8; 16], Chunk, &'a [u8])> = Vec::new(); + let mut files: Vec<([u8; 16], Result<&'a [u8]>)> = Vec::new(); for image in images { let bytes: &'a [u8] = arena.0.alloc_slice_copy(&image); drop(image); @@ -187,28 +200,40 @@ impl<'a> Section<'a> { return Err(Error { offset: *offset, message: "Cannot write a file with transaction checksum damage", - }); + } + .into()); } if store.header.file_type != FileType::Section { return Err(Error { offset: 0, message: "Choose a section file", - }); + } + .into()); } let index = RevisionIndex::parse(&store)?; - index.validate_current()?; + if let (Some(key), None) = (key, &unlocked) { + unlocked = Some(Opened::new(&store, key)?); + } + // The parse borrows `bytes` only as long as its store; its slices lie in `bytes`, + // which the arena keeps. + let bound = |resolved| { + bind(arena, unlocked.as_ref(), resolved, |part| { + Ok(within(bytes, part)) + }) + }; + index.validate_with(|space, rid| bound(index.resolve(space, rid)?))?; for (id, space) in &index.spaces { let Some(rid) = revision(id, space).filter(|_| !spaces.contains_key(id)) else { continue; }; - let revision = bound(bytes, index.resolve(*id, rid)?); + let revision = bound(index.resolve(*id, rid)?)?; let history = space .labels .get(&(versions::HISTORY, 1)) .map(|history| -> Result> { Ok(History { rid: *history, - revision: bound(bytes, index.resolve(*id, *history)?), + revision: bound(index.resolve(*id, *history)?)?, depth: chain_depth(&index, *id, *history), pending: BTreeMap::new(), }) @@ -231,11 +256,24 @@ impl<'a> Section<'a> { return Err(Error { offset: node.offset, message: "File-data object lacks a data reference", - }); + } + .into()); }; // A payload an earlier image declares is the same bytes: it names them. if !files[..known].iter().any(|(declared, ..)| declared == guid) { - files.push((*guid, chunk, bytes)); + let (offset, length) = (chunk.offset as usize, chunk.length as usize); + let payload = bytes + .get(offset..offset + length) + .ok_or(Error { + offset, + message: "Chunk extends outside the data area", + }) + .and_then(|blob| crate::files::payload(blob, offset)) + .and_then(|payload| match &unlocked { + Some(unlocked) => unlocked.file(&arena.0, payload), + None => Ok(payload), + }); + files.push((*guid, payload)); } } if opened.is_none() { @@ -259,6 +297,7 @@ impl<'a> Section<'a> { broken: false, root, undo: None, + unlocked, }) } @@ -479,25 +518,14 @@ impl<'a> Section<'a> { fn files(&self) -> Files<'a> { let files = self.files; std::rc::Rc::new(move |guid| { - let start = files.partition_point(|(id, ..)| *id < guid); - match files[start..] - .iter() - .take_while(|(id, ..)| *id == guid) - .count() - { - 0 => Err(Error { + let start = files.partition_point(|(id, _)| *id < guid); + let mut declared = files[start..].iter().take_while(|(id, _)| *id == guid); + match (declared.next(), declared.next()) { + (None, _) => Err(Error { offset: 0, message: "File-data object is not declared", }), - 1 => { - let (_, chunk, bytes) = files[start]; - let (offset, length) = (chunk.offset as usize, chunk.length as usize); - let blob = bytes.get(offset..offset + length).ok_or(Error { - offset, - message: "Chunk extends outside the data area", - })?; - crate::files::payload(blob, offset) - } + (Some((_, payload)), None) => *payload, _ => Err(Error { offset: 0, message: "Duplicate file-data identity", @@ -706,6 +734,10 @@ impl<'a> Section<'a> { } self.broken = true; let arena = &self.arena.0; + let protection = self + .unlocked + .as_ref() + .map(|unlocked| unlocked as &dyn Protection); let mut appending = Appending::new(self.state.clone()); let mut sealed = Vec::new(); for (id, space) in &mut self.spaces { @@ -726,8 +758,7 @@ impl<'a> Section<'a> { created: &frozen.revised.created, }, &self.segments, - None, - None, + protection, &mut manifest, )?; } @@ -757,8 +788,7 @@ impl<'a> Section<'a> { created: &created, }, &self.segments, - None, - None, + protection, &mut manifest, )?; if commit.checkpoint { @@ -805,8 +835,7 @@ impl<'a> Section<'a> { created: &created, }, &self.segments, - None, - None, + protection, &mut manifest, )?; if commit.checkpoint { @@ -834,7 +863,7 @@ impl<'a> Section<'a> { .filter(|(guid, _)| !self.declared.contains(guid)) .copied() .collect(); - appending.payloads(&payloads, None)?; + appending.payloads(&payloads, protection)?; #[cfg_attr(not(test), expect(unused_mut))] let mut transaction = appending.finish()?; #[cfg(test)] @@ -892,6 +921,7 @@ impl<'a> Section<'a> { &written, &labels, &payloads, + protection, )?; let base = transaction.base.length; let segment: &'a [u8] = arena.alloc_slice_copy(&transaction.append); @@ -899,11 +929,20 @@ impl<'a> Section<'a> { self.patches.extend(transaction.patches.iter().cloned()); self.state = state.clone(); self.declared.extend(payloads.iter().map(|(guid, _)| *guid)); - let bind = |revision: &mut ResolvedRevision<'a>, stored: &[(ExGuid, crate::Chunk)]| { + // An object now reads from where it is stored, or a protected one's clear bytes + // from where they are. + let unlocked = &self.unlocked; + let rebind = |revision: &mut ResolvedRevision<'a>, stored: &[(ExGuid, Chunk)]| { for (object_id, chunk) in stored { let start = (chunk.offset - base) as usize; - revision.objects.get_mut(object_id).unwrap().data = - ObjectData::Properties(&segment[start..start + chunk.length as usize]); + let bytes = &segment[start..start + chunk.length as usize]; + let data = &mut revision.objects.get_mut(object_id).unwrap().data; + match (unlocked, *data) { + (Some(unlocked), ObjectData::Properties(clear)) => { + unlocked.sealed(clear, bytes) + } + _ => *data = ObjectData::Properties(bytes), + } } }; for (id, page, history) in &mut sealed { @@ -916,11 +955,11 @@ impl<'a> Section<'a> { space.rid = Some(*rid); space.restored = None; space.newest = Some(*rid); - bind(&mut open.file.revision, stored); + rebind(&mut open.file.revision, stored); } if let Some((rid, stored, live, _)) = history.take() { let mut revision = live.revision; - bind(&mut revision, &stored); + rebind(&mut revision, &stored); space.history = Some(History { rid, revision, @@ -969,7 +1008,11 @@ impl<'a> Section<'a> { } let mut image = self.image(); transaction.apply(&mut image)?; - *self = Self::open(self.arena, image)?; + let key = self + .unlocked + .as_ref() + .map(|unlocked| unlocked.key().clone()); + *self = Self::open_with(self.arena, vec![image], key.as_ref(), current)?; Ok(()) } } @@ -1022,37 +1065,50 @@ fn changed<'a>( })) } -/// `resolved`, parsed from `bytes`, borrowing them for their lifetime. -fn bound<'a>(bytes: &'a [u8], resolved: ResolvedRevision<'_>) -> ResolvedRevision<'a> { - ResolvedRevision { +/// `resolved` with every slice moved into bytes that live as long as the section by `bytes`, +/// a protected section's objects decoded under `unlocked`. +fn bind<'a>( + arena: &'a Arena, + unlocked: Option<&Opened<'a>>, + resolved: ResolvedRevision<'_>, + bytes: impl Fn(&[u8]) -> Result<&'a [u8]>, +) -> Result> { + let mut objects = BTreeMap::new(); + for (id, object) in resolved.objects { + let data = match (object.data, unlocked) { + (ObjectData::Properties(data), _) => ObjectData::Properties(bytes(data)?), + (ObjectData::Encrypted(data), Some(unlocked)) => { + ObjectData::Properties(unlocked.property(&arena.0, bytes(data)?)?) + } + (ObjectData::Encrypted(data), None) => ObjectData::Encrypted(bytes(data)?), + ( + ObjectData::File { + reference, + extension, + }, + _, + ) => ObjectData::File { + reference: bytes(reference)?, + extension: bytes(extension)?, + }, + }; + let object = crate::Object { + jcid: object.jcid, + reference_count: object.reference_count, + data, + global_ids: object.global_ids, + }; + objects.insert(id, object); + } + Ok(ResolvedRevision { roots: resolved.roots, - objects: resolved - .objects - .into_iter() - .map(|(id, object)| { - // The parse borrows `bytes` only as long as its store; its slices lie in - // `bytes`, which the arena keeps. - let data = match object.data { - ObjectData::Properties(data) => ObjectData::Properties(within(bytes, data)), - ObjectData::Encrypted(data) => ObjectData::Encrypted(within(bytes, data)), - ObjectData::File { - reference, - extension, - } => ObjectData::File { - reference: within(bytes, reference), - extension: within(bytes, extension), - }, - }; - let object = crate::Object { - jcid: object.jcid, - reference_count: object.reference_count, - data, - global_ids: object.global_ids, - }; - (id, object) - }) - .collect(), - } + objects, + }) +} + +/// The revision a space is current under. +fn current(_: &ExGuid, space: &crate::ObjectSpace<'_>) -> Option { + space.labels.get(&(ExGuid::default(), 1)).copied() } /// `part`, a slice of `image`, with the image's lifetime. @@ -1097,7 +1153,7 @@ mod tests { edited: &[(ExGuid, &ResolvedRevision<'_>)], payloads: &[([u8; 16], &[u8])], ) -> Vec { - let transaction = crate::write::squash(index, edited, payloads, None).unwrap(); + let transaction = crate::write::squash(index, edited, payloads).unwrap(); crate::write::applied(index.store.data, transaction.as_ref()).unwrap() } diff --git a/crates/onestore/src/section/versions.rs b/crates/onestore/src/section/versions.rs index d54a0f75ac9eb3f50e57d8d4757ee022f4cb52e6..45272c568e81ae68f82e3e8cb0eeb3641cde825e 100644 --- a/crates/onestore/src/section/versions.rs +++ b/crates/onestore/src/section/versions.rs @@ -6,7 +6,7 @@ use super::{Frozen, Open, Section, SpaceState, changed, one_page}; use crate::{ - Error, ExGuid, FileType, Object, ObjectData, ResolvedRevision, RevisionIndex, Store, + Error, ExGuid, FileType, Object, ResolvedRevision, RevisionIndex, Store, active::{ActivePage, manifest_pages}, create::{author_properties, current_timestamps, properties}, document::{Element, Kind, Revision}, @@ -144,8 +144,13 @@ impl<'a> Section<'a> { let image = self.image(); let store = Store::parse(&image)?; let resolved = RevisionIndex::parse(&store)?.resolve(space, revision)?; + let resolved = self.resident(&image, resolved)?; let (view, _) = Revision::parse(space, &resolved, FileType::Section, &mut |guid| { - store.file_data(guid) + let stored = store.file_data(guid)?; + match &self.unlocked { + Some(unlocked) => unlocked.file(&self.arena.0, stored), + None => Ok(stored), + } })?; one_page(&view, &manifest_pages(&view)) } @@ -258,8 +263,17 @@ impl<'a> Section<'a> { let store = Store::parse(&image)?; let index = RevisionIndex::parse(&store)?; let rid = self.version_revision(&index, space, context)?; - let resolved = index.resolve(space, rid)?; - // Object bytes lie in the section's segments, which outlive this image. + let revision = self.resident(&image, index.resolve(space, rid)?)?; + Ok((rid, revision, chain_depth(&index, space, rid))) + } + + /// `resolved`, read from `image`, the section's sealed image, with its bytes in the + /// section's segments, which outlive the image; a protected section's decoded. + fn resident( + &self, + image: &[u8], + resolved: ResolvedRevision<'_>, + ) -> Result> { let resident = |part: &[u8]| -> Result<&'a [u8]> { let offset = (part.as_ptr().addr() - image.as_ptr().addr()) as u64; self.segments @@ -275,34 +289,7 @@ impl<'a> Section<'a> { message: "A version's bytes lie outside the section", }) }; - let mut objects = BTreeMap::new(); - for (id, object) in resolved.objects { - let data = match object.data { - ObjectData::Properties(data) => ObjectData::Properties(resident(data)?), - ObjectData::Encrypted(data) => ObjectData::Encrypted(resident(data)?), - ObjectData::File { - reference, - extension, - } => ObjectData::File { - reference: resident(reference)?, - extension: resident(extension)?, - }, - }; - objects.insert( - id, - Object { - jcid: object.jcid, - reference_count: object.reference_count, - data, - global_ids: object.global_ids, - }, - ); - } - let revision = ResolvedRevision { - roots: resolved.roots, - objects, - }; - Ok((rid, revision, chain_depth(&index, space, rid))) + super::bind(self.arena, self.unlocked.as_ref(), resolved, resident) } /// Restores version `context` of page `space` as OneNote 2010's Restore Version does: the diff --git a/crates/onestore/src/toc.rs b/crates/onestore/src/toc.rs index 49fdd9854d36d96c8124f904f0509f367eadbe63..6930869c0d9990ff980b1b9430af67693482ba98 100644 --- a/crates/onestore/src/toc.rs +++ b/crates/onestore/src/toc.rs @@ -35,6 +35,12 @@ pub enum TocEdit { Remove { identity: [u8; 16], }, + /// The entry's file took the identity `with`, as a section does whose password is set, + /// changed or removed. + Reidentify { + identity: [u8; 16], + with: [u8; 16], + }, } fn component(name: &str) -> bool { @@ -87,6 +93,7 @@ pub fn edit_table_of_contents( stored.into_iter().map(|(_, entry)| entry).collect(); let mut created: BTreeMap = BTreeMap::new(); let mut renamed = BTreeSet::new(); + let mut reidentified = BTreeSet::new(); let mut color = None; for edit in edits { let position = |identity: &[u8; 16]| { @@ -178,6 +185,14 @@ pub fn edit_table_of_contents( let (id, _, _) = listed.remove(at); created.remove(&id); } + TocEdit::Reidentify { identity, with } => { + let at = position(identity)?; + if *with == [0; 16] || listed.iter().any(|(_, known, _)| known == with) { + return Err(invalid("The table of contents already lists that identity")); + } + listed[at].1 = *with; + reidentified.insert(listed[at].0); + } } } let listed = listed; @@ -188,12 +203,12 @@ pub fn edit_table_of_contents( TocEdit::Add { .. } | TocEdit::Order(_) | TocEdit::Remove { .. } ) }); - let transaction = build_on(&index, &[], None, |index| { + let transaction = build_on(&index, &[], |index| { let raw = index.resolve_active(space)?; let mut changed = BTreeMap::new(); let mut root_object = PropertyObject::from_object(&raw.objects[&root])?; let mut references = Vec::new(); - for (order, (id, _, filename)) in listed.iter().enumerate() { + for (order, (id, identity, filename)) in listed.iter().enumerate() { let mut object = match created.remove(id) { Some(object) => object, None => PropertyObject::from_object(&raw.objects[id])?, @@ -213,6 +228,9 @@ pub fn edit_table_of_contents( if renamed.contains(id) { updates.push((0x1c001d6b, crate::create::string(filename))); } + if reidentified.contains(id) { + updates.push((0x1c001d94, identity.to_vec())); + } let updates: Vec<(u32, &[u8])> = updates .iter() .map(|(id, bytes)| (*id, bytes.as_slice())) @@ -287,7 +305,7 @@ mod tests { let index = RevisionIndex::parse(&store).unwrap(); let space = Document::parse(&index).unwrap().root; let listed = entries(&toc); - let transaction = build_on(&index, &[], None, |index| { + let transaction = build_on(&index, &[], |index| { let raw = index.resolve_active(space)?; let mut changed = BTreeMap::new(); for ((id, _, _), order) in listed.iter().zip([7u32, 2, 2]) { diff --git a/crates/onestore/src/write.rs b/crates/onestore/src/write.rs index 3b517b11a5c411334ead07dcbab6a9f782839be1..6d0e7b337b9269050b2707573f173990cad3fc55 100644 --- a/crates/onestore/src/write.rs +++ b/crates/onestore/src/write.rs @@ -487,19 +487,11 @@ pub(crate) struct PropertyObject { pub(crate) enum RevisionEdit { Update(BTreeMap), - #[cfg(any(test, feature = "protected"))] + #[cfg(test)] Create { roots: BTreeMap, objects: BTreeMap, }, - /// A complete revision of an existing space under a context and role, without history. - #[cfg(feature = "protected")] - Label { - context: ExGuid, - role: u32, - roots: BTreeMap, - objects: BTreeMap, - }, } impl PropertyObject { @@ -801,14 +793,16 @@ impl PropertyObject { } } -/// A password-protected section's unlocked view, through which its revisions are -/// read as plaintext and written back in their stored form. +/// A password-protected section's key, under which a writer stores what it appends. pub(crate) trait Protection { - fn resolve(&self, space: ExGuid, revision: ExGuid) -> Result>; - /// The stored bytes a resolved object's plaintext was decoded from. + /// The stored bytes an object's clear bytes were decoded from. fn stored(&self, clear: &[u8]) -> Option<&[u8]>; fn seal_property(&self, clear: &[u8]) -> Result>; - fn seal_file(&self, clear: &[u8]) -> Vec; + fn seal_file(&self, clear: &[u8]) -> Result>; + fn open_property(&self, stored: &[u8]) -> Result>>; + fn open_file(&self, stored: &[u8]) -> Result>>; + /// The encryption data's chunk, which every revision names. + fn metadata(&self) -> Chunk; } /// The global-ID entries a group of objects declared together uses: each object's own @@ -1281,7 +1275,7 @@ pub(crate) fn revisions( let store = Store::parse(source)?; let index = RevisionIndex::parse(&store)?; index.validate_current()?; - build_on(&index, &[], None, edit) + build_on(&index, &[], edit) } /// A test fixture: `source` with `edit`'s revisions appended. @@ -1290,32 +1284,17 @@ pub(crate) fn write_revisions( source: &[u8], edit: impl FnOnce(&RevisionIndex<'_>) -> Result>, ) -> Result> { - publish(source, &[], None, true, edit) + publish(source, true, edit) } -/// `source` with `edit`'s revisions and the `payloads` appended, without validating that -/// current revisions are complete: a protected section is validated by unlocking it, -/// through `protection`. -#[cfg(feature = "protected")] -pub(crate) fn append_revisions( - source: &[u8], - payloads: &[([u8; 16], &[u8])], - protection: Option<&dyn Protection>, - edit: impl FnOnce(&RevisionIndex<'_>) -> Result>, -) -> Result> { - publish(source, payloads, protection, false, edit) -} - -#[cfg(any(test, feature = "protected"))] +#[cfg(test)] fn publish( source: &[u8], - payloads: &[([u8; 16], &[u8])], - protection: Option<&dyn Protection>, validate: bool, edit: impl FnOnce(&RevisionIndex<'_>) -> Result>, ) -> Result> { // The parsed source is released before the result is parsed. - let output = build(source, payloads, protection, validate, edit)?; + let output = build(source, validate, edit)?; check(&output, validate)?; Ok(output) } @@ -1332,11 +1311,9 @@ pub(crate) fn check(output: &[u8], validate: bool) -> Result<()> { /// The written image, unchecked: `check` follows once the caller has released whatever /// `edit` borrowed. -#[cfg(any(test, feature = "protected"))] +#[cfg(test)] fn build( source: &[u8], - payloads: &[([u8; 16], &[u8])], - protection: Option<&dyn Protection>, validate: bool, edit: impl FnOnce(&RevisionIndex<'_>) -> Result>, ) -> Result> { @@ -1345,10 +1322,7 @@ fn build( if validate { index.validate_current()?; } - applied( - source, - build_on(&index, payloads, protection, edit)?.as_ref(), - ) + applied(source, build_on(&index, &[], edit)?.as_ref()) } /// `write_revision` on a source the caller has parsed and validated. @@ -1360,7 +1334,7 @@ pub(crate) fn write_revision_on( ) -> Result> { let output = applied( index.store.data, - build_on(index, &[], None, update(space, edit))?.as_ref(), + build_on(index, &[], update(space, edit))?.as_ref(), )?; check(&output, true)?; Ok(output) @@ -1377,7 +1351,6 @@ thread_local! { pub(crate) fn build_on( index: &RevisionIndex<'_>, payloads: &[([u8; 16], &[u8])], - protection: Option<&dyn Protection>, edit: impl FnOnce(&RevisionIndex<'_>) -> Result>, ) -> Result> { #[cfg(test)] @@ -1391,10 +1364,6 @@ pub(crate) fn build_on( message: "Cannot write a file with transaction checksum damage", }); } - let resolve = |space, rid| match protection { - Some(protection) => protection.resolve(space, rid), - None => index.resolve(space, rid), - }; let changes = edit(index)?; let mut appending = Appending::new(store.state()?); for (space, change) in changes { @@ -1402,9 +1371,15 @@ pub(crate) fn build_on( let (rid, label, revision, replacements, new_space) = match change { RevisionEdit::Update(objects) => { let rid = index.active(space)?; - (Some(rid), current, resolve(space, rid)?, objects, false) + ( + Some(rid), + current, + index.resolve(space, rid)?, + objects, + false, + ) } - #[cfg(any(test, feature = "protected"))] + #[cfg(test)] RevisionEdit::Create { roots, objects } => { if !is_section || space.guid == [0; 16] || index.spaces.contains_key(&space) { return Err(Error { @@ -1429,30 +1404,6 @@ pub(crate) fn build_on( true, ) } - #[cfg(feature = "protected")] - RevisionEdit::Label { - context, - role, - roots, - objects, - } => { - if !is_section || role > 0xffff || !index.spaces.contains_key(&space) { - return Err(Error { - offset: 0, - message: "Choose a label in a section's object space", - }); - } - ( - None, - (context, role), - crate::ResolvedRevision { - roots, - objects: BTreeMap::new(), - }, - objects, - false, - ) - } }; let depth = rid.map_or(0, |rid| chain_depth(index, space, rid)); let mut live = LiveRevision::new(revision, depth)?; @@ -1478,25 +1429,6 @@ pub(crate) fn build_on( }) .collect::>>()?, )?; - // A dependent revision inherits its key, as OneNote writes it. - let key = if protection.is_some() && commit.checkpoint { - Some( - index - .spaces - .get(&space) - .and_then(|space| { - space.revisions.values().find_map(|revision| { - revision.nodes.first().filter(|node| node.id == 0x7c) - }) - }) - .ok_or(Error { - offset: 0, - message: "Protected revisions continue a protected object space", - })?, - ) - } else { - None - }; appending.revision( &Sealing { space, @@ -1510,11 +1442,10 @@ pub(crate) fn build_on( created: &created, }, &[(0, source)], - protection, - key, + None, )?; } - appending.payloads(payloads, protection)?; + appending.payloads(payloads, None)?; Ok(appending.finish()?.map(|(transaction, _)| transaction)) } @@ -1528,7 +1459,6 @@ pub(crate) fn applied(source: &[u8], transaction: Option<&crate::Transaction>) - } /// Payload identities the file-data store of `store` declares, in order. -#[cfg(any(test, feature = "protected"))] pub(crate) fn declared_payloads(store: &Store<'_>) -> Vec<[u8; 16]> { store .lists @@ -1541,13 +1471,12 @@ pub(crate) fn declared_payloads(store: &Store<'_>) -> Vec<[u8; 16]> { /// Writes the live objects of each `edited` revision that differ from its space's active /// revision in the validated `source` as one revision per space, embedding the `payloads` -/// it lacks. A protected `source` takes the revisions its plaintext twin gained. -#[cfg(any(test, feature = "protected"))] +/// it lacks. +#[cfg(test)] pub(crate) fn squash( source: &RevisionIndex<'_>, edited: &[(ExGuid, &crate::ResolvedRevision<'_>)], payloads: &[([u8; 16], &[u8])], - protection: Option<&dyn Protection>, ) -> Result> { let existing = declared_payloads(source.store); let payloads: Vec<_> = payloads @@ -1555,13 +1484,10 @@ pub(crate) fn squash( .filter(|(guid, _)| !existing.contains(guid)) .copied() .collect(); - build_on(source, &payloads, protection, |index| { + build_on(source, &payloads, |index| { let mut changes = BTreeMap::new(); for (space, after) in edited { - let before = match protection { - Some(protection) => protection.resolve(*space, index.active(*space)?)?, - None => index.resolve_active(*space)?, - }; + let before = index.resolve_active(*space)?; if before.roots != after.roots { return Err(Error { offset: 0, @@ -1590,6 +1516,111 @@ pub(crate) fn squash( }) } +/// A whole revision for `rewrite`, with the labels it is current under. +pub(crate) struct Labelled<'a> { + pub labels: Vec<(ExGuid, u32)>, + pub revision: crate::ResolvedRevision<'a>, +} + +/// `skeleton` (`create::skeleton`) with `spaces` appended, each revision a checkpoint under +/// its labels, and `payloads`, all stored under `key` when one is given. +pub(crate) fn rewrite( + skeleton: Vec, + spaces: &[(ExGuid, Vec>)], + payloads: &[([u8; 16], &[u8])], + key: Option<&crate::protected::Key>, +) -> Result> { + let store = Store::parse(&skeleton)?; + let state = store.state()?; + let declared: BTreeSet = state.spaces.keys().copied().collect(); + let mut appending = Appending::new(state); + let opened = key + .map(|key| -> Result<_> { + let mut container = 0xfb6ba385dad1a067_u64.to_le_bytes().to_vec(); + container.extend_from_slice(key.metadata()); + container.extend_from_slice(&0x2649294f8e198b3c_u64.to_le_bytes()); + Ok(crate::protected::Opened::sealing( + key, + appending.append(&container)?, + )) + }) + .transpose()?; + let protection = opened.as_ref().map(|opened| opened as &dyn Protection); + for (space, revisions) in spaces { + let new = !declared.contains(space); + let mut manifest = Vec::new(); + let mut labels = Vec::new(); + for ( + index, + Labelled { + labels: names, + revision, + }, + ) in revisions.iter().enumerate() + { + let mut live = LiveRevision::new( + crate::ResolvedRevision { + roots: revision.roots.clone(), + objects: BTreeMap::new(), + }, + 0, + )?; + let commit = live.commit( + revision + .objects + .iter() + .map(|(id, object)| { + let mut object = object.clone(); + object.reference_count = 0; + (*id, object) + }) + .collect(), + )?; + let all: BTreeSet = live.revision.objects.keys().copied().collect(); + let (first, others) = names.split_first().ok_or(Error { + offset: 0, + message: "A rewritten revision needs a label", + })?; + let (rid, _) = appending.manifest( + &Sealing { + space: *space, + previous: None, + new_space: new && index == 0, + label: *first, + rid: None, + live: &live, + commit: &commit, + replaced: &all, + created: &all, + }, + &[], + protection, + &mut manifest, + )?; + for (context, role) in others { + let mut payload = Vec::new(); + rid.encode(&mut payload); + payload.extend_from_slice(&role.to_le_bytes()); + let id = if *context == ExGuid::default() { + 0x5c + } else { + context.encode(&mut payload); + 0x5d + }; + labels.push(node(id, None, &payload)?); + } + } + manifest.extend(labels); + appending.close(*space, new, &manifest)?; + } + appending.payloads(payloads, protection)?; + let (transaction, _) = appending.finish()?.ok_or(Error { + offset: 0, + message: "A rewritten section holds nothing", + })?; + applied(&skeleton, Some(&transaction)) +} + /// A space's revision as `LiveRevision::commit` left it, ready to append. pub(crate) struct Sealing<'r, 'a> { pub space: ExGuid, @@ -1664,7 +1695,7 @@ impl Appending { self.base.length + self.append.len() as u64 } - fn append(&mut self, bytes: &[u8]) -> Result { + pub(crate) fn append(&mut self, bytes: &[u8]) -> Result { let length = u64::from(u32::try_from(bytes.len()).map_err(|_| Error { offset: 0, message: "Chunk exceeds the encoded length limit", @@ -1743,10 +1774,9 @@ impl Appending { sealing: &Sealing<'_, '_>, segments: &[(u64, &[u8])], protection: Option<&dyn Protection>, - key: Option<&crate::Node<'_>>, ) -> Result<(ExGuid, Vec<(ExGuid, Chunk)>)> { let mut manifest = Vec::new(); - let written = self.manifest(sealing, segments, protection, key, &mut manifest)?; + let written = self.manifest(sealing, segments, protection, &mut manifest)?; self.close(sealing.space, sealing.new_space, &manifest)?; Ok(written) } @@ -1759,7 +1789,6 @@ impl Appending { sealing: &Sealing<'_, '_>, segments: &[(u64, &[u8])], protection: Option<&dyn Protection>, - key: Option<&crate::Node<'_>>, manifest: &mut Vec>, ) -> Result<(ExGuid, Vec<(ExGuid, Chunk)>)> { let is_section = self.state.file_type == FileType::Section; @@ -1863,12 +1892,14 @@ impl Appending { None, &start, )?); - if protection.is_some() && checkpoint { - let key = key.ok_or(Error { - offset: 0, - message: "Protected revisions continue a protected object space", - })?; - manifest.push(node(0x7c, key.reference, key.payload)?); + // MS-ONESTORE 2.5.19 has every revision of a protected space name its key; OneNote + // names it only in revisions without a dependency, and reads either. + if let Some(protection) = protection { + manifest.push(node( + 0x7c, + Some(Reference::Data(protection.metadata())), + &[], + )?); } let mut stored = Vec::new(); for (table, objects) in groups { @@ -2084,7 +2115,9 @@ impl Appending { 0xe7, 0x16, 0xe3, 0xbd, 0x65, 0x26, 0x11, 0x45, 0xa4, 0xc4, 0x8d, 0x4d, 0x0b, 0x7a, 0x9e, 0xac, ]; - let sealed = protection.map(|protection| protection.seal_file(payload)); + let sealed = protection + .map(|protection| protection.seal_file(payload)) + .transpose()?; let payload = sealed.as_deref().unwrap_or(*payload); blob.extend_from_slice(&(payload.len() as u64).to_le_bytes()); blob.extend_from_slice(&[0; 12]); @@ -2279,6 +2312,7 @@ pub(crate) struct Written<'r, 'a> { /// object parses, names identities its group's table holds and objects reachable after its /// revision, carries its incremental reference count and, if read-only, its MD5; roots stay /// unless a space is new. Validates nothing the transaction leaves as it was. +#[allow(clippy::too_many_arguments)] pub(crate) fn check_transaction( before: &StoreState, after: &StoreState, @@ -2287,8 +2321,10 @@ pub(crate) fn check_transaction( revisions: &[Written<'_, '_>], labels: &[(ExGuid, ExGuid, ExGuid)], payloads: &[([u8; 16], &[u8])], + protection: Option<&dyn Protection>, ) -> Result<()> { let wrong = |message| Error { offset: 0, message }; + let encoding: [u8; 2] = if protection.is_some() { [2, 0] } else { [0, 0] }; let base = transaction.base.length; // A chunk's bytes with this transaction's writes: nothing read here is patched earlier. let read = |chunk: Chunk| -> Result> { @@ -2449,13 +2485,20 @@ pub(crate) fn check_transaction( || c.exguid()? != rid || c.exguid()? != dependency || c.read::<4>()? != label.1.to_le_bytes() - || c.read::<2>()? != [0, 0] + || c.read::<2>()? != encoding || (contextual && c.exguid()? != label.0) { return Err(wrong( "A revision starts with the wrong identity, dependency or label", )); } + if let Some(protection) = protection { + let node = next()?; + if node.id != 0x7c || node.reference != Some(Reference::Data(protection.metadata())) + { + return Err(wrong("A protected revision does not name its key")); + } + } let mut declared = BTreeSet::new(); let mut roots = BTreeMap::new(); loop { @@ -2513,10 +2556,14 @@ pub(crate) fn check_transaction( return Err(wrong("An object declaration lacks its data")); }; let data = read(at)?; + let clear = match protection { + Some(protection) => protection.open_property(&data)?, + None => zeroize::Zeroizing::new(data.clone()), + }; let stored = crate::Object { jcid, reference_count: count, - data: ObjectData::Properties(&data), + data: ObjectData::Properties(&clear), global_ids: Arc::new(table.clone()), }; let references = stored.references()?; @@ -2525,11 +2572,14 @@ pub(crate) fn check_transaction( !references.object_spaces.is_empty() || !references.contexts.is_empty(), ) << 1); - if object.data != ObjectData::Properties(&data) + let hash = match protection { + Some(_) => crate::protected::digest(&clear), + None => md5::compute(&data).0, + }; + if object.data != ObjectData::Properties(&clear) || flags != Some(expected) || (item.id == 0xc5) != (jcid & 0x100000 != 0) - || (item.id == 0xc5 - && c.read::<16>()? != md5::compute(&data).0) + || (item.id == 0xc5 && c.read::<16>()? != hash) { return Err(wrong( "An object's stored bytes differ from its revision", @@ -2640,8 +2690,12 @@ pub(crate) fn check_transaction( return Err(wrong("A payload declaration lacks its data")); }; let data = read(at)?; - let blob = crate::files::payload(&data, at.offset as usize); - if node.id != 0x94 || node.payload != guid || blob.ok() != Some(*payload) { + let blob = crate::files::payload(&data, at.offset as usize)?; + let blob = match protection { + Some(protection) => protection.open_file(blob)?, + None => zeroize::Zeroizing::new(blob.to_vec()), + }; + if node.id != 0x94 || node.payload != guid || blob.as_slice() != *payload { return Err(wrong("An embedded payload differs from its declaration")); } } diff --git a/crates/onestore/tests/protected.rs b/crates/onestore/tests/protected.rs index 0cfe4a135dfd392f9cda9b269dc7fbd235b50033..597d45df2713783de91b385599da2003fd105ed4 100644 --- a/crates/onestore/tests/protected.rs +++ b/crates/onestore/tests/protected.rs @@ -1,52 +1,54 @@ -#![cfg(feature = "protected")] - use onestore::{ - RevisionIndex, Store, + Arena, ExGuid, RevisionIndex, Section, Store, document::{Document, Kind}, - op::{Edit, Op, PageOp}, - protected::{Error, Limits, UnlockedSection}, + op::{Edit, Op}, + page::Page, + protected::{Error, Key, Limits, UnlockedSection, rekey}, }; use std::{fs, path::Path}; +/// The native fixtures with their passwords. +fn fixtures() -> Vec<(Vec, String)> { + [ + ("native-encrypted", "encrypted-01/notebook/synthetic.one"), + ("native-protected-boundaries", "notebook/synthetic.one"), + ] + .into_iter() + .map(|(root, notebook)| { + let root = Path::new("../../corpus").join(root); + let manifest: serde_json::Value = + serde_json::from_slice(&fs::read(root.join("manifest.json")).unwrap()).unwrap(); + ( + fs::read(root.join(notebook)).unwrap(), + manifest["password"].as_str().unwrap().to_owned(), + ) + }) + .collect() +} + +/// Every page of a section `Section::open` or `Section::unlock` reads, in order. +fn pages(section: &mut Section<'_>) -> Vec<(ExGuid, Page)> { + section + .pages() + .unwrap() + .into_iter() + .map(|(space, ..)| (space, section.page(space).unwrap())) + .collect() +} + +fn objects(pages: &[(ExGuid, Page)]) -> Vec<&Vec> { + pages.iter().map(|(_, page)| &page.objects).collect() +} + #[test] fn known_passwords_open_independent_native_fixtures() { - for (root, notebook, pages) in [ - ("native-encrypted", "encrypted-01/notebook/synthetic.one", 1), - ("native-protected-boundaries", "notebook/synthetic.one", 11), - ] { - let root = Path::new("../../corpus").join(root); - let manifest: serde_json::Value = - serde_json::from_slice(&fs::read(root.join("manifest.json")).unwrap()).unwrap(); - let password = manifest["password"].as_str().unwrap(); - let bytes = fs::read(root.join(notebook)).unwrap(); - let before = bytes.clone(); + for ((bytes, password), count) in fixtures().into_iter().zip([1, 11]) { let store = Store::parse(&bytes).unwrap(); let index = RevisionIndex::parse(&store).unwrap(); assert!(Document::parse(&index).unwrap().pages().unwrap().is_empty()); - let unlocked = UnlockedSection::open(&index, password, Limits::default()).unwrap(); + let unlocked = UnlockedSection::open(&index, &password, Limits::default()).unwrap(); let document = unlocked.document().unwrap(); - assert_eq!(document.pages().unwrap().len(), pages); - let (space, _) = document.pages().unwrap()[0]; - let current = &document.spaces[&space]; - let revision = ¤t.revisions[¤t.contexts[&onestore::ExGuid::default()]]; - let (object, _) = revision - .nodes - .iter() - .find(|(_, node)| matches!(node.kind, Kind::RichText { .. })) - .unwrap(); - // The ordinary section writer refuses a protected section. - let arena = onestore::Arena::default(); - assert!(onestore::Section::open(&arena, bytes.clone()).is_err()); - let op = PageOp::Text { - text: *object, - range: 0..0, - with: "Must remain protected".into(), - }; - let edit = Edit { - at: 134_000_000_000_000_000, - ops: vec![Op::Page { space, op }], - }; - assert!(unlocked.apply("Rust", &edit).is_ok()); + assert_eq!(document.pages().unwrap().len(), count); assert!( document .spaces @@ -55,26 +57,26 @@ fn known_passwords_open_independent_native_fixtures() { .flat_map(|r| r.nodes.values()) .all(|n| !matches!(n.kind, Kind::Encrypted { .. })) ); + // A section opened under its key reads as the document does. + let arena = Arena::default(); + assert!(Section::open(&arena, bytes.clone()).is_err()); + let key = Key::open(&bytes, &password).unwrap(); + let mut section = Section::unlock(&arena, bytes.clone(), &key).unwrap(); + let read = pages(&mut section); + assert_eq!(read.len(), count); + for (space, page) in &read { + assert_eq!(*page, Page::from_space(&document, *space).unwrap()); + } assert!(matches!( - UnlockedSection::open( - &index, - "deliberately incorrect fixture password", - Limits::default() - ), + Key::open(&bytes, "deliberately incorrect fixture password"), Err(Error::PasswordMismatch) )); - assert!(Document::parse(&index).unwrap().pages().unwrap().is_empty()); - assert_eq!(bytes, before); } } #[test] fn limits_and_password_bytes_are_explicit() { - let root = Path::new("../../corpus/native-protected-boundaries"); - let manifest: serde_json::Value = - serde_json::from_slice(&fs::read(root.join("manifest.json")).unwrap()).unwrap(); - let password = manifest["password"].as_str().unwrap(); - let bytes = fs::read(root.join("notebook/synthetic.one")).unwrap(); + let (bytes, password) = fixtures().remove(1); let store = Store::parse(&bytes).unwrap(); let index = RevisionIndex::parse(&store).unwrap(); for limits in [ @@ -92,7 +94,7 @@ fn limits_and_password_bytes_are_explicit() { }, ] { assert!(matches!( - UnlockedSection::open(&index, password, limits), + UnlockedSection::open(&index, &password, limits), Err(Error::Limit) )); } @@ -102,111 +104,111 @@ fn limits_and_password_bytes_are_explicit() { password.to_uppercase(), ] { assert!(matches!( - UnlockedSection::open(&index, &changed, Limits::default()), + Key::open(&bytes, &changed), Err(Error::PasswordMismatch) )); } assert!(matches!( - UnlockedSection::open(&index, &"x".repeat(65537), Limits::default()), + Key::open(&bytes, &"x".repeat(65537)), Err(Error::Limit) )); let ordinary = onestore::create_section("ordinary.one", "Fictitious", "Author").unwrap(); - let store = Store::parse(&ordinary).unwrap(); - let index = RevisionIndex::parse(&store).unwrap(); assert!(matches!( - UnlockedSection::open(&index, password, Limits::default()), + Key::open(&ordinary, &password), Err(Error::Unsupported) )); + // A key opens only the section whose encryption data it came from. + let other = Key::new(&password).unwrap(); + assert!(matches!( + Section::unlock(&Arena::default(), bytes, &other), + Err(Error::PasswordMismatch) + )); } -/// The first text paragraph of every page gains text; the written file stays protected, -/// opens with the same password and reads back as the edited model. +/// Appends an attachment and text to the first text paragraph of `page`; none without one. +fn edit(space: ExGuid, page: &Page) -> Option<(Edit, Page)> { + use onestore::page::{Attachment, PageObject, Paragraph, ParagraphContent}; + let mut edited = page.clone(); + let paragraphs = edited.objects.iter_mut().find_map(|object| match object { + PageObject::Outline(outline) if outline.paragraphs.iter().any(|p| p.text().is_some()) => { + Some(&mut outline.paragraphs) + } + _ => None, + })?; + let at = paragraphs.iter().position(|p| p.text().is_some()).unwrap(); + let mut file = paragraphs[at].clone(); + file.id = onestore::page::text::new_id().unwrap(); + file.lists.clear(); + file.tags.clear(); + file.style = None; + file.format = Default::default(); + file.content = ParagraphContent::Attachment(Attachment { + id: onestore::page::text::new_id().unwrap(), + filename: "sealed.txt".into(), + source_path: None, + size: Some([24.0, 24.0]), + layout: Default::default(), + bytes: Some(std::sync::Arc::from(&b"A payload that stays sealed"[..])), + preview: None, + recording: None, + tags: Vec::new(), + }); + paragraphs.insert(at + 1, file); + let text = paragraphs[at].text_mut().unwrap(); + let format = text.text.format_at(0).unwrap().clone(); + text.text + .append(Paragraph::new(" still protected".to_owned(), format)) + .unwrap(); + let ops = onestore::op::lower_page(page, &edited).unwrap(); + let edit = Edit { + at: 134_000_000_000_000_000, + ops: ops.into_iter().map(|op| Op::Page { space, op }).collect(), + }; + Some((edit, edited)) +} + +/// Every revision of every space of `bytes` names its key, as MS-ONESTORE 2.5.19 asks. +fn keyed(bytes: &[u8]) -> bool { + let store = Store::parse(bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + index + .spaces + .values() + .flat_map(|space| space.revisions.values()) + .all(|revision| revision.encrypted && revision.nodes[0].id == 0x7c) +} + +/// The first text paragraph of every page gains text and an attachment; each seal appends +/// one revision to that page alone, stores none of it in the clear, and reads back as the +/// edited model under the same password. #[test] fn a_protected_page_edit_is_stored_under_the_section_key() { - use onestore::page::{Page, PageObject, Paragraph}; - for (root, notebook) in [ - ("native-encrypted", "encrypted-01/notebook/synthetic.one"), - ("native-protected-boundaries", "notebook/synthetic.one"), - ] { - let root = Path::new("../../corpus").join(root); - let manifest: serde_json::Value = - serde_json::from_slice(&fs::read(root.join("manifest.json")).unwrap()).unwrap(); - let password = manifest["password"].as_str().unwrap(); - let mut bytes = fs::read(root.join(notebook)).unwrap(); - let pages = |bytes: &[u8]| -> Vec<(onestore::ExGuid, Page)> { - let store = Store::parse(bytes).unwrap(); - let index = RevisionIndex::parse(&store).unwrap(); - assert!(Document::parse(&index).unwrap().pages().unwrap().is_empty()); - let unlocked = UnlockedSection::open(&index, password, Limits::default()).unwrap(); - let document = unlocked.document().unwrap(); - document - .pages() - .unwrap() - .into_iter() - .map(|(space, _)| (space, Page::from_space(&document, space).unwrap())) - .collect() - }; - let mut expected = pages(&bytes); + for (mut bytes, password) in fixtures() { + let key = Key::open(&bytes, &password).unwrap(); + let mut expected = + pages(&mut Section::unlock(&Arena::default(), bytes.clone(), &key).unwrap()); let mut edited = 0; for (space, page) in &mut expected { - let before = page.clone(); - let paragraphs = page.objects.iter_mut().find_map(|object| match object { - PageObject::Outline(outline) - if outline.paragraphs.iter().any(|p| p.text().is_some()) => - { - Some(&mut outline.paragraphs) - } - _ => None, - }); - let Some(paragraphs) = paragraphs else { + let Some((edit, after)) = edit(*space, page) else { continue; }; + *page = after; edited += 1; - let at = paragraphs.iter().position(|p| p.text().is_some()).unwrap(); - let mut file = paragraphs[at].clone(); - file.id = onestore::page::text::new_id().unwrap(); - file.lists.clear(); - file.tags.clear(); - file.style = None; - file.format = Default::default(); - file.content = - onestore::page::ParagraphContent::Attachment(onestore::page::Attachment { - id: onestore::page::text::new_id().unwrap(), - filename: "sealed.txt".into(), - source_path: None, - size: Some([24.0, 24.0]), - layout: Default::default(), - bytes: Some(std::sync::Arc::from(&b"A payload that stays sealed"[..])), - preview: None, - recording: None, - tags: Vec::new(), - }); - paragraphs.insert(at + 1, file); - let text = paragraphs[at].text_mut().unwrap(); - let format = text.text.format_at(0).unwrap().clone(); - text.text - .append(Paragraph::new(" still protected".to_owned(), format)) - .unwrap(); - let ops = onestore::op::lower_page(&before, page).unwrap(); - let edit = Edit { - at: 134_000_000_000_000_000, - ops: ops - .into_iter() - .map(|op| Op::Page { space: *space, op }) - .collect(), - }; - let store = Store::parse(&bytes).unwrap(); - let index = RevisionIndex::parse(&store).unwrap(); - assert!(matches!( - UnlockedSection::open(&index, "wrong", Limits::default()), - Err(Error::PasswordMismatch) - )); - let unlocked = UnlockedSection::open(&index, password, Limits::default()).unwrap(); - let transaction = unlocked.apply("Rust", &edit).unwrap(); + let arena = Arena::default(); + let mut section = Section::unlock(&arena, bytes.clone(), &key).unwrap(); + section.apply("Rust", &edit).unwrap(); + let transaction = section.seal().unwrap().unwrap(); let mut written = bytes.clone(); transaction.apply(&mut written).unwrap(); + assert_eq!(written, section.image()); for clear in [&b" still protected"[..], b"stays sealed"] { - assert!(!written.windows(clear.len()).any(|w| w == clear)); + let utf16: Vec = String::from_utf8_lossy(clear) + .encode_utf16() + .flat_map(u16::to_le_bytes) + .collect(); + for clear in [clear, &utf16[..]] { + assert!(!written.windows(clear.len()).any(|w| w == clear)); + } } let revisions = |bytes: &[u8]| { let store = Store::parse(bytes).unwrap(); @@ -224,13 +226,23 @@ fn a_protected_page_edit_is_stored_under_the_section_key() { .map(|(before, _)| before.0) .collect(); assert_eq!(grown, [*space]); + // The section kept open reads its own seal back. + assert_eq!(section.page(*space).unwrap().objects, page.objects); bytes = written; } assert!(edited > 0); - let stored = pages(&bytes); - assert_eq!(stored.len(), expected.len()); - for ((_, stored), (_, expected)) in stored.iter().zip(&expected) { - assert_eq!(stored.objects, expected.objects); + let stored = pages(&mut Section::unlock(&Arena::default(), bytes.clone(), &key).unwrap()); + assert_eq!(objects(&stored), objects(&expected)); + // The document reader agrees, under the password alone. + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let unlocked = UnlockedSection::open(&index, &password, Limits::default()).unwrap(); + let document = unlocked.document().unwrap(); + for (space, page) in &expected { + assert_eq!( + Page::from_space(&document, *space).unwrap().objects, + page.objects + ); } } } @@ -239,9 +251,7 @@ fn a_protected_page_edit_is_stored_under_the_section_key() { #[test] fn a_native_revision_inherits_the_key_of_its_dependency() { let bytes = fs::read("../../corpus/protected-edit/native-after/synthetic.one").unwrap(); - let manifest: serde_json::Value = - serde_json::from_slice(&fs::read("../../corpus/native-encrypted/manifest.json").unwrap()) - .unwrap(); + let (_, password) = fixtures().remove(0); let store = Store::parse(&bytes).unwrap(); let index = RevisionIndex::parse(&store).unwrap(); assert!(index.spaces.values().any(|space| { @@ -249,14 +259,149 @@ fn a_native_revision_inherits_the_key_of_its_dependency() { revision.encrypted && revision.nodes.first().is_none_or(|node| node.id != 0x7c) }) })); - let unlocked = UnlockedSection::open( - &index, - manifest["password"].as_str().unwrap(), - Limits::default(), - ) - .unwrap(); - let document = unlocked.document().unwrap(); - let (space, _) = document.pages().unwrap()[0]; - let page = onestore::page::Page::from_space(&document, space).unwrap(); - assert!(format!("{:?}", page.objects).contains("Native edit after Rust.")); + let key = Key::open(&bytes, &password).unwrap(); + let read = pages(&mut Section::unlock(&Arena::default(), bytes, &key).unwrap()); + assert!(format!("{:?}", read[0].1.objects).contains("Native edit after Rust.")); +} + +/// Setting, changing and removing a password rewrites the section under new identities, +/// keeping every page, version and payload; each password opens only its own image. +#[test] +fn a_password_is_set_changed_and_removed() { + let plain = fs::read("../../corpus/page-versions/native/step-09/notebook/History.one").unwrap(); + let arena = Arena::default(); + let mut section = Section::open(&arena, plain.clone()).unwrap(); + let before = pages(&mut section); + let versions = section.versions().unwrap(); + assert!(!versions.is_empty()); + let identity = |bytes: &[u8]| { + let store = Store::parse(bytes).unwrap(); + ( + store.header.file_id, + RevisionIndex::parse(&store).unwrap().root, + ) + }; + + let first = Key::new("first password").unwrap(); + let protected = rekey(&plain, None, Some(&first)).unwrap(); + assert!(keyed(&protected)); + assert_eq!(protected[128..148], plain[128..148]); + assert_ne!(identity(&protected).0, identity(&plain).0); + assert_ne!(identity(&protected).1, identity(&plain).1); + assert!(Section::open(&Arena::default(), protected.clone()).is_err()); + // The encryption data OneNote writes, which the password alone opens again. + let reopened = Key::open(&protected, "first password").unwrap(); + assert_eq!(reopened.secret(), first.secret()); + assert!(matches!( + Key::open(&protected, "First password"), + Err(Error::PasswordMismatch) + )); + let arena = Arena::default(); + let mut section = Section::unlock(&arena, protected.clone(), &reopened).unwrap(); + assert_eq!(objects(&pages(&mut section)), objects(&before)); + assert_eq!( + section + .versions() + .unwrap() + .iter() + .map(|(_, versions)| versions.len()) + .collect::>(), + versions + .iter() + .map(|(_, versions)| versions.len()) + .collect::>() + ); + let store = Store::parse(&protected).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let unlocked = UnlockedSection::open(&index, "first password", Limits::default()).unwrap(); + assert_eq!( + unlocked.document().unwrap().pages().unwrap().len(), + before.len() + ); + + let second = Key::new("second password").unwrap(); + assert!(matches!( + rekey(&protected, None, Some(&second)), + Err(Error::PasswordMismatch) + )); + let changed = rekey(&protected, Some(&first), Some(&second)).unwrap(); + assert_ne!(first.secret(), second.secret()); + assert!(matches!( + Key::open(&changed, "first password"), + Err(Error::PasswordMismatch) + )); + assert!(matches!( + Section::unlock(&Arena::default(), changed.clone(), &first), + Err(Error::PasswordMismatch) + )); + let arena = Arena::default(); + let mut section = Section::unlock(&arena, changed.clone(), &second).unwrap(); + assert_eq!(objects(&pages(&mut section)), objects(&before)); + + let removed = rekey(&changed, Some(&second), None).unwrap(); + assert!( + RevisionIndex::parse(&Store::parse(&removed).unwrap()) + .unwrap() + .spaces + .values() + .flat_map(|space| space.revisions.values()) + .all(|revision| !revision.encrypted) + ); + let arena = Arena::default(); + let mut section = Section::open(&arena, removed).unwrap(); + assert_eq!(objects(&pages(&mut section)), objects(&before)); + assert_eq!(section.versions().unwrap().len(), versions.len()); +} + +/// Payloads survive a password of their own: every native attachment boundary length. +#[test] +fn payloads_survive_a_new_password() { + let (bytes, password) = fixtures().remove(1); + let key = Key::open(&bytes, &password).unwrap(); + let before = pages(&mut Section::unlock(&Arena::default(), bytes.clone(), &key).unwrap()); + let new = Key::new("another").unwrap(); + let changed = rekey(&bytes, Some(&key), Some(&new)).unwrap(); + let after = pages(&mut Section::unlock(&Arena::default(), changed, &new).unwrap()); + assert_eq!(objects(&after), objects(&before)); +} + +/// What OneNote 2010 wrote setting, changing and removing a password in the lab, and its edit +/// of a section Snowbound protected, edited and gave another password, each read here. +#[test] +fn onenote_protected_changed_and_removed_sections_read_back() { + let root = Path::new("../../corpus/protected-sections"); + let manifest: serde_json::Value = + serde_json::from_slice(&fs::read(root.join("manifest.json")).unwrap()).unwrap(); + let plain = fs::read(root.join("source/synthetic.one")).unwrap(); + let titles = |section: &mut Section<'_>| -> Vec { + section + .pages() + .unwrap() + .into_iter() + .map(|(_, title, _)| title) + .collect() + }; + let expected = titles(&mut Section::open(&Arena::default(), plain).unwrap()); + assert_eq!(expected.len(), 2); + for (file, password) in manifest["native"].as_object().unwrap() { + let bytes = fs::read(root.join("native").join(file)).unwrap(); + let arena = Arena::default(); + let mut section = match password.as_str() { + Some(password) => { + let key = Key::open(&bytes, password).unwrap(); + assert!(Section::open(&Arena::default(), bytes.clone()).is_err()); + Section::unlock(&arena, bytes, &key).unwrap() + } + None => Section::open(&arena, bytes).unwrap(), + }; + let read = titles(&mut section); + assert_eq!(read.len(), 2, "{file}"); + if file.starts_with("snowbound") { + let (space, ..) = section.pages().unwrap()[0]; + let page = format!("{:?}", section.page(space).unwrap().objects); + assert!(page.contains("typed by OneNote"), "{file}"); + } else { + assert_eq!(read, expected, "{file}"); + } + } } diff --git a/crates/snowbound/Cargo.toml b/crates/snowbound/Cargo.toml index ce1831e53f3b44c9059a51f0cf9bdb7fbe622be6..bb9f15f76372692676bd06ecb1bc1303d1ce4474 100644 --- a/crates/snowbound/Cargo.toml +++ b/crates/snowbound/Cargo.toml @@ -31,6 +31,8 @@ accesskit_winit = { version = "0.34.0", default-features = false, features = ["r # Updates: fetched over HTTPS, verified with ed25519 and SHA-256. ureq = { version = "3.4", default-features = false, features = ["rustls"] } ring = "0.17" +# Clears passwords typed into the password dialogs. +zeroize = "1.9.0" [target.'cfg(target_os = "macos")'.dependencies] libc = "0.2" diff --git a/crates/snowbound/assets/icons/info.svg b/crates/snowbound/assets/icons/info.svg new file mode 100644 index 0000000000000000000000000000000000000000..72c38283cd647174a0d5e8b85d5bef7a94afd19c --- /dev/null +++ b/crates/snowbound/assets/icons/info.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/crates/snowbound/assets/icons/warning.svg b/crates/snowbound/assets/icons/warning.svg new file mode 100644 index 0000000000000000000000000000000000000000..7a2439cc201a6a7bacec72ea7a2d6ec5511c2209 --- /dev/null +++ b/crates/snowbound/assets/icons/warning.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/crates/snowbound/linux/onenote.xml b/crates/snowbound/linux/onenote.xml index ce77b5a79d8fc04c0e149428eec7fc065da419e3..d085e40083015e2df1b07a3cd19c12160e7cf59a 100644 --- a/crates/snowbound/linux/onenote.xml +++ b/crates/snowbound/linux/onenote.xml @@ -5,5 +5,6 @@ + diff --git a/crates/snowbound/linux/package.sh b/crates/snowbound/linux/package.sh index fa7b4d5a86b8b209c74e60c0fb5e99ea34fb4beb..10610342cc8e1fc9c2a0f6f80a40b633b02b374d 100755 --- a/crates/snowbound/linux/package.sh +++ b/crates/snowbound/linux/package.sh @@ -1,39 +1,17 @@ #!/bin/sh # Builds target/dist/snowbound-linux-ARCH.tar.gz for each ARCH given (x86_64, aarch64; -# both by default), cross-linking with zig so it runs from macOS or Linux. +# both by default), cross-linking with zig (`platform/linux/cargo.sh`) so it runs from macOS or Linux. set -eu root=$(cd "$(dirname "$0")/../../.." && pwd) here="$root/crates/snowbound/linux" target="$root/target" -tools="$target/zig" -mkdir -p "$tools" "$target/dist" -command -v zig >/dev/null || { echo "zig is required as the cross linker" >&2; exit 1; } - -printf '#!/bin/sh\nexec zig ar "$@"\n' > "$tools/ar" -chmod +x "$tools/ar" +mkdir -p "$target/dist" [ $# -gt 0 ] || set -- x86_64 aarch64 for arch do triple=$arch-unknown-linux-gnu - variable=$(echo "$triple" | tr 'a-z-' 'A-Z_') - linker="$tools/cc-$arch" - # glibc 2.17, Rust's own floor, reaches back to RHEL 7, Debian 8 and Ubuntu 14.04; zig - # rejects rustc's --target, --no-undefined-version and -O1. - cat > "$linker" </dev/null - env "CARGO_TARGET_${variable}_LINKER=$linker" \ - "CC_$(echo "$triple" | tr - _)=$linker" \ - "AR_$(echo "$triple" | tr - _)=$tools/ar" \ - CARGO_PROFILE_RELEASE_STRIP=symbols \ - cargo build --manifest-path "$root/Cargo.toml" --release --target "$triple" -p snowbound + CARGO_PROFILE_RELEASE_STRIP=symbols sh "$root/platform/linux/cargo.sh" "$arch" build \ + --manifest-path "$root/Cargo.toml" --release -p snowbound name=snowbound-linux-$arch stage="$target/dist/$name" diff --git a/crates/snowbound/src/aqua.rs b/crates/snowbound/src/aqua.rs index b3609539cd44fa1e2a4ba81e4d11d20859f0c0e6..b168d63705560d4cc1e60df9e994eafd66d1231d 100644 --- a/crates/snowbound/src/aqua.rs +++ b/crates/snowbound/src/aqua.rs @@ -17,10 +17,7 @@ use std::{ sync::atomic::{AtomicBool, Ordering}, }; use ui::{Axis, PaintedScroller, Scroller, ScrollerPart}; -use winit::{ - raw_window_handle::{HasWindowHandle, RawWindowHandle}, - window::{CursorIcon, Window}, -}; +use winit::window::{CursorIcon, Window}; static PRETEND: AtomicBool = AtomicBool::new(false); @@ -49,14 +46,8 @@ pub fn textured(window: &Window, row: f32) -> bool { return false; } TEXTURED.store(true, Ordering::Relaxed); - let RawWindowHandle::AppKit(handle) = - window.window_handle().expect("Live AppKit window").as_raw() - else { - unreachable!() - }; + let window = crate::platform::ns_window(window); unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); - let window: Retained = msg_send_id![view, window]; let title: Retained = msg_send_id![&window, title]; let mask: usize = msg_send![&window, styleMask]; // NSTexturedBackgroundWindowMask. @@ -450,16 +441,8 @@ pub fn resize_grip(ui: &mut ui::Ui, window: &Window, size: [f32; 2]) { } static HIDDEN: std::sync::Once = std::sync::Once::new(); HIDDEN.call_once(|| { - let RawWindowHandle::AppKit(handle) = - window.window_handle().expect("Live AppKit window").as_raw() - else { - unreachable!() - }; - unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); - let window: Retained = msg_send_id![view, window]; - let _: () = msg_send![&window, setShowsResizeIndicator: false]; - } + let window = crate::platform::ns_window(window); + let _: () = unsafe { msg_send![&window, setShowsResizeIndicator: false] }; }); thread_local! { static GRIP: draw::RasterImage = { diff --git a/crates/snowbound/src/art.rs b/crates/snowbound/src/art.rs index 932c3b08551e5ca5a90e440750eb5a16c2144e3f..88d3ad5095f03532c027cec6f37bbcd6ef701166 100644 --- a/crates/snowbound/src/art.rs +++ b/crates/snowbound/src/art.rs @@ -24,6 +24,7 @@ pub const ICLOUD: &[&str] = art!("icons/icloud"); pub const FONT_COLOR: &[&str] = art!("icons/font-color"); pub const HIGHLIGHTER: &[&str] = art!("icons/highlighter"); pub const INDENT: &[&str] = art!("icons/indent"); +pub const INFO: &[&str] = art!("icons/info"); pub const ITALIC: &[&str] = art!("icons/italic"); pub const LINK: &[&str] = art!("icons/link"); pub const NOTEBOOK: &[&str] = art!("icons/notebook"); @@ -46,6 +47,7 @@ pub const SUBSCRIPT: &[&str] = art!("icons/subscript"); pub const SUPERSCRIPT: &[&str] = art!("icons/superscript"); pub const TABLE: &[&str] = art!("icons/table"); pub const UNDERLINE: &[&str] = art!("icons/underline"); +pub const WARNING: &[&str] = art!("icons/warning"); pub const UNDO: &[&str] = art!("icons/undo"); pub const ZOOM_IN: &[&str] = art!("icons/zoom-in"); pub const ZOOM_OUT: &[&str] = art!("icons/zoom-out"); diff --git a/crates/snowbound/src/commands.rs b/crates/snowbound/src/commands.rs index 42ce6b730edd494d8b9aa0acdd5f724d9eb09e1a..7a4214dda37361482278b682d2b97609a95fb65e 100644 --- a/crates/snowbound/src/commands.rs +++ b/crates/snowbound/src/commands.rs @@ -26,7 +26,22 @@ pub enum Id { NewSubpage, PageVersions, CopyPageLink, + /// Password Protection on the section shown. + PasswordProtect, + /// Locks every password-protected section unlocked. + LockAll, ShowNotebook, + /// Save As: the page, section or notebook as a OneNote section, package or PDF. + SaveAs, + /// The notebook's recycle bin, shown in place of its sections, or left. + RecycleBin, + EmptyRecycleBin, + /// Marks the page shown read, or unread. + MarkRead, + MarkNotebookRead, + /// Show Unread Changes in This Notebook. + ShowUnread, + NextUnread, ExportPdf, Print, Undo, @@ -238,6 +253,18 @@ pub const COMMANDS: &[Command] = &[ ), row!(Id::PageVersions, "Page Versions", NONE, NONE), row!(Id::CopyPageLink, "Copy Link to Page", NONE, NONE), + row!( + Id::PasswordProtect, + "Password Protect This Section…", + NONE, + NONE + ), + row!( + Id::LockAll, + "Lock All Sections", + &[cmd('l').option()], + &[cmd('l').option()] + ), row!( Id::ShowNotebook, if cfg!(target_os = "macos") { @@ -248,6 +275,24 @@ pub const COMMANDS: &[Command] = &[ NONE, NONE, ), + row!( + Id::SaveAs, + "Save As…", + &[cmd('s').shift()], + &[cmd('s').shift()] + ), + row!(Id::RecycleBin, "Notebook Recycle Bin", NONE, NONE), + row!(Id::EmptyRecycleBin, "Empty Recycle Bin", NONE, NONE), + // OneNote 2010's Ctrl+Q; macOS keeps Command-Q for Quit. + row!(Id::MarkRead, "Mark as Read", NONE, &[cmd('q')]), + row!(Id::MarkNotebookRead, "Mark Notebook as Read", NONE, NONE), + row!( + Id::ShowUnread, + "Show Unread Changes in This Notebook", + NONE, + NONE + ), + row!(Id::NextUnread, "Next Unread", NONE, NONE), row!(Id::ExportPdf, "Export as PDF…", NONE, NONE), // Go to takes OneNote's Ctrl+P, and Pause its Ctrl+Alt+P. row!( @@ -1003,7 +1048,7 @@ impl State { /// ⌘K, to the open palette's actions. pub(crate) fn statuses(&self) -> Vec { // A chord Options records reaches it past the menu bar's disabled items. - if self.recording_chord() { + if (self.options.as_ref()).is_some_and(|options| options.keyboard.recording()) { return vec![Status::default(); choices().count()]; } let format = self.format_state(); @@ -1020,6 +1065,7 @@ impl State { let session = self.session.as_ref(); let welcome = session.is_none() && !self.temporary && self.sectionless.is_none(); let modal = self.options.is_some() + || self.password.is_some() || self.themes.is_some() || self.printing.open() || self.link.is_some() @@ -1071,6 +1117,39 @@ impl State { | Id::Help | Id::CheckForUpdates => enabled(!modal), Id::CloseNotebook => enabled(!modal && self.notebook().is_some()), + Id::PasswordProtect => enabled(!modal && self.shown_section().is_some()), + Id::SaveAs => enabled(!modal && self.notebook().is_some()), + Id::RecycleBin => Status { + enabled: !modal + && self + .notebook() + .is_some_and(|library| library.catalog().is_some()), + checked: Some(self.in_recycle_bin()), + }, + Id::EmptyRecycleBin => enabled( + !modal + && self + .notebook() + .is_some_and(|library| !library.tabs(crate::recycle::BIN).is_empty()), + ), + Id::MarkRead => Status { + enabled: !modal && session.is_some() && !self.in_recycle_bin(), + checked: Some(!self.page_unread()), + }, + Id::MarkNotebookRead | Id::NextUnread => enabled( + !modal + && self + .notebook() + .is_some_and(|library| self.unread_notebook(library)), + ), + Id::ShowUnread => Status { + enabled: !modal && self.notebook().is_some(), + checked: Some( + self.notebook() + .is_some_and(|library| self.reads.shown(&library.location)), + ), + }, + Id::LockAll => enabled(!modal), Id::ShowNotebook => enabled( !modal && self @@ -1083,13 +1162,13 @@ impl State { .notebook() .is_some_and(|library| library.catalog().is_some()), ), - Id::NewPage - | Id::NewSubpage - | Id::CopyPageLink - | Id::Find - | Id::Search - | Id::ExportPdf - | Id::Print => enabled(!modal && session.is_some()), + // The recycle bin takes no new pages. + Id::NewPage | Id::NewSubpage => { + enabled(!modal && session.is_some() && !self.in_recycle_bin()) + } + Id::CopyPageLink | Id::Find | Id::Search | Id::ExportPdf | Id::Print => { + enabled(!modal && session.is_some()) + } Id::PageVersions => session.filter(|_| !modal).map_or( Status { enabled: false, @@ -1338,6 +1417,40 @@ impl State { platform::reveal(&self.notebook().ok_or("No notebook is open")?.location); return Ok(()); } + Id::PasswordProtect => { + let (library, path) = self.shown_section().ok_or("No section is open")?; + self.password_protection(library, path); + return Ok(()); + } + Id::LockAll => return self.lock_all(), + Id::SaveAs => { + let library = Arc::clone(self.notebook().ok_or("No notebook is open")?); + let scope = if self.session.is_some() { + crate::save_as::Scope::Page + } else { + crate::save_as::Scope::Notebook + }; + self.open_save_as(library, None, scope); + return Ok(()); + } + Id::RecycleBin | Id::EmptyRecycleBin | Id::MarkNotebookRead | Id::ShowUnread => { + let library = Arc::clone(self.notebook().ok_or("No notebook is open")?); + match id { + Id::RecycleBin => self.toggle_recycle_bin(library), + Id::EmptyRecycleBin => self.empty_recycle_bin(library), + Id::MarkNotebookRead => self.mark_notebook_read(&library), + _ => self.toggle_unread_shown(&library), + } + return Ok(()); + } + Id::MarkRead => { + self.toggle_read(); + return Ok(()); + } + Id::NextUnread => { + self.next_unread(); + return Ok(()); + } Id::ExportPdf | Id::Print => { self.open_print(id == Id::ExportPdf); return Ok(()); diff --git a/crates/snowbound/src/conflict_render.rs b/crates/snowbound/src/conflict_render.rs index d0605d76e734b2328541b237b7b35b105ea755e2..1920946e5548f70788e3770972b8908c8f96ada2 100644 --- a/crates/snowbound/src/conflict_render.rs +++ b/crates/snowbound/src/conflict_render.rs @@ -64,7 +64,7 @@ fn layout(ui: &mut Ui, session: &Session, menu: bool) -> Vec { &theme, §ion, session, - &HashSet::new(), + [&HashSet::new(); 2], (0.0, false), None, None, diff --git a/crates/snowbound/src/desktop_linux.rs b/crates/snowbound/src/desktop_linux.rs index 8ef12227f170e360ec127dd9eadb2bcc9bd733f8..6441d75197be2470ca28f94347d63fe86de2ee40 100644 --- a/crates/snowbound/src/desktop_linux.rs +++ b/crates/snowbound/src/desktop_linux.rs @@ -36,7 +36,7 @@ use winit::{ /// Wayland's app ID and X11's WM_CLASS, which name the desktop entry and the icon. pub const APP_ID: &str = "net.paperclover.snowbound"; const TEMPLATE: &str = include_str!("../linux/snowbound.desktop"); -/// The type of `.one` and `.onetoc2` files, which no shared-mime-info release names. +/// The type of `.one`, `.onetoc2` and `.onepkg` files, which no shared-mime-info release names. const MIME_TYPES: &str = include_str!("../linux/onenote.xml"); /// 512 pixels square; the smaller sizes are scaled from it. const ICON: &[u8] = include_bytes!("../linux/snowbound.png"); diff --git a/crates/snowbound/src/history.rs b/crates/snowbound/src/history.rs index e1cbe2581fb5fd6749d1be89a1cc234c6e32d445..b18c231bc475a2bae92327f84083191e0e8cad7c 100644 --- a/crates/snowbound/src/history.rs +++ b/crates/snowbound/src/history.rs @@ -23,9 +23,12 @@ impl Session { .map_or(&[], |(_, versions)| versions) } - /// Whether the open page takes no edits: a conflict page or a version. + /// Whether the open page takes no edits: a conflict page, a version, or a page of the + /// recycle bin. pub(crate) fn read_only(&self) -> bool { - self.version.is_some() || self.conflict(self.space).is_some() + self.version.is_some() + || self.conflict(self.space).is_some() + || crate::recycle::binned(&self.tabs[self.tab].path) } /// Version `version` of page `space` as the editor shows it: read-only, what it changed @@ -166,6 +169,7 @@ impl State { .section .restore_version(page, version, &self.author)?; session.refresh_history()?; + self.edited(vec![page]); self.commands.push(Command::OpenPage(page)); Ok(()) } @@ -207,19 +211,7 @@ impl State { ) { return Ok(()); } - let all: Vec<(ExGuid, Vec)> = session - .history - .iter() - .map(|(page, versions)| { - ( - *page, - versions.iter().map(|version| version.context).collect(), - ) - }) - .collect(); - if !all.is_empty() { - session.section.delete_versions(&all)?; - } + clear(&session.section)?; session.refresh_history()?; if session.version.is_some() { self.commands.push(Command::OpenPage(session.space)); @@ -242,22 +234,7 @@ impl State { let cleared = library .open(&path, notify(proxy.clone())) .and_then(|section| { - let all: Vec<(ExGuid, Vec)> = section - .versions()? - .into_iter() - .map(|(page, versions)| { - ( - page, - versions - .into_iter() - .map(|version| version.context) - .collect(), - ) - }) - .collect(); - if !all.is_empty() { - section.delete_versions(&all)?; - } + clear(§ion)?; Ok(section.close()?) }); if let Err(error) = cleared { @@ -269,31 +246,36 @@ impl State { } } +/// Deletes every page version `section` holds. +fn clear(section: ¬ebook::session::Section) -> Result<(), notebook::Error> { + let all: Vec<(ExGuid, Vec)> = (section.versions()?.into_iter()) + .map(|(page, versions)| { + ( + page, + versions.iter().map(|version| version.context).collect(), + ) + }) + .collect(); + if !all.is_empty() { + section.delete_versions(&all)?; + } + Ok(()) +} + /// The readable sections at catalog path `folder` and in the groups inside it, leaving out /// the recycle bin. fn sections(library: &Library, folder: &str) -> Vec { let Some(catalog) = library.catalog() else { return vec![library.location.clone()]; }; - let mut pending = vec![catalog]; - let mut root = None; - while let Some(candidate) = pending.pop() { - if candidate.path == folder { - root = Some(candidate); - break; - } - pending.extend(&candidate.groups); - } - let mut pending: Vec<_> = root.into_iter().collect(); - let mut paths = Vec::new(); - while let Some(folder) = pending.pop() { - paths.extend(library.tabs(&folder.path).into_iter().map(|tab| tab.path)); - pending.extend( - folder - .groups - .iter() - .filter(|group| !library::recycle_bin(&group.path)), - ); - } - paths + let root = library::folders(catalog, |_| true) + .into_iter() + .find(|candidate| candidate.path == folder); + root.map_or_else(Vec::new, |root| { + library::folders(root, |group| !library::recycle_bin(&group.path)) + }) + .into_iter() + .flat_map(|folder| library.tabs(&folder.path)) + .map(|tab| tab.path) + .collect() } diff --git a/crates/snowbound/src/icloud_linux.rs b/crates/snowbound/src/icloud_linux.rs index c195b985b382f0fe78fe86c4426e0dd5aedf503f..ba171f1840ffecbae43ddadcd6c4204bf2b7b494 100644 --- a/crates/snowbound/src/icloud_linux.rs +++ b/crates/snowbound/src/icloud_linux.rs @@ -25,9 +25,13 @@ pub fn section( notebook: &Notebook, _: &Path, path: &str, + key: Option<&onestore::protected::Key>, notify: impl Fn() + Send + 'static, ) -> Result { - notebook.section(path, notify) + match key { + Some(key) => notebook.section_unlocked(path, key, notify), + None => notebook.section(path, notify), + } } pub fn lone_section( diff --git a/crates/snowbound/src/icloud_macos.rs b/crates/snowbound/src/icloud_macos.rs index b02b53b9533ccd82b990fe91f869b09a29f34c31..abbe1410faf3e911dde64e16e441bf286ba87fed 100644 --- a/crates/snowbound/src/icloud_macos.rs +++ b/crates/snowbound/src/icloud_macos.rs @@ -363,12 +363,17 @@ pub fn section( notebook: &Notebook, root: &Path, path: &str, + key: Option<&onestore::protected::Key>, notify: impl Fn() + Send + 'static, ) -> Result { if !notebook.replica_path(path)?.exists() { fetch(&root.join(path))?; } - let section = notebook.section_with(path, |file| Ok(Coordinated(file.to_owned())), notify)?; + let connect = |file: &Path| Ok(Coordinated(file.to_owned())); + let section = match key { + Some(key) => notebook.section_unlocked_with(path, key, connect, notify)?, + None => notebook.section_with(path, connect, notify)?, + }; section.set_pause(PAUSE); Ok(section) } @@ -576,7 +581,7 @@ mod tests { let notebook = Notebook::create(&root, &cache, Notebook::NEW_COLOR, &page).unwrap(); assert!(ubiquitous(&root)); let path = notebook.catalog().sections[0].path.clone(); - let section = section(¬ebook, &root, &path, || {}).unwrap(); + let section = section(¬ebook, &root, &path, None, || {}).unwrap(); let (space, ..) = section.pages().unwrap()[0].clone(); let title = section .page(space) diff --git a/crates/snowbound/src/keys.rs b/crates/snowbound/src/keys.rs index aaa39dc4df6d50f87fa80215ce8033156807bf7c..e167d7eb0232484c4ddf8f35b8d4827ea58dfc7c 100644 --- a/crates/snowbound/src/keys.rs +++ b/crates/snowbound/src/keys.rs @@ -78,7 +78,7 @@ fn label(chord: Chord) -> String { fn title(id: Command) -> String { match id { Command::Tag(place) => format!("Tag {}", place + 1), - id => commands::command(id).title.trim_end_matches('…').to_owned(), + id => crate::title(id).to_owned(), } } @@ -430,13 +430,6 @@ impl crate::State { taken } - /// Whether Options is recording a chord, which the menu bar must then leave to it. - pub(crate) fn recording_chord(&self) -> bool { - self.options - .as_ref() - .is_some_and(|options| options.keyboard.recording()) - } - /// Puts `keymap` in use, and in the menu bar where it changes. pub(crate) fn install_keymap(&self, keymap: Keymap) { if keymap.install() { diff --git a/crates/snowbound/src/library.rs b/crates/snowbound/src/library.rs index fcfe45dff9be0371c87d1c7b371aea8edc394934..95c278c47562f9b6463fcc404c78a404fb205120 100644 --- a/crates/snowbound/src/library.rs +++ b/crates/snowbound/src/library.rs @@ -5,6 +5,7 @@ use notebook::discover::{Folder, SectionState}; use notebook::session::{Background, Notebook, Section}; use notebook::sidecar::themes::Themes; use notebook::smb::{Client, Credentials}; +use onestore::protected::Key; use std::{ error::Error, io, @@ -151,14 +152,14 @@ impl Mount { let mut url = String::from("smb://"); if let Some(user) = &self.user { if !self.domain.is_empty() { - url += &format!("{};", encode(&self.domain)); + url += &format!("{};", encode(self.domain.as_bytes())); } - url += &format!("{}@", encode(user)); + url += &format!("{}@", encode(user.as_bytes())); } url += &self.server; for part in [&self.share, &self.root] { if !part.is_empty() { - url += &format!("/{}", encode(part)); + url += &format!("/{}", encode(part.as_bytes())); } } url @@ -232,10 +233,11 @@ fn decode(text: &str) -> String { String::from_utf8_lossy(&decoded).into_owned() } -/// `text` escaped for an address, `/` kept. -fn encode(text: &str) -> String { - text.bytes() - .map(|byte| match byte { +/// `bytes` escaped for an address, outside RFC 3986's unreserved set and `/`. +pub(crate) fn encode(bytes: &[u8]) -> String { + bytes + .iter() + .map(|&byte| match byte { b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'.' | b'_' | b'~' | b'/' => { char::from(byte).to_string() } @@ -318,9 +320,34 @@ pub struct Library { kept: Mutex>, /// The notebook's style themes, and when they were read. themes: Mutex)>>, + /// The keys of its password-protected sections unlocked this run, kept as it is read again. + keys: Arc, } +/// Keys of password-protected sections, by file identity, with when each section was last +/// worked in; in memory only, each cleared as it goes. +#[derive(Default)] +pub struct Keys(Mutex>); + impl Library { + /// `location` named `name`, with no notebook read, server, sync or kept sections. + fn new(location: &str, name: String, cache: &Path) -> Self { + Self { + location: location.to_owned(), + name, + notebook: Ok(None), + server: None, + notice: None, + cache: cache.to_owned(), + background: None, + watch: None, + tag_art: Default::default(), + kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), + themes: Default::default(), + keys: Default::default(), + } + } + /// The notebook in the folder at `location`, or why it cannot be read. A folder on a /// mounted SMB share opens through Snowbound's own SMB client, signed in with the /// account the system keeps for the mount, as OneNote's own client coordinates with @@ -333,18 +360,12 @@ impl Library { }; return login .and_then(|login| Self::on_share(location, mount.clone(), login, cache)) - .unwrap_or_else(|reason| Self { - location: location.to_owned(), - name: display_name(cache, location).unwrap_or_else(|| mount.name()), - notebook: Err(reason), - server: None, - notice: None, - cache: cache.to_owned(), - background: None, - watch: None, - tag_art: Default::default(), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), + .unwrap_or_else(|reason| { + let name = display_name(cache, location).unwrap_or_else(|| mount.name()); + Self { + notebook: Err(reason), + ..Self::new(location, name, cache) + } }); } let mut notice = None; @@ -364,20 +385,16 @@ impl Library { Ok(notebook) => local_background(notebook, location), Err(_) => (None, None), }; + let name = display_name(cache, location).unwrap_or_else(|| file_name(Path::new(location))); Self { - location: location.to_owned(), - name: display_name(cache, location).unwrap_or_else(|| file_name(Path::new(location))), background, watch, tag_art: Mutex::new(Arc::new( notebook.as_ref().map(read_tag_art).unwrap_or_default(), )), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), notebook: notebook.map(Some).map_err(|error| error.to_string()), - server: None, notice, - cache: cache.to_owned(), + ..Self::new(location, name, cache) } } @@ -405,21 +422,17 @@ impl Library { .map_err(|error| error.to_string())?; background.set_offline(offline()); background.watch(notebook.replicas()); - Ok(Self { - location: location.to_owned(), - name: display_name(cache, location).unwrap_or_else(|| match server_address(location) { + let name = + display_name(cache, location).unwrap_or_else(|| match server_address(location) { Some(_) => server.mount.name(), None => file_name(Path::new(location)), - }), + }); + Ok(Self { tag_art: Mutex::new(Arc::new(read_tag_art(¬ebook))), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), notebook: Ok(Some(notebook)), server: Some(server), - notice: None, - cache: cache.to_owned(), background: Some(Arc::new(background)), - watch: None, + ..Self::new(location, name, cache) }) } @@ -576,18 +589,16 @@ impl Library { } _ => self.watch.clone(), }; + let name = display_name(&self.cache, &self.location).unwrap_or_else(|| self.name.clone()); Self { - location: self.location.clone(), - name: display_name(&self.cache, &self.location).unwrap_or_else(|| self.name.clone()), notebook: Ok(Some(notebook)), server: self.server.clone(), notice: self.notice.clone(), - cache: self.cache.clone(), background: self.background.clone(), watch, tag_art: Mutex::new(self.tag_art()), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), + keys: Arc::clone(&self.keys), + ..Self::new(&self.location, name, &self.cache) } } @@ -595,35 +606,20 @@ impl Library { pub fn created(location: &str, mut notebook: Notebook, cache: &Path) -> Self { let (background, watch) = local_background(&mut notebook, location); Self { - location: location.to_owned(), - name: file_name(Path::new(location)), background, watch, - tag_art: Default::default(), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), notebook: Ok(Some(notebook)), - server: None, - notice: None, - cache: cache.to_owned(), + ..Self::new(location, file_name(Path::new(location)), cache) } } /// The section file at `file` as a notebook of one tab. pub fn section(file: &Path, cache: &Path) -> Self { - Self { - location: file.to_string_lossy().into_owned(), - name: file_name(file.parent().unwrap_or(file)), - notebook: Ok(None), - server: None, - notice: None, - cache: cache.to_owned(), - background: None, - watch: None, - tag_art: Default::default(), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), - } + Self::new( + &file.to_string_lossy(), + file_name(file.parent().unwrap_or(file)), + cache, + ) } /// Opens the section at catalog `path`; on a share, through a replica named by its @@ -654,6 +650,11 @@ impl Library { } } }; + let key = self.unlocked(path); + self.touch(path); + if key.is_none() && self.protected(path) { + return Err("The section is password protected".into()); + } let section = loop { if let Some(kept) = self .kept @@ -671,7 +672,7 @@ impl Library { }; let cache = notebook.replica_path(path)?; std::fs::create_dir_all(cache.parent().unwrap_or(&self.cache))?; - let replica = notebook::Replica::open_or_create(&cache, || { + let replica = notebook::Replica::open_or_create(&cache, key.as_ref(), || { Ok(server.connect()?.read_storage(&file, LIMIT)?) }); replica.and_then(|replica| { @@ -681,9 +682,13 @@ impl Library { }) } (Ok(Some(notebook)), None) if self.in_icloud() => { - crate::icloud::section(notebook, Path::new(&self.location), path, notifier()) + let root = Path::new(&self.location); + crate::icloud::section(notebook, root, path, key.as_ref(), notifier()) } - (Ok(Some(notebook)), None) => notebook.section(path, notifier()), + (Ok(Some(notebook)), None) => match &key { + Some(key) => notebook.section_unlocked(path, key, notifier()), + None => notebook.section(path, notifier()), + }, (Ok(None), _) if self.in_icloud() => { crate::icloud::lone_section(Path::new(path), &self.cache, notifier()) } @@ -835,16 +840,10 @@ impl Library { /// The readable sections of the folder at catalog path `folder`, as tabs in its order. pub fn tabs(&self, folder: &str) -> Vec { match &self.notebook { - Ok(Some(notebook)) => { - let mut folders = vec![notebook.catalog()]; - while let Some(candidate) = folders.pop() { - if candidate.path == folder { - return tabs(candidate); - } - folders.extend(&candidate.groups); - } - Vec::new() - } + Ok(Some(notebook)) => folders(notebook.catalog(), |_| true) + .into_iter() + .find(|candidate| candidate.path == folder) + .map_or_else(Vec::new, tabs), Ok(None) => vec![Tab { path: self.location.clone(), name: section_name(&self.location, &None), @@ -856,38 +855,23 @@ impl Library { /// The file identity of the section at catalog `path`. pub fn section_identity(&self, path: &str) -> Option<[u8; 16]> { - let Ok(Some(notebook)) = &self.notebook else { - return None; - }; - let mut folders = vec![notebook.catalog()]; - while let Some(folder) = folders.pop() { - if let Some(section) = folder.sections.iter().find(|section| section.path == path) { - return Some(section.file_id); - } - folders.extend(&folder.groups); - } - None + folders(self.catalog()?, |_| true) + .into_iter() + .flat_map(|folder| &folder.sections) + .find(|section| section.path == path) + .map(|section| section.file_id) } /// The first readable section, searching groups after sections, as OneNote opens a /// notebook. pub fn first_section(&self) -> Option { - let Ok(Some(notebook)) = &self.notebook else { + let Some(catalog) = self.catalog() else { return self.tabs("").pop().map(|tab| tab.path); }; - let mut folders = std::collections::VecDeque::from([notebook.catalog()]); - while let Some(folder) = folders.pop_front() { - if let Some(tab) = tabs(folder).into_iter().next() { - return Some(tab.path); - } - folders.extend( - folder - .groups - .iter() - .filter(|group| !recycle_bin(&group.path)), - ); - } - None + folders(catalog, |group| !recycle_bin(&group.path)) + .into_iter() + .find_map(|folder| tabs(folder).into_iter().next()) + .map(|tab| tab.path) } /// Whether the notebook lists a section at catalog path `path`. @@ -895,14 +879,9 @@ impl Library { let Some(catalog) = self.catalog() else { return self.location == path; }; - let mut folders = vec![catalog]; - while let Some(folder) = folders.pop() { - if folder.sections.iter().any(|section| section.path == path) { - return true; - } - folders.extend(&folder.groups); - } - false + folders(catalog, |_| true) + .iter() + .any(|folder| folder.sections.iter().any(|section| section.path == path)) } /// The notebook's colour, COLORREF, as its table of contents holds it. @@ -913,21 +892,12 @@ impl Library { /// Whether the notebook lists sections not on this device yet, as iCloud Drive keeps /// them elsewhere. pub fn downloading(&self) -> bool { - let Some(catalog) = self.catalog() else { - return false; - }; - let mut folders = vec![catalog]; - while let Some(folder) = folders.pop() { - if folder - .unavailable - .iter() - .any(|entry| entry.reason == notebook::discover::Reason::Evicted) - { - return true; - } - folders.extend(&folder.groups); - } - false + self.catalog().is_some_and(|catalog| { + folders(catalog, |_| true).iter().any(|folder| { + (folder.unavailable.iter()) + .any(|entry| entry.reason == notebook::discover::Reason::Evicted) + }) + }) } /// The notebook's folders of sections, for the sidebar. @@ -937,6 +907,89 @@ impl Library { _ => None, } } + + /// Whether the section at catalog `path` is password protected. + pub fn protected(&self, path: &str) -> bool { + self.catalog().is_some_and(|catalog| { + folders(catalog, |_| true) + .into_iter() + .flat_map(|folder| &folder.sections) + .any(|section| { + section.path == path && matches!(section.state, SectionState::Locked) + }) + }) + } + + /// Whether the section at catalog `path` is password protected and not unlocked. + pub fn locked(&self, path: &str) -> bool { + self.protected(path) && self.unlocked(path).is_none() + } + + /// The key the section at catalog `path` was unlocked with. + pub fn unlocked(&self, path: &str) -> Option { + let identity = self.section_identity(path)?; + let keys = self.keys.0.lock().ok()?; + keys.get(&identity).map(|(key, _)| key.clone()) + } + + /// Marks the unlocked section at catalog `path` worked in now. + pub fn touch(&self, path: &str) { + if let (Some(identity), Ok(mut keys)) = (self.section_identity(path), self.keys.0.lock()) + && let Some((_, used)) = keys.get_mut(&identity) + { + *used = Instant::now(); + } + } + + /// Unlocks the section at catalog `path` with `password`, as OneNote's Protected Section + /// dialog does; a wrong password is `PasswordMismatch`. + pub fn unlock(&self, path: &str, password: &str) -> Result<(), notebook::Error> { + let Ok(Some(notebook)) = &self.notebook else { + return Err(io::Error::from(io::ErrorKind::NotFound).into()); + }; + let key = notebook.unlock(path, password)?; + self.keep_key(path, key); + Ok(()) + } + + /// Keeps `key` for the section at catalog `path`, as setting its password gives one. + pub fn keep_key(&self, path: &str, key: Key) { + if let (Some(identity), Ok(mut keys)) = (self.section_identity(path), self.keys.0.lock()) { + keys.insert(identity, (key, Instant::now())); + } + } + + /// Locks the protected sections unlocked here that `chosen` picks by catalog path and + /// time since last worked in, closing the kept sessions that hold them; returns the paths + /// locked. + pub fn lock(&self, mut chosen: impl FnMut(&str, Duration) -> bool) -> Vec { + let Some(catalog) = self.catalog() else { + return Vec::new(); + }; + let mut locked = Vec::new(); + if let Ok(mut keys) = self.keys.0.lock() { + for section in folders(catalog, |_| true) + .into_iter() + .flat_map(|folder| &folder.sections) + { + let stale = keys + .get(§ion.file_id) + .is_some_and(|(_, used)| chosen(§ion.path, used.elapsed())); + if stale { + keys.remove(§ion.file_id); + locked.push(section.path.clone()); + } + } + } + if let Ok(mut kept) = self.kept.lock() { + for path in &locked { + if let Some(section) = kept.take(path) { + std::thread::spawn(move || close(vec![section])); + } + } + } + locked + } } /// The share folder a notebook opened from its server's address lives in, as its location @@ -948,7 +1001,6 @@ pub fn server_address(location: &str) -> Option { .flatten() } -/// Whether the folder at `path` is the notebook's recycle bin, which OneNote keeps out of its lists. /// `Library::key` for the notebook at `location`, open or not. pub fn key(location: &str, path: &str) -> String { format!("{location}\n{path}") @@ -971,13 +1023,28 @@ fn display_name(cache: &Path, location: &str) -> Option { read_display_names(&display_names(cache)).remove(location) } +/// `folder` and the groups below it, breadth first, going into those `enter` takes. +pub fn folders(folder: &Folder, enter: impl Fn(&Folder) -> bool) -> Vec<&Folder> { + let mut all = vec![folder]; + let mut at = 0; + while let Some(folder) = all.get(at) { + all.extend(folder.groups.iter().filter(|group| enter(group))); + at += 1; + } + all +} + +/// A section's or group's name, as its catalog path ends. +pub fn entry_name(path: &str) -> &str { + let name = path.rsplit('/').next().unwrap_or(path); + name.strip_suffix(".one").unwrap_or(name) +} + +/// Whether the folder at `path` is the notebook's recycle bin, which OneNote keeps out of its lists. pub fn recycle_bin(path: &str) -> bool { path.rsplit('/').next() == Some("OneNote_RecycleBin") } -/// A mounted notebook's background sync, following Work Offline, and the watch that reports -/// the folder's changes to it. A folder on a network volume is kept in offline copies, as on a -/// share, and where the system does not report its server's changes, checked more often. /// The art `notebook` maps its tags to, each picture read once a run. fn read_tag_art(notebook: &Notebook) -> TagArt { let mut read = TagArt::default(); @@ -999,6 +1066,9 @@ fn read_tag_art(notebook: &Notebook) -> TagArt { read } +/// A mounted notebook's background sync, following Work Offline, and the watch that reports +/// the folder's changes to it. A folder on a network volume is kept in offline copies, as on a +/// share, and where the system does not report its server's changes, checked more often. fn local_background( notebook: &mut Notebook, location: &str, @@ -1061,6 +1131,10 @@ pub fn file_name(path: &Path) -> String { /// A section's name: its display name, or its file's. pub fn section_name(path: &str, name: &Option) -> String { name.clone().unwrap_or_else(|| { + // OneNote names the recycle bin's file of deleted pages so. + if path.ends_with("OneNote_RecycleBin/OneNote_DeletedPages.one") { + return "Deleted Pages".to_owned(); + } Path::new(path) .file_stem() .map(|stem| stem.to_string_lossy().into_owned()) @@ -1079,6 +1153,12 @@ fn tabs(catalog: &Folder) -> Vec { path: section.path.clone(), color: *color, }), + // Its name and colour are inside the encryption, but its file is named for it. + SectionState::Locked => Some(Tab { + name: section_name(§ion.path, &None), + path: section.path.clone(), + color: None, + }), _ => None, }) .collect() @@ -1094,6 +1174,8 @@ pub enum Located { }, /// A section file outside any notebook. Section(PathBuf), + /// A OneNote package, which unpacks into a notebook. + Package(PathBuf), Nothing, } @@ -1111,7 +1193,7 @@ fn has_toc(folder: &Path) -> bool { /// What `path` opens: a folder is a notebook; a table of contents opens its folder's; a /// section opens in the notebook the folders above it with tables of contents make up, -/// section groups included, or alone. +/// section groups included, or alone; a package asks to be unpacked. pub fn locate(path: &Path) -> Located { let extension = path .extension() @@ -1121,6 +1203,7 @@ pub fn locate(path: &Path) -> Located { root: path.to_owned(), section: None, }, + Some("onepkg") => Located::Package(path.to_owned()), Some("onetoc2") => match path.parent() { Some(root) => Located::Notebook { root: root.to_owned(), @@ -1327,9 +1410,6 @@ mod tests { #[test] fn share_relative_sections_show_under_their_mount() { let library = |root: &str| Library { - location: "/Volumes/agent/lab".into(), - name: "lab".into(), - notebook: Ok(None), server: Some(Arc::new(Server { mount: Mount { server: "nas".into(), @@ -1344,13 +1424,7 @@ mod tests { domain: String::new(), }, })), - notice: None, - cache: PathBuf::new(), - background: None, - watch: None, - tag_art: Default::default(), - kept: Mutex::new(crate::prefetch::Recent::new(KEPT)), - themes: Default::default(), + ..Library::new("/Volumes/agent/lab", "lab".into(), Path::new("")) }; let shown = |root, file| library(root).local(Path::new(file)); let under = Some(PathBuf::from("/Volumes/agent/lab/Group/New Section 1.one")); @@ -1447,6 +1521,10 @@ mod tests { locate(&root.join("Loose.one")), Located::Section(root.join("Loose.one")) ); + assert_eq!( + locate(&root.join("Shared.onepkg")), + Located::Package(root.join("Shared.onepkg")) + ); assert_eq!(locate(&root.join("missing.txt")), Located::Nothing); std::fs::remove_dir_all(&root).unwrap(); } diff --git a/crates/snowbound/src/link.rs b/crates/snowbound/src/link.rs index 30aa1783395918063e17a8a4749d597218d9c9b3..fa9547b60abfb4afdb3767712869c8e65e0a58ef 100644 --- a/crates/snowbound/src/link.rs +++ b/crates/snowbound/src/link.rs @@ -226,22 +226,7 @@ impl State { } } ui.close(); - ui.open( - "buttons", - Spec { - size: [fill(), children()], - pad: [0.0, 8.0], - gap: 8.0, - ..Spec::default() - }, - ); - ui.leaf( - "space", - Spec { - size: [fill(), px(1.0)], - ..Spec::default() - }, - ); + crate::buttons(ui); let ok = ui::button(ui, "ok", "OK").clicked || entered; let cancel = ui::button(ui, "cancel", "Cancel").clicked; ui.close(); diff --git a/crates/snowbound/src/linux.rs b/crates/snowbound/src/linux.rs index 9be8864468553eb285beb3418644a4fa3cded821..ca841cadfe1a417e8603b849882a187cb93b65b5 100644 --- a/crates/snowbound/src/linux.rs +++ b/crates/snowbound/src/linux.rs @@ -72,12 +72,12 @@ pub fn corner_radius(window: &Window) -> f32 { (units * scale).round() / scale } +/// Winit's theme already holds the window to the app's appearance. +pub fn follow_appearance(_: &Window, _: Theme) {} + /// Whether the window erases its own bottom corners to transparent pixels: under winit's /// Adwaita frame on GNOME's Wayland, which draws libadwaita's window edge. Mutter's X11 /// frames stay square at the bottom, as libadwaita's own `ssd-frame` style has them. -/// Winit's theme already holds the window to the app's appearance. -pub fn follow_appearance(_: &Window, _: Theme) {} - pub fn cuts_corners() -> bool { sctk_adwaita::LIBADWAITA_EDGE.load(Ordering::Relaxed) } @@ -617,6 +617,11 @@ pub fn resize_direction(window: &Window, pointer: [f32; 2]) -> Option String { +pub(crate) fn file_uri(path: &std::path::Path) -> String { use std::os::unix::ffi::OsStrExt; - let mut uri = "file://".to_owned(); - for &byte in path.as_os_str().as_bytes() { - match byte { - b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'.' | b'_' | b'~' | b'/' => { - uri.push(byte as char) - } - _ => uri.push_str(&format!("%{byte:02X}")), - } - } - uri + format!( + "file://{}", + crate::library::encode(path.as_os_str().as_bytes()) + ) +} + +/// The function `name` in `library`, of C signature `F`. +pub(crate) unsafe fn symbol(library: *mut libc::c_void, name: &CStr) -> Option { + let symbol = unsafe { libc::dlsym(library, name.as_ptr()) }; + (!symbol.is_null()) + .then(|| unsafe { std::mem::transmute_copy::<*mut libc::c_void, F>(&symbol) }) } pub fn cache_dir() -> Option { @@ -1124,6 +1130,17 @@ fn dialog( .then(|| String::from_utf8_lossy(&output.stdout).trim().to_owned())) } +/// The path a file dialog answered; none when cancelled or when no tool could ask. +fn picked(asked: Result, &str>) -> Option { + asked + .unwrap_or_else(|error| { + eprintln!("{error}"); + None + }) + .filter(|path| !path.is_empty()) + .map(PathBuf::from) +} + /// Asks for a file to insert, one of `types` (extensions) unless empty, titled `title`. pub fn pick_file(title: &str, types: &[&str]) -> Option { let patterns = match types { @@ -1134,21 +1151,14 @@ pub fn pick_file(title: &str, types: &[&str]) -> Option { .collect::>() .join(" "), }; - let asked = dialog( + picked(dialog( [ "--file-selection", &format!("--title={title}"), &format!("--file-filter={patterns}"), ], ["--getopenfilename", ".", &patterns, "--title", title], - ); - asked - .unwrap_or_else(|error| { - eprintln!("{error}"); - None - }) - .filter(|path| !path.is_empty()) - .map(PathBuf::from) + )) } /// No icon theme lookup; the page draws a blank page for the file. @@ -1210,27 +1220,20 @@ pub fn confirm(message: &str, detail: &str, cancel: &str, action: &str) -> bool /// Asks for a notebook's table of contents or a section file, titled `title`; None when /// cancelled or when no tool can ask. pub fn pick_notebook(title: &str) -> Option { - let asked = dialog( + picked(dialog( [ "--file-selection", &format!("--title={title}"), - "--file-filter=OneNote notebooks and sections | *.onetoc2 *.one", + "--file-filter=OneNote notebooks, sections and packages | *.onetoc2 *.one *.onepkg", ], [ "--getopenfilename", ".", - "*.onetoc2 *.one", + "*.onetoc2 *.one *.onepkg", "--title", title, ], - ); - asked - .unwrap_or_else(|error| { - eprintln!("{error}"); - None - }) - .filter(|path| !path.is_empty()) - .map(PathBuf::from) + )) } /// Asks where to put something named `name` by default; the dialog names its own button. @@ -1240,7 +1243,7 @@ pub fn pick_new( _action: &str, _folder: Option<&std::path::Path>, ) -> Option { - let asked = dialog( + picked(dialog( [ "--file-selection", "--save", @@ -1248,14 +1251,7 @@ pub fn pick_new( &format!("--filename={name}"), ], ["--getsavefilename", name, "--title", title], - ); - asked - .unwrap_or_else(|error| { - eprintln!("{error}"); - None - }) - .filter(|path| !path.is_empty()) - .map(PathBuf::from) + )) } /// Tells the user something they asked for could not be done: `message`, then what to do. diff --git a/crates/snowbound/src/macos.rs b/crates/snowbound/src/macos.rs index 9903eb806c7a910cf140ff2ba56327a867364287..0e8fc115a284072a21635aae2e131ca709650c8f 100644 --- a/crates/snowbound/src/macos.rs +++ b/crates/snowbound/src/macos.rs @@ -37,7 +37,7 @@ pub fn with_pool(run: impl FnOnce() -> R) -> R { pub use crate::aqua::{cover_border_line, move_cursor, resize_grip, system_interface}; -static QUIT: OnceLock> = OnceLock::new(); +static PROXY: OnceLock> = OnceLock::new(); static INPUT_CLASS: OnceLock<&'static AnyClass> = OnceLock::new(); static BACKDROP_CLASS: OnceLock<&'static AnyClass> = OnceLock::new(); static DELEGATE_CLASS: OnceLock<&'static AnyClass> = OnceLock::new(); @@ -71,23 +71,25 @@ unsafe extern "C" fn insert_text(view: &AnyObject, _: Sel, text: &AnyObject, ran } else { msg_send_id![text, copy] }; - if let Some(proxy) = QUIT.get() { + if let Some(proxy) = PROXY.get() { let _ = proxy.send_event(crate::UserEvent::InsertText(string.to_string())); } } } } -fn ns_window(window: &Window) -> Retained { +/// The view winit draws the window's content in. +fn ns_view(window: &Window) -> Retained { let RawWindowHandle::AppKit(handle) = window.window_handle().expect("Live AppKit window").as_raw() else { unreachable!() }; - unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); - msg_send_id![view, window] - } + unsafe { Retained::retain(handle.ns_view.as_ptr().cast()) }.expect("A live window has a view") +} + +pub(crate) fn ns_window(window: &Window) -> Retained { + unsafe { msg_send_id![&ns_view(window), window] } } /// Room the traffic lights take at the title bar's leading edge. @@ -107,11 +109,11 @@ pub fn corner_radius(_: &Window) -> f32 { } } -/// AppKit clips the window's corners itself, except where the OpenGL surface covers -/// 10.6's textured window, whose rounded bottom corners the app leaves transparent. /// Winit's theme already holds the window to the app's appearance. pub fn follow_appearance(_: &Window, _: winit::window::Theme) {} +/// AppKit clips the window's corners itself, except where the OpenGL surface covers +/// 10.6's textured window, whose rounded bottom corners the app leaves transparent. pub fn cuts_corners() -> bool { crate::aqua::before_lion() } @@ -332,13 +334,8 @@ pub fn install_backdrop(window: &Window) -> bool { let Some(effect) = AnyClass::get("NSVisualEffectView") else { return crate::aqua::textured(window, crate::TITLE + crate::TAB_ROW); }; - let RawWindowHandle::AppKit(handle) = - window.window_handle().expect("Live AppKit window").as_raw() - else { - unreachable!() - }; + let view = &*ns_view(window); unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); let class = BACKDROP_CLASS.get_or_init(|| { let mut class = ClassBuilder::new("SnowboundBackdrop", effect).expect("Unique backdrop class"); @@ -881,6 +878,11 @@ pub fn appearance(window: &Window) -> winit::window::Theme { window.theme().unwrap_or(winit::window::Theme::Dark) } +/// Keeps the window's client area at least `size` points. +pub fn set_min_size(window: &Window, size: [f32; 2]) { + window.set_min_inner_size(Some(winit::dpi::LogicalSize::new(size[0], size[1]))); +} + /// Zooms the window once the current event is handled: AppKit's zoom animation runs its /// own loop, and started from inside winit's handler it would hold every resize until the /// end, stretching the last frame instead of drawing each step. @@ -899,13 +901,8 @@ pub fn zoom(window: &Window) { /// Install before AccessKit subclasses the same view, preserving its restoration chain. pub fn install_text_input(window: &Window) { MainThreadMarker::new().expect("Text input belongs to the main thread"); - let RawWindowHandle::AppKit(handle) = - window.window_handle().expect("Live AppKit window").as_raw() - else { - unreachable!() - }; + let view = &*ns_view(window); unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); let class = INPUT_CLASS.get_or_init(|| { let mut class = ClassBuilder::new("SnowboundTextInputView", view.class()) .expect("Unique text input class"); @@ -965,9 +962,7 @@ pub fn edit_date( } picker.setCalendar(Some(&calendar)); picker.setTimeZone(Some(&calendar.timeZone())); - picker.setDateValue(&NSDate::dateWithTimeIntervalSince1970( - (timestamp / 10_000_000) as f64 - 11_644_473_600.0, - )); + picker.setDateValue(&ns_date(timestamp)); picker.setMinDate(Some(&NSDate::dateWithTimeIntervalSince1970( -11_644_473_600.0, ))); @@ -996,9 +991,7 @@ fn merge_date( calendar: &NSCalendar, ) -> Result<(u64, [String; 2]), &'static str> { unsafe { - let original = NSDate::dateWithTimeIntervalSince1970( - (timestamp / 10_000_000) as f64 - 11_644_473_600.0, - ); + let original = ns_date(timestamp); let units = NSCalendarUnit::Era | NSCalendarUnit::Year | NSCalendarUnit::Month @@ -1053,11 +1046,14 @@ fn labels(date: &NSDate, calendar: &NSCalendar) -> [String; 2] { /// FILETIME as a new page's title shows it: the long date and the short time. pub fn date_text(filetime: u64) -> [String; 2] { + let calendar = unsafe { NSCalendar::currentCalendar() }; + labels(&ns_date(filetime), &calendar) +} + +/// FILETIME as an `NSDate`, to the second. +fn ns_date(filetime: u64) -> Retained { unsafe { - let date = NSDate::dateWithTimeIntervalSince1970( - (filetime / 10_000_000) as f64 - 11_644_473_600.0, - ); - labels(&date, &NSCalendar::currentCalendar()) + NSDate::dateWithTimeIntervalSince1970((filetime / 10_000_000) as f64 - 11_644_473_600.0) } } @@ -1069,9 +1065,7 @@ pub fn user_name() -> String { /// FILETIME as the system's short date, as OneNote labels a conflict page. pub fn short_date(filetime: u64) -> String { unsafe { - let date = NSDate::dateWithTimeIntervalSince1970( - (filetime / 10_000_000) as f64 - 11_644_473_600.0, - ); + let date = ns_date(filetime); let formatter = NSDateFormatter::new(); formatter.setDateStyle(NSDateFormatterStyle::NSDateFormatterShortStyle); formatter.setTimeStyle(NSDateFormatterStyle::NSDateFormatterNoStyle); @@ -1231,13 +1225,13 @@ declare_class!( #[method(terminate:)] fn terminate(&self, _sender: Option<&AnyObject>) { - if let Some(proxy) = QUIT.get() { let _ = proxy.send_event(crate::UserEvent::Quit); } + if let Some(proxy) = PROXY.get() { let _ = proxy.send_event(crate::UserEvent::Quit); } } #[method(choose:)] fn choose(&self, sender: &NSMenuItem) { let tag = usize::try_from(unsafe { sender.tag() }).ok(); - if let (Some(proxy), Some(choice)) = (QUIT.get(), tag.and_then(|tag| commands::choices().nth(tag))) { + if let (Some(proxy), Some(choice)) = (PROXY.get(), tag.and_then(|tag| commands::choices().nth(tag))) { let _ = proxy.send_event(crate::UserEvent::Choose(choice)); } } @@ -1302,7 +1296,8 @@ pub fn event_loop(headless: bool) -> Result, EventLo .with_activate_ignoring_other_apps(false); } let event_loop = builder.build()?; - QUIT.set(event_loop.create_proxy()) + PROXY + .set(event_loop.create_proxy()) .expect("Only one application event loop is created"); // Winit's delegate gains -application:openFiles:, which every macOS from 10.6 sends for // the Finder's and `open`'s documents, before the launch finishes on a cold launch. @@ -1328,7 +1323,7 @@ unsafe extern "C" fn open_files( app: &NSApplication, files: &objc2_foundation::NSArray, ) { - if let Some(proxy) = QUIT.get() { + if let Some(proxy) = PROXY.get() { let paths = files.iter().map(|file| file.to_string().into()).collect(); let _ = proxy.send_event(crate::UserEvent::Open(paths)); } @@ -1392,14 +1387,9 @@ pub fn confirm(message: &str, detail: &str, cancel: &str, action: &str) -> bool /// End AppKit preedit after a canvas action commits or cancels the composition. pub fn clear_marked_text(window: &Window) { MainThreadMarker::new().expect("Text input belongs to the main thread"); - let RawWindowHandle::AppKit(handle) = - window.window_handle().expect("Live AppKit window").as_raw() - else { - unreachable!() - }; // Winit owns this view and implements the NSTextInputClient selectors. + let view = &*ns_view(window); unsafe { - let view = &*handle.ns_view.as_ptr().cast::(); let marked: bool = msg_send![view, hasMarkedText]; if marked { let _: () = msg_send![view, unmarkText]; diff --git a/crates/snowbound/src/main.rs b/crates/snowbound/src/main.rs index 23b57e6d1b76dd0b7d9324217f12efc565b027b4..7b28d6d7aedf09d4eae4e86fd5de3995689c652e 100644 --- a/crates/snowbound/src/main.rs +++ b/crates/snowbound/src/main.rs @@ -40,13 +40,16 @@ mod paste; mod platform; mod prefetch; mod print; -mod properties; #[cfg_attr(target_os = "linux", path = "print_linux.rs")] #[cfg_attr(target_os = "macos", path = "print_macos.rs")] #[cfg_attr(windows, path = "print_windows.rs")] mod printer; +mod properties; +mod protection; mod recording; +mod recycle; mod rename; +mod save_as; mod screenshot; mod search; mod server; @@ -64,6 +67,8 @@ mod tags; mod templates; mod themes; mod undo; +mod unpack; +mod unread; mod update; mod video; mod watch; @@ -106,6 +111,12 @@ use winit::{ const TITLE: f32 = 38.0; /// Space between toolbar groups. const GAP: f32 = 6.0; +/// A tool face's room beside its buttons. +const FACE_PAD: f32 = 5.0; +/// How far a tool face stands above and below its buttons. +const FACE_RISE: f32 = 3.0; +/// Space between groups on faces of their own. +const FACE_GAP: f32 = 2.0; const TAB_ROW: f32 = 28.0; /// Width of the section colour around the page, and the rows' margin at the window's sides. const FRAME: f32 = 6.0; @@ -115,7 +126,6 @@ const PAGE_LIST: f32 = 240.0; const MIN_SIZE: [f32; 2] = [600.0, 400.0]; /// Extensions of the pictures Insert, Picture offers: those the page both stores and draws. const PICTURE_TYPES: [&str; 4] = ["png", "jpg", "jpeg", "gif"]; -/// Font sizes the size box offers, OneNote's list in points. /// Fonts the font box offers first, OneNote's default leading. const FONTS: [&str; 4] = ["Calibri", "Arial", "Times New Roman", "Courier New"]; /// Picks the font box and the list galleries offer as recent, at most, as OneNote's @@ -579,6 +589,8 @@ enum Command { }, /// Deletes pages of the open section to the notebook's recycle bin. DeletePages(Vec), + /// Restores or deletes for good pages of the recycle bin's open section. + Recycle(recycle::Request), /// Moves or indents pages of the open section. Pages(Vec), /// Moves a page of the open section to the end of another section of its folder. @@ -672,7 +684,7 @@ struct State { cache: PathBuf, /// Whether the notebook sidebar is expanded. sidebar: bool, - /// Notebooks and section groups whose rows the sidebar folds, by `sidebar::fold_key`. + /// Notebooks and section groups whose rows the sidebar folds, by `Library::key`. folded: HashSet, /// The open context menu: what it was opened on, and where. menu: Option<(menus::Target, [f32; 2])>, @@ -693,6 +705,12 @@ struct State { /// The Link dialog's fields while it is open. link: Option, properties: Option, + /// Save As while it is open. + save_as: Option, + /// Unpack Notebook while it is open. + unpacking: Option, + /// What has been read in each notebook, on this computer. + reads: unread::Reads, /// Open Notebook from Server while it is open. server: Option, /// New iCloud Notebook while it is open. @@ -728,6 +746,12 @@ struct State { /// The notebook shown while it has no section open, as one whose last section was /// deleted. sectionless: Option>, + /// A password-protected section shown locked, in place of an open one. + locked: Option, + /// The password dialog while it is open. + password: Option, + /// Options' Passwords. + passwords: settings::Passwords, /// What the pointer is dragging: a page's tab, a section tab or a sidebar row. drag: Option, /// Pages whose template strip was dismissed this run. @@ -879,6 +903,7 @@ impl State { let mut notebooks = Vec::new(); let mut session = None; let mut sectionless = None; + let mut locked = None; let (editor, scene) = match input { Input::Notes { document, @@ -933,7 +958,7 @@ impl State { .chain(¬ebooks) .find_map(|library| Some((library, library.first_section()?))); match shown { - Some((library, path)) => { + Some((library, path)) if !library.locked(&path) => { let section = library.open(&path, notify(proxy.clone()))?; let (opened, page) = read_session(section, Arc::clone(library), path, None)?; @@ -941,11 +966,17 @@ impl State { session = Some(opened); (editor, Some((scene, [0.0; 2]))) } - None => { + shown => { + // A first section still locked shows its locked page. + locked = shown.map(|(library, path)| protection::Locked { + library: Arc::clone(library), + path, + }); sectionless = notebooks .iter() .find(|library| Some(&library.location) == current.as_ref()) .or(notebooks.first()) + .filter(|_| locked.is_none()) .cloned(); let blank = TextDocument::new(vec![Paragraph::new( String::new(), @@ -1014,6 +1045,7 @@ impl State { .map(|dictionary| canvas::spelling::Spelling::new(dictionary, redraw.clone())); let updates = update::Updates::start(visible && !stored.manual_updates, proxy.clone()); let prefetch = prefetch::Prefetch::new(Arc::clone(&layouts), redraw.clone()); + let reads = unread::Reads::load(&cache); let mut state = Self { author: stored.user_name.unwrap_or_else(platform::user_name), window, @@ -1045,6 +1077,9 @@ impl State { after_open: None, link: None, properties: None, + save_as: None, + unpacking: None, + reads, server: None, new_icloud: None, icloud_reading: HashSet::new(), @@ -1062,6 +1097,9 @@ impl State { titlebar, renaming: None, sectionless, + locked, + password: None, + passwords: stored.passwords, drag: None, templates: templates::View::Strip, media: Default::default(), @@ -1142,6 +1180,7 @@ impl State { eprintln!("{error}"); } lap("open", start); + self.follow_reading(); let size = self.window.inner_size(); let scale = self.scale(); if scale != self.ui.scale() { @@ -1170,6 +1209,7 @@ impl State { self.ime_allowed = ime; self.window.set_ime_allowed(ime); } + self.lock_idle()?; self.draw()?; lap("drawn", start); self.sync_index(false, Vec::new()); @@ -1211,6 +1251,9 @@ impl State { self.new_icloud_dialog(); self.link_dialog()?; self.properties_dialog(); + self.save_as_dialog(); + self.unpack_dialog(); + self.password_dialog()?; self.customize_tags(); self.palette(); self.sync_popup()?; @@ -1314,7 +1357,10 @@ impl State { let mut theme = self.ui.theme.clone(); theme.paper = self.paper().color; platform::update_menu(|| self.statuses()); - let welcome = self.session.is_none() && !self.temporary && self.sectionless.is_none(); + let welcome = self.session.is_none() + && !self.temporary + && self.sectionless.is_none() + && self.locked.is_none(); self.toolbar(&theme, !welcome)?; if welcome { self.welcome(&theme); @@ -1380,7 +1426,9 @@ impl State { ..Spec::default() }, ); + self.recycle_heading(&theme); let row = sections(); + let unread = self.unread_keys(); let (clicked, open_tab) = match &self.session { Some(session) => { // A tab being renamed takes the name typed, which its field covers. @@ -1394,7 +1442,8 @@ impl State { } _ => tab.name.as_str(), }; - (name, section_color(tab.color)) + let unread = unread.contains(&session.library.key(&tab.path)); + (name, section_color(tab.color), unread) }) .collect(); let lit = self.page_drop(row); @@ -1453,8 +1502,9 @@ impl State { self.tab_rename_field(&theme, row, tab_row); (clicked, open_tab) } + None if self.locked.is_some() => self.locked_tabs(row, §ion, theme.strip), None => { - let tabs = [("Temporary page", section_color(None))]; + let tabs = [("Temporary page", section_color(None), false)]; let shown = if self.temporary { &tabs[..] } else { &[] }; let open_tab = ui::shell::section_tabs( &mut self.ui, @@ -1537,6 +1587,22 @@ impl State { self.commands .extend(conflict_bar(&mut self.ui, bar, §ions, steps)); } + if self.in_recycle_bin() { + recycle::bar(&mut self.ui); + } + if self.session.is_none() && self.locked.is_some() { + self.locked_page(&theme); + self.ui.close(); + self.ui.close(); + self.ui.close(); + if self.navigation_bar_right { + self.sidebar(&theme, sidebar); + } + self.sidebar_button(&theme, height); + self.ui.close(); + self.context_menu(); + return Ok((section, open_tab, None)); + } if let Some(library) = self.sectionless.clone().filter(|_| self.session.is_none()) { self.no_sections(&theme, library); self.ui.close(); @@ -1816,7 +1882,6 @@ impl State { Flags::default() }, size: [fill(), px(TITLE)], - fill: Some(theme.strip), pad: [0.0, (TITLE - ui::shell::TOOL) / 2.0], gap: GAP, role: Some(accesskit::Role::Toolbar), @@ -1827,6 +1892,20 @@ impl State { } else { self.ui.open("toolbar", spec) }; + // The strip stops short of the window's controls, where Windows 7 draws its caption + // buttons beneath the window's pixels. + let edge = (TITLE - ui::shell::TOOL) / 2.0; + self.ui.open( + "bar", + Spec { + size: [fill(), px(TITLE)], + fill: Some(theme.strip), + pad: [0.0, edge], + offset: [0.0, -edge], + gap: GAP, + ..Spec::default() + }, + ); let lead = if title { platform::LEADING } else { FRAME }; self.ui.leaf( "lead", @@ -1838,16 +1917,21 @@ impl State { if tools { // The groups fold in the room the window's controls leave, and whatever still // overflows is cut there, so the controls always show. - let edge = (TITLE - ui::shell::TOOL) / 2.0; + let panel = theme.tool[3] > 0.0 && theme.tool_panel; + let face = tool_face(theme, panel, FACE_RISE - edge); self.ui.open( "tools", Spec { flags: Flags::CLIP, size: [fill(), px(TITLE)], - pad: [0.0, edge], + pad: [face.pad[0], edge], offset: [0.0, -edge], - gap: GAP, - ..Spec::default() + gap: if theme.tool[3] > 0.0 && !panel { + FACE_GAP + } else { + GAP + }, + ..face }, ); self.tools(theme); @@ -1861,6 +1945,7 @@ impl State { }, ); } + self.ui.close(); if title { platform::window_controls(&mut self.ui, &self.window); } @@ -1878,8 +1963,7 @@ impl State { .map_or(MIN_SIZE[0], |row| row.ceil().max(MIN_SIZE[0])); if narrowest != self.min_width { self.min_width = narrowest; - self.window - .set_min_inner_size(Some(LogicalSize::new(narrowest, MIN_SIZE[1]))); + platform::set_min_size(&self.window, [narrowest, MIN_SIZE[1]]); } Ok(()) } @@ -2006,7 +2090,7 @@ impl State { "font", Spec { gap: 1.0, - ..Spec::default() + ..tool_face(theme, grouped(theme), FACE_RISE) }, ); divider(ui, theme); @@ -2705,7 +2789,7 @@ impl State { eprintln!("{error}"); } if ui::shell::tool_button(&mut self.ui, "new", art::PLUS, theme.text, None).clicked { - self.commands.push(Command::NewPage { under: None }); + self.choose(commands::Choice::Command(commands::Id::NewPage)); } tip(&mut self.ui, commands::Id::NewPage); let toggle = if self.pages_open { @@ -2749,9 +2833,8 @@ impl State { self.ui.close(); return None; } - let found = self - .search - .found_in(&session.library.key(&session.tabs[session.tab].path)); + let found = self.search.found_in(&session.key()); + let unread = self.unread_pages(); let rounding = self.rounding(); let dragged = self.dragged_page(); let rows = page_rows( @@ -2759,7 +2842,7 @@ impl State { theme, section, session, - &found, + [&found, &unread], (rounding, self.page_tabs_left), self.renaming.as_mut(), dragged, @@ -2813,7 +2896,8 @@ impl State { let response = match event { ui::Event::PointerMoved(point) => self.view.pointer_moved(device(point))?, ui::Event::Pressure(pressure) => { - self.view.set_pressure(pressure.filter(|_| self.pen_pressure)); + self.view + .set_pressure(pressure.filter(|_| self.pen_pressure)); continue; } ui::Event::PointerLeft => self.view.pointer_left(), @@ -2900,6 +2984,9 @@ impl State { fn apply(&mut self, command: Command) -> Result<(), Box> { match command { Command::OpenSection(library, path) => { + if library.locked(&path) { + return self.show_locked(library, path); + } let tab = match &self.session { // Back to the open section before another one opened. Some(session) @@ -2953,7 +3040,7 @@ impl State { self.commands.push(Command::OpenPage(page)); } Command::CopyVersion { version, tab } => { - let session = self.session.as_ref().ok_or("No section is open")?; + let session = self.session.as_mut().ok_or("No section is open")?; let page = match session.version { Some(open) if open == version => { session.section.version(session.space, open)? @@ -2962,6 +3049,8 @@ impl State { }; if tab == session.tab { session.section.import_page(&page, &self.author)?; + session.pages = session.section.pages()?; + self.edited(Vec::new()); } else { let library = Arc::clone(&session.library); let path = session.tabs[tab].path.clone(); @@ -3010,6 +3099,7 @@ impl State { self.delete_pages(pages)?; self.edited(Vec::new()); } + Command::Recycle(request) => self.recycle(request)?, Command::Pages(edits) => self.edit_pages(edits)?, Command::MovePage { space, path } => { self.move_page(space, path)?; @@ -3108,11 +3198,7 @@ impl State { let Some(mut opening) = self.opening.take() else { return Ok(()); }; - let paper = canvas::gpu::Paper { - color: self.ui.theme.paper, - ink: self.ui.theme.paper_ink, - } - .colored(opening.editor.page_color()); + let paper = paper.colored(opening.editor.page_color()); if !self .view .prepare(&mut opening.scene, &opening.editor, paper, &self.redraw) @@ -3151,23 +3237,15 @@ impl State { .session .as_ref() .is_none_or(|open| open.library.location != session.library.location); - // A notebook read again after a change replaces the one it was. - match self - .notebooks - .iter_mut() - .find(|library| library.location == session.library.location) - { - Some(library) => *library = Arc::clone(&session.library), - None => self.notebooks.push(Arc::clone(&session.library)), - } - if session.library.in_icloud() && session.library.downloading() { - self.fetch(Arc::clone(&session.library), None); - } + self.list(&session.library); // The section left stays open a while for coming back to; the notebook's // background sync takes it over once it is closed. + self.locked = None; if let Some(previous) = self.session.replace(*session) { + let path = &previous.tabs[previous.tab].path; + let locked = self.leave(&previous.library, path); let library = &previous.library; - if self.notebooks.iter().any(|open| Arc::ptr_eq(open, library)) { + if !locked && self.notebooks.iter().any(|open| Arc::ptr_eq(open, library)) { library.keep(&previous.tabs[previous.tab].path, previous.section); } else { let section = previous.section; @@ -3197,7 +3275,7 @@ impl State { } } let place = self.session.as_ref().and_then(|session| { - let key = session.library.key(&session.tabs[session.tab].path); + let key = session.key(); self.places.get(&(key, session.space)).copied() }); let left = self.view.open(opening.editor, Some(opening.scene), place); @@ -3217,7 +3295,10 @@ impl State { self.switching = None; self.visited(); if let Some((space, action)) = self.after_open.take() - && let Some(session) = self.session.as_ref().filter(|session| session.space == space) + && let Some(session) = self + .session + .as_ref() + .filter(|session| session.space == space) { let target = menus::Target::Page { library: Arc::clone(&session.library), @@ -3259,17 +3340,7 @@ impl State { /// the open section, now at catalog `path` in it, stays open, reopened where it moved. /// Without `path` the notebook has no sections left, and one of its shows none. fn adopt(&mut self, library: Arc, path: Option<&str>) -> Result<(), Box> { - if library.in_icloud() && library.downloading() { - self.fetch(Arc::clone(&library), None); - } - match self - .notebooks - .iter_mut() - .find(|open| open.location == library.location) - { - Some(open) => *open = Arc::clone(&library), - None => self.notebooks.push(Arc::clone(&library)), - } + self.list(&library); let shown = |shown: &Library| shown.location == library.location; let Some(path) = path else { if self.sectionless.as_deref().is_some_and(shown) @@ -3317,6 +3388,18 @@ impl State { Ok(()) } + /// Lists `library` in place of the notebook read before at its location, or last, and + /// brings down what iCloud Drive keeps elsewhere of it. + fn list(&mut self, library: &Arc) { + match (self.notebooks.iter_mut()).find(|open| open.location == library.location) { + Some(open) => *open = Arc::clone(library), + None => self.notebooks.push(Arc::clone(library)), + } + if library.in_icloud() && library.downloading() { + self.fetch(Arc::clone(library), None); + } + } + /// Follows a page shown in place of another. fn opened(&mut self) -> Result<(), Box> { if let Err(error) = self.wear_theme() { @@ -3369,7 +3452,14 @@ impl State { .file_name() .map(|name| name.to_string_lossy().into_owned()) .unwrap_or_default(); - format!("{} · {file}", session.title()) + // OneNote titles a page of the recycle bin so. + let binned = recycle::binned(&session.tabs[session.tab].path); + let bin = if binned { + " (Read-Only - Recycle Bin)" + } else { + "" + }; + format!("{}{bin} · {file}", session.title()) } None if !self.temporary => "Snowbound".to_owned(), None => { @@ -3486,7 +3576,10 @@ impl State { loop { session.section.wake(); if Instant::now() >= deadline - || session.section.pending().is_ok_and(|pending| pending.is_empty()) + || session + .section + .pending() + .is_ok_and(|pending| pending.is_empty()) { return; } @@ -3575,16 +3668,17 @@ impl State { /// last poll. fn synced(&mut self) -> Result<(), Box> { // Every notebook's changes are taken, so none is reported again. - let changed: Vec = self - .notebooks - .iter() - .filter_map(|library| Some((library, library.background.as_ref()?))) - .flat_map(|(library, background)| { - background - .changed() - .into_iter() - .map(|path| library.key(&path)) + let reported: Vec<(Arc, Vec)> = (self.notebooks.iter()) + .filter_map(|library| { + Some((Arc::clone(library), library.background.as_ref()?.changed())) }) + .filter(|(_, paths)| !paths.is_empty()) + .collect(); + for (library, paths) in &reported { + self.sections_changed(library, paths.clone()); + } + let changed: Vec = (reported.iter()) + .flat_map(|(library, paths)| paths.iter().map(|path| library.key(path))) .collect(); if !changed.is_empty() { self.sync_index(false, changed); @@ -3597,17 +3691,16 @@ impl State { let mut listed = false; let mut changed = false; let mut rejected = None; + let mut elsewhere = Vec::new(); for event in session.section.events() { use notebook::session::Event; match event { Event::Changed(spaces) => { listed = true; changed |= spaces.contains(&session.space); - self.search.changed( - session.library.key(&session.tabs[session.tab].path), - session.section.replica(), - spaces, - ); + elsewhere.extend_from_slice(&spaces); + self.search + .changed(session.key(), session.section.replica(), spaces); } Event::Rejected { spaces, error } => { if spaces.contains(&session.space) { @@ -3621,6 +3714,12 @@ impl State { } } session.sync = session.section.sync_status()?; + if !elsewhere.is_empty() { + self.changed_elsewhere(&elsewhere); + } + let Some(session) = &mut self.session else { + return Ok(()); + }; if listed { let back = session.shown; session.pages = session.section.pages()?; @@ -3967,9 +4066,15 @@ impl State { }) .collect(); trace_input(&("Draw", viewport.origin, viewport.scale)); + // Where the system's material shows through, only what the chrome fills covers it. + let clear = if self.surface.translucent() { + [0.0; 4] + } else { + self.ui.theme.strip + }; let start = Instant::now(); self.renderer - .draw(target, self.surface.size, self.ui.theme.strip, &layers) + .draw(target, self.surface.size, clear, &layers) .map_err(|error| format!("Canvas drawing failed: {error:?}"))?; lap("render", start); Ok(()) @@ -3988,9 +4093,6 @@ impl State { self.surface.read(&self.renderer, offscreen) } - /// Queues input for the next frame. A press on the strip moves the window: at once on - /// macOS, while AppKit still holds the press, and elsewhere once the pointer moves, as - /// the window manager's move would swallow a second click; a double press zooms it. fn over_page(&self) -> bool { let [x0, y0, x1, y1] = self.ui.rect(page()).unwrap_or_default(); let [x, y] = self.pointer; @@ -4023,6 +4125,9 @@ impl State { } } + /// Queues input for the next frame. A press on the strip moves the window: at once on + /// macOS, while AppKit still holds the press, and elsewhere once the pointer moves, as + /// the window manager's move would swallow a second click; a double press zooms it. fn input(&mut self, event: ui::Event) { if let ui::Event::PointerMoved(point) = event { self.pointer = point; @@ -4335,8 +4440,8 @@ fn page_list_top() -> &'static str { "top" } -/// The page list's rows, a page's conflict pages beneath it while shown and the pages a -/// search `found` marked. A `dragged` page's tab follows the pointer over the others, which +/// The page list's rows, a page's conflict pages beneath it while shown, and `marked` the +/// pages a search found and those unread. A `dragged` page's tab follows the pointer over the others, which /// slide aside to open the gap it would land in; once let go it eases into its place. #[allow(clippy::too_many_arguments)] fn page_rows( @@ -4344,7 +4449,7 @@ fn page_rows( theme: &Theme, section: &ui::Section, session: &Session, - found: &HashSet, + marked: [&HashSet; 2], shape: (f32, bool), mut renaming: Option<&mut rename::Renaming>, dragged: Option, @@ -4389,7 +4494,7 @@ fn page_rows( theme, section, session, - found, + marked, shape, renaming.as_deref_mut(), (space, title, *level), @@ -4416,7 +4521,7 @@ fn page_rows( theme, section, session, - found, + marked, shape, renaming, (space, title, *level), @@ -4437,7 +4542,7 @@ fn page_row( theme: &Theme, section: &ui::Section, session: &Session, - found: &HashSet, + [found, unread]: [&HashSet; 2], shape: (f32, bool), renaming: Option<&mut rename::Renaming>, (space, title, level): (&ExGuid, &String, u32), @@ -4457,6 +4562,7 @@ fn page_row( indent: level.saturating_sub(1), conflicted: !versions.is_empty(), found: found.contains(space), + unread: unread.contains(space), renaming: renaming .filter(|renaming| renaming.page(*space)) .map(|renaming| &mut renaming.name), @@ -4493,62 +4599,45 @@ fn page_row( tab: ui::mix(section.tab, theme.chip, 0.6), ..*section }; - if session.shown_history == Some(*space) { - for version in session.page_versions(*space) { - let label = history::label(version); - let tab = PageTab { - label: &label, - dim: false, - indent: level.saturating_sub(1), - conflicted: false, - found: false, - renaming: None, - shift, - lifted: false, + // Each row: its id, its label, whether it is open, and whether it is a page version. + let history = (session.page_versions(*space).iter()) + .filter(|_| session.shown_history == Some(*space)) + .map(|version| { + let open = session.version == Some(version.context); + (version.context, history::label(version), open, true) + }); + let conflicts = (versions.iter()) + .filter(|_| session.shown == Some(*space)) + .map(|version| { + let label = match version.created { + Some(created) => format!("{} {}", platform::short_date(created), version.user), + None => version.user.clone(), }; - let selected = session.version == Some(version.context); - if selected { - rows.open = Some(ui.id(version.context)); - } - height += ROW; - if page_tab(ui, theme, &muted, &version.context, tab, selected, shape) - .0 - .clicked - && !selected - { - rows.version = Some((*space, version.context)); - } - } - } - if session.shown != Some(*space) { - return height; - } - for version in versions { - let label = match version.created { - Some(created) => format!("{} {}", platform::short_date(created), version.user), - None => version.user.clone(), - }; + (version.space, label, version.space == session.space, false) + }); + for (id, label, selected, version) in history.chain(conflicts) { let tab = PageTab { label: &label, dim: false, indent: level.saturating_sub(1), conflicted: false, found: false, + unread: false, renaming: None, shift, lifted: false, }; - let selected = version.space == session.space; if selected { - rows.open = Some(ui.id(version.space)); + rows.open = Some(ui.id(id)); } height += ROW; - if page_tab(ui, theme, &muted, &version.space, tab, selected, shape) + let clicked = page_tab(ui, theme, &muted, &id, tab, selected, shape) .0 - .clicked - && !selected - { - rows.clicked = Some(version.space); + .clicked; + if clicked && !selected && version { + rows.version = Some((*space, id)); + } else if clicked && !selected { + rows.clicked = Some(id); } } height @@ -4564,6 +4653,8 @@ struct PageTab<'a> { conflicted: bool, /// A search found the page, which OneNote marks yellow. found: bool, + /// Another author changed it since it was last viewed, which OneNote sets bold. + unread: bool, /// The name typed in the tab's rename field, while it shows one. renaming: Option<&'a mut String>, /// How far down from its place in the list it is drawn. @@ -4652,6 +4743,7 @@ fn page_tab( Spec { size: [fill(), px(ROW - ROW_GAP)], text: Some(tab.label), + bold: tab.unread, overflow: ui::Overflow::Ellipsis, color: Some(color), ..Spec::default() @@ -4793,11 +4885,12 @@ fn group( full: impl FnOnce(&mut Ui) -> Option, folded: impl FnOnce(&mut Ui) -> Option, ) -> Option { + let face = tool_face(&ui.theme, grouped(&ui.theme), FACE_RISE); ui.open( part, Spec { fold: Some(priority), - ..Spec::default() + ..face }, ); ui.open( @@ -5010,6 +5103,26 @@ fn dropdown( } } +/// Opens the trailing row of a dialog, whose buttons then stand at its right. +fn buttons(ui: &mut Ui) { + ui.open( + "buttons", + Spec { + size: [fill(), children()], + pad: [0.0, 8.0], + gap: 8.0, + ..Spec::default() + }, + ); + ui.leaf( + "space", + Spec { + size: [fill(), px(1.0)], + ..Spec::default() + }, + ); +} + /// Names box `id` to assistive technology, where no tooltip does. fn name(ui: &mut Ui, id: Id, label: &str) { if let Some(node) = ui.access(id) { @@ -5179,8 +5292,33 @@ fn title(id: commands::Id) -> &'static str { commands::command(id).title.trim_end_matches('…') } -/// The line leading a toolbar group, as far from its buttons as the groups are apart. +/// Whether each toolbar group stands on a face of its own. +fn grouped(theme: &Theme) -> bool { + theme.tool[3] > 0.0 && !theme.tool_panel +} + +/// The theme's face for tools where `shown`, padded beside its buttons and standing `rise` +/// past the box's top and bottom. +fn tool_face(theme: &Theme, shown: bool, rise: f32) -> Spec<'static> { + if !shown { + return Spec::default(); + } + Spec { + fill: Some(theme.tool), + border: Some(theme.chip), + radius: 4.0, + inset: [0.0, -rise, 0.0, -rise], + pad: [FACE_PAD, 0.0], + ..Spec::default() + } +} + +/// The line leading a toolbar group, as far from its buttons as the groups are apart; groups +/// on faces of their own stand apart without one. fn divider(ui: &mut Ui, theme: &Theme) { + if grouped(theme) { + return; + } ui.leaf( "divider", Spec { @@ -5312,147 +5450,103 @@ const QUIT_PUBLISH: std::time::Duration = std::time::Duration::from_secs(3); impl ApplicationHandler for App { fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) { + let Some(state) = &mut self.state else { + match event { + UserEvent::Quit => self.close(event_loop), + // A cold launch's documents arrive before the window opens. + UserEvent::Open(paths) => self.opening.extend(paths), + _ => {} + } + return; + }; let event = match event { + UserEvent::Quit | UserEvent::Replay(Replay::Quit) => return self.close(event_loop), UserEvent::Picture(bytes) => { - if let Some(state) = &mut self.state { - if let Err(error) = state.insert_picture(bytes, None) { - eprintln!("{error}"); - } - state.window.request_redraw(); + if let Err(error) = state.insert_picture(bytes, None) { + eprintln!("{error}"); } - return; + return state.window.request_redraw(); } UserEvent::InsertText(text) => { - if let Some(state) = &mut self.state { - if state.ui.focused() == Some(page()) { - match state.view.insert_text(text) { - Ok(response) => state.respond(response), - Err(error) => eprintln!("{error}"), - } - state.window.request_redraw(); - } else { - state.input(ui::Event::Ime(Ime::Commit(text))); + if state.ui.focused() == Some(page()) { + match state.view.insert_text(text) { + Ok(response) => state.respond(response), + Err(error) => eprintln!("{error}"), } + state.window.request_redraw(); + } else { + state.input(ui::Event::Ime(Ime::Commit(text))); } return; } - UserEvent::Quit => { - self.close(event_loop); - return; - } UserEvent::Then(then) => { - if let Some(state) = &mut self.state { - if let Err(error) = then(state) { - eprintln!("{error}"); - } - state.window.request_redraw(); + if let Err(error) = then(state) { + eprintln!("{error}"); } - return; - } - UserEvent::ICloudFolder => { - if let Some(state) = &mut self.state { - state.list_icloud(); - } - return; + return state.window.request_redraw(); } + UserEvent::ICloudFolder => return state.list_icloud(), UserEvent::ICloudAccount => { - if let Some(state) = &mut self.state { - state.icloud_account_changed(); - state.window.request_redraw(); - } - return; + state.icloud_account_changed(); + return state.window.request_redraw(); } UserEvent::Open(paths) => { - match &mut self.state { - Some(state) => { - for path in paths { - state.open_path(&path); - } - state.window.set_minimized(false); - state.window.focus_window(); - state.window.request_redraw(); - } - // A cold launch's documents arrive before the window opens. - None => self.opening.extend(paths), + for path in paths { + state.open_path(&path); } - return; + state.window.set_minimized(false); + state.window.focus_window(); + return state.window.request_redraw(); } UserEvent::Update => { - if let Some(state) = &mut self.state { - state.updated(); - state.window.request_redraw(); - } - return; + state.updated(); + return state.window.request_redraw(); } UserEvent::Sync => { - if let Some(state) = &mut self.state - && let Err(error) = state.synced() - { + if let Err(error) = state.synced() { eprintln!("{error}"); } return; } - UserEvent::Choose(choice) => { - if let Some(state) = &mut self.state { - state.choose(choice); - } - return; - } + UserEvent::Choose(choice) => return state.choose(choice), UserEvent::Appearance => { - if let Some(state) = &mut self.state { - state.follow_color_scheme(); - state.window.request_redraw(); - } - return; - } - UserEvent::Redraw => { - if let Some(state) = &self.state { - state.window.request_redraw(); - } - return; + state.follow_color_scheme(); + return state.window.request_redraw(); } + UserEvent::Redraw => return state.window.request_redraw(), UserEvent::Replay(replay) => { - if let Some(state) = &mut self.state { - match replay { - Replay::Input(event) => state.input(event), - Replay::Pinch(factor) => { - if let Err(error) = state.pinch(factor) { - eprintln!("{error}"); - } + match replay { + Replay::Input(event) => state.input(event), + Replay::Pinch(factor) => { + if let Err(error) = state.pinch(factor) { + eprintln!("{error}"); } - Replay::Snapshot(path) => state.snapshot = Some(path), - Replay::Accessibility(path) => { - if let Err(error) = state.write_accessibility(&path) { - eprintln!("{error}"); - } - } - Replay::Tick => {} - Replay::Appearance(appearance) => { - state.window.set_theme(Some(appearance)); - state.set_appearance(appearance); - } - Replay::Resize([width, height]) => { - let _ = state - .window - .request_inner_size(LogicalSize::new(width, height)); - } - Replay::Quit => { - self.close(event_loop); - return; + } + Replay::Snapshot(path) => state.snapshot = Some(path), + Replay::Accessibility(path) => { + if let Err(error) = state.write_accessibility(&path) { + eprintln!("{error}"); } } - // A covered window gets no redraws, so each step draws its own frame. - if let Err(error) = state.frame() { - eprintln!("{error}"); + Replay::Tick | Replay::Quit => {} + Replay::Appearance(appearance) => { + state.window.set_theme(Some(appearance)); + state.set_appearance(appearance); + } + Replay::Resize([width, height]) => { + let _ = state + .window + .request_inner_size(LogicalSize::new(width, height)); } } + // A covered window gets no redraws, so each step draws its own frame. + if let Err(error) = state.frame() { + eprintln!("{error}"); + } return; } UserEvent::Accessibility(event) => event, }; - let Some(state) = &mut self.state else { - return; - }; if event.window_id != state.window.id() { return; } @@ -5679,9 +5773,10 @@ fn write_png(path: &Path, size: [u32; 2], pixels: &[u8]) -> Result<(), Box) -> Result<(), Box> { let mut steps = Vec::new(); for line in script.lines().filter(|line| !line.trim().is_empty()) { diff --git a/crates/snowbound/src/manage.rs b/crates/snowbound/src/manage.rs index ae9ff57bfdc9ba62adeba811ceebf64a52bd5e5c..4aebad7a5cc7ef9215f3cdd2fa316f11c85e7d4c 100644 --- a/crates/snowbound/src/manage.rs +++ b/crates/snowbound/src/manage.rs @@ -27,6 +27,8 @@ pub enum Structure { Delete { path: String, }, + /// Deletes for good what the recycle bin holds. + EmptyRecycleBin, /// Moves a section or group into another folder. Move { path: String, @@ -55,6 +57,12 @@ pub enum Structure { name: String, color: Option, }, + /// Sets, changes or removes a section's password: `key` opens it as it stands. + Password { + path: String, + key: Option, + password: Option>, + }, } /// New iCloud Notebook while it is open: the name typed, and why the last was refused. @@ -234,7 +242,7 @@ impl State { } /// Applies `ops` to the open page as one edit and shows the result. - fn edit_page(&mut self, ops: Vec) -> Result<(), Box> { + pub(crate) fn edit_page(&mut self, ops: Vec) -> Result<(), Box> { if ops.is_empty() { return Ok(()); } @@ -247,6 +255,7 @@ impl State { ops: ops.into_iter().map(|op| Op::Page { space, op }).collect(), }, )?; + self.edited(vec![space]); self.refresh() } @@ -351,22 +360,7 @@ impl State { }, ); } - ui.open( - "buttons", - Spec { - size: [fill(), children()], - pad: [0.0, 8.0], - gap: 8.0, - ..Spec::default() - }, - ); - ui.leaf( - "space", - Spec { - size: [fill(), px(1.0)], - ..Spec::default() - }, - ); + crate::buttons(ui); let cancel = ui::button(ui, "cancel", "Cancel").clicked; let create = ui::button(ui, "create", "Create").clicked || entered; ui.close(); @@ -660,23 +654,15 @@ impl State { library.close_kept(); let mut notebook = library.reopen()?; let names = |notebook: &Notebook, folder: &str| -> Vec { - let mut folders = vec![notebook.catalog()]; - while let Some(candidate) = folders.pop() { - if candidate.path == folder { - return candidate - .sections - .iter() - .map(|section| section.path.clone()) - .chain(candidate.groups.iter().map(|group| group.path.clone())) - .map(|path| { - let name = path.rsplit('/').next().unwrap_or_default(); - name.strip_suffix(".one").unwrap_or(name).to_owned() - }) - .collect(); - } - folders.extend(&candidate.groups); - } - Vec::new() + let found = crate::library::folders(notebook.catalog(), |_| true) + .into_iter() + .find(|candidate| candidate.path == folder); + found.map_or_else(Vec::new, |folder| { + (folder.sections.iter().map(|section| §ion.path)) + .chain(folder.groups.iter().map(|group| &group.path)) + .map(|path| crate::library::entry_name(path).to_owned()) + .collect() + }) }; // A notebook not shown stays so through a change of its colours or name. let stays = matches!( @@ -709,6 +695,11 @@ impl State { notebook.delete(&path)?; (current, None) } + // A section of the bin open goes with it. + Structure::EmptyRecycleBin => { + notebook.empty_recycle_bin()?; + (current.filter(|path| !crate::recycle::binned(path)), None) + } Structure::Move { path, folder } => { let moved = notebook.move_entry(&path, &folder)?; (current.map(|current| follow(¤t, &path, &moved)), None) @@ -732,6 +723,24 @@ impl State { notebook.set_section_color(&path, color)?; (current, None) } + Structure::Password { + path, + key, + password, + } => { + let key = notebook.set_password( + &path, + key.as_ref(), + password.as_deref().map(String::as_str), + )?; + let library = Arc::new(library.with(notebook)); + if let Some(key) = key { + library.keep_key(&path, key); + } + let section = library.open(&path, notify)?; + let (session, page) = read_session(section, library, path, None)?; + return Ok(Loaded::Section(Box::new(session), page)); + } Structure::Properties { name, color } => { if name != library.name { library.set_display_name(&name)?; @@ -1187,7 +1196,8 @@ mod tests { let root = temporary.join("Emptied"); let location = root.to_str().unwrap(); let cache = temporary.join("cache"); - let mut notebook = Notebook::create(location, &cache, Notebook::NEW_COLOR, &dated()).unwrap(); + let mut notebook = + Notebook::create(location, &cache, Notebook::NEW_COLOR, &dated()).unwrap(); notebook.create_group("", "Group").unwrap(); notebook.create_section("Group", "Inner", &dated()).unwrap(); diff --git a/crates/snowbound/src/media_linux.rs b/crates/snowbound/src/media_linux.rs index 951989d12522f2d06a5864dd8d38b86636ccea98..906fda14dfdc579b2a2a37fbfe2ca37c1b4b0e82 100644 --- a/crates/snowbound/src/media_linux.rs +++ b/crates/snowbound/src/media_linux.rs @@ -3,7 +3,7 @@ //! with gst-libav), the default microphone records as PCM WAV, and the default camera with //! it as the Motion JPEG AVI file OneNote plays. Recording needs the Base and Good plug-ins. -use crate::video; +use crate::{platform::symbol, video}; use std::{ cell::Cell, ffi::{CStr, CString, c_char, c_int, c_void}, @@ -50,12 +50,6 @@ struct Gst { unsafe impl Send for Gst {} unsafe impl Sync for Gst {} -/// The function `name` in `library`, of C signature `F`. -unsafe fn symbol(library: *mut c_void, name: &CStr) -> Option { - let symbol = unsafe { libc::dlsym(library, name.as_ptr()) }; - (!symbol.is_null()).then(|| unsafe { std::mem::transmute_copy::<*mut c_void, F>(&symbol) }) -} - /// GStreamer, initialized; none where it is not installed. fn gst() -> Option<&'static Gst> { static GST: OnceLock> = OnceLock::new(); @@ -84,20 +78,6 @@ fn gst() -> Option<&'static Gst> { .as_ref() } -/// `path` as a `file://` URI, every byte outside the unreserved set escaped. -fn uri(path: &Path) -> String { - let mut uri = String::from("file://"); - for byte in path.as_os_str().as_encoded_bytes() { - match byte { - b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'.' | b'_' | b'~' | b'/' => { - uri.push(char::from(*byte)); - } - _ => uri.push_str(&format!("%{byte:02X}")), - } - } - uri -} - /// A pipeline described as `gst-launch` takes one, paused. struct Pipeline { gst: &'static Gst, @@ -191,7 +171,7 @@ impl Player { }; let pipeline = Pipeline::launch(&format!( "playbin uri=\"{}\" video-sink=fakesink{silent}", - uri(path) + crate::platform::file_uri(path) ))?; // Prerolling reports a file no plugin decodes as an error. if pipeline.wait(PATIENCE, ASYNC_DONE | ERROR) != Some(ASYNC_DONE) { diff --git a/crates/snowbound/src/menubar.rs b/crates/snowbound/src/menubar.rs index ce1ac69d08e6185b24372108814818ebd362ee43..2487c8bb5b79326b0019a7b6105c7dd5a2b5fc05 100644 --- a/crates/snowbound/src/menubar.rs +++ b/crates/snowbound/src/menubar.rs @@ -67,6 +67,18 @@ const MENUS: &[Item] = &[ C(Id::CopyPageLink), C(Id::ShowNotebook), S, + C(Id::PasswordProtect), + C(Id::LockAll), + S, + C(Id::MarkRead), + C(Id::MarkNotebookRead), + C(Id::NextUnread), + C(Id::ShowUnread), + S, + C(Id::RecycleBin), + C(Id::EmptyRecycleBin), + S, + C(Id::SaveAs), C(Id::ExportPdf), S, C(Id::Print), diff --git a/crates/snowbound/src/menus.rs b/crates/snowbound/src/menus.rs index 318bec8efc14036f32ee84d7c228a9d41c870ec5..47d44af69a5686045ae4ace76a985b5d9cfc728d 100644 --- a/crates/snowbound/src/menus.rs +++ b/crates/snowbound/src/menus.rs @@ -6,6 +6,7 @@ use crate::{ commands::{self, Choice}, manage::Structure, platform, + recycle::Request, }; use onestore::{ExGuid, PageEdit}; use std::sync::Arc; @@ -87,6 +88,15 @@ pub enum Action { Move, /// Moves it to a section, or into a folder, by catalog path. MoveTo(String), + /// Opens the submenu of the sections `CopyTo` copies a page of the recycle bin to. + Copy, + CopyTo(String), + /// Save As on a section or notebook. + SaveAs, + /// Shows the notebook's recycle bin. + RecycleBin, + EmptyRecycleBin, + MarkNotebookRead, CopyLink, NewPage, NewSubpage, @@ -110,6 +120,8 @@ pub enum Action { /// Moves a notebook up the notebook list, or down. Raise(bool), Properties, + /// Opens Password Protection on a section. + Password, } /// OneNote 2010's section and notebook colours, COLORREF, with their names in its Section @@ -259,7 +271,7 @@ impl State { pub(crate) fn actions(&self, target: &Target) -> Vec<(Action, Item<'static>)> { // An action, its label, whether it is disabled, and whether a rule starts its group. let item = |action: Action, text, disabled, separated| { - let submenu = matches!(action, Action::Move | Action::Colors); + let submenu = matches!(action, Action::Move | Action::Copy | Action::Colors); let item = Item { text, disabled, @@ -271,6 +283,18 @@ impl State { }; let nowhere = || self.destinations(target).is_empty(); match target { + // OneNote's Move or Copy takes a page out of the bin; nothing else changes it. + Target::Page { path, .. } if crate::recycle::binned(path) => vec![ + item(Action::Delete, "Delete", false, false), + item(Action::Move, "Restore To", nowhere(), true), + item(Action::Copy, "Copy To", nowhere(), false), + ], + Target::Section { path, .. } if crate::recycle::binned(path) => vec![ + item(Action::SaveAs, "Save As…", false, false), + item(Action::Move, "Restore To", nowhere(), false), + item(Action::EmptyRecycleBin, "Empty Recycle Bin", false, true), + item(Action::Colors, "Section Color", false, true), + ], Target::Page { library, path, @@ -321,16 +345,26 @@ impl State { actions } Target::Section { library, path } | Target::Group { library, path } => { - let mut actions = vec![ - item(Action::Rename, "Rename", false, false), + let section = matches!(target, Target::Section { .. }); + let mut actions = vec![item(Action::Rename, "Rename", false, false)]; + if section { + actions.push(item(Action::SaveAs, "Save As…", false, false)); + } + actions.extend([ item(Action::Delete, "Delete", false, false), item(Action::Move, "Move", nowhere(), false), item(Action::NewSection, "New Section", false, true), item(Action::NewGroup, "New Section Group", false, false), - ]; - if matches!(target, Target::Section { .. }) { + ]); + if section { actions.extend([ - item(Action::Colors, "Section Color", false, true), + item( + Action::Password, + "Password Protect This Section…", + library.catalog().is_none(), + true, + ), + item(Action::Colors, "Section Color", false, false), item( Action::Reveal, platform::SHOW_FILE, @@ -345,8 +379,15 @@ impl State { Target::Notebook(library) => { let listed = (self.notebooks.iter()).position(|open| Arc::ptr_eq(open, library)); let last = self.notebooks.len().saturating_sub(1); + let unread = self.unread_notebook(library); vec![ item(Action::Rename, "Rename…", false, false), + item( + Action::SaveAs, + "Save As…", + library.catalog().is_none(), + false, + ), item( Action::Sync, "Sync This Notebook Now", @@ -369,6 +410,12 @@ impl State { false, false, ), + item( + Action::MarkNotebookRead, + "Mark Notebook as Read", + !unread, + true, + ), item( Action::Raise(true), "Move Up", @@ -388,6 +435,12 @@ impl State { true, ), item(Action::Theme, "Theme…", false, false), + item( + Action::RecycleBin, + "Notebook Recycle Bin", + library.catalog().is_none(), + true, + ), item( Action::Properties, "Properties…", @@ -416,13 +469,22 @@ impl State { let items: Vec = actions.iter().map(|(_, item)| *item).collect(); let chosen = ui::popup::menu(&mut self.ui, id, anchor, &items, filter); let places = id.child("move"); + let copies = id.child("copy"); let colors = id.child("colors"); ui::popup::submenus(&mut self.ui, id, &items, |index| match actions[index].0 { Action::Move => Some(places), + Action::Copy => Some(copies), Action::Colors => Some(colors), _ => None, }); - let moved = if self.ui.popup_open(places) { + let mut moved = None; + for (submenu, chosen) in [ + (places, Action::MoveTo as fn(String) -> Action), + (copies, Action::CopyTo), + ] { + if !self.ui.popup_open(submenu) { + continue; + } let destinations = self.destinations(target); let items: Vec = (destinations.iter()) .map(|place| Item { @@ -432,11 +494,9 @@ impl State { ..Item::default() }) .collect(); - ui::popup::menu(&mut self.ui, places, anchor, &items, None) - .map(|index| Action::MoveTo(destinations[index].path.clone())) - } else { - None - }; + moved = moved.or(ui::popup::menu(&mut self.ui, submenu, anchor, &items, None) + .map(|index| chosen(destinations[index].path.clone()))); + } let colored = match target { Target::Section { library, path } if self.ui.popup_open(colors) => { let current = (library.tabs(&folder(path)).into_iter()) @@ -474,6 +534,17 @@ impl State { fn destinations(&self, target: &Target) -> Vec { let theme = &self.ui.theme; match target { + Target::Page { library, path, .. } if crate::recycle::binned(path) => { + (folders(library).into_iter()) + .flat_map(|place| library.tabs(&place.path)) + .map(|tab| Destination { + tint: Some(theme.section(crate::section_color(tab.color)).accent), + name: tab.name, + path: tab.path, + icon: crate::art::SECTION, + }) + .collect() + } Target::Page { library, path, .. } => (library.tabs(&folder(path)).into_iter()) .filter(|tab| tab.path != *path) .map(|tab| Destination { @@ -536,6 +607,33 @@ impl State { (Target::Section { library, path }, Action::Open) => { Some(Command::OpenSection(library, path)) } + (Target::Section { library, path }, Action::SaveAs) => { + self.open_save_as(library, Some(path), crate::save_as::Scope::Section); + None + } + (Target::Notebook(library), Action::SaveAs) => { + self.open_save_as(library, None, crate::save_as::Scope::Notebook); + None + } + ( + Target::Section { library, .. } | Target::Notebook(library), + Action::EmptyRecycleBin, + ) => { + self.empty_recycle_bin(library); + None + } + (Target::Notebook(library), Action::RecycleBin) => { + self.toggle_recycle_bin(library); + None + } + (Target::Notebook(library), Action::MarkNotebookRead) => { + self.mark_notebook_read(&library); + None + } + (Target::Section { library, path }, Action::Password) => { + self.password_protection(library, path); + None + } (Target::Notebook(library), Action::Open) => { self.open_notebook(library.location.clone(), None); None @@ -665,7 +763,22 @@ impl State { self.rename(crate::rename::Target::Page(space)); None } + Action::Delete if self.in_recycle_bin() => { + Some(Command::Recycle(Request::Purge(vec![space]))) + } Action::Delete => Some(Command::DeletePages(vec![space])), + Action::MoveTo(path) if self.in_recycle_bin() => { + Some(Command::Recycle(Request::Restore { + space, + path, + copy: false, + })) + } + Action::CopyTo(path) => Some(Command::Recycle(Request::Restore { + space, + path, + copy: true, + })), Action::MoveTo(path) => Some(Command::MovePage { space, path }), Action::CopyLink => { let copied = self @@ -915,15 +1028,9 @@ fn new(action: &Action, folder: String) -> Option { /// `library`'s folders of sections, the notebook's first, then its section groups breadth /// first, but for the recycle bin; none for a section opened on its own. pub(crate) fn folders(library: &Library) -> Vec<¬ebook::discover::Folder> { - let mut folders: Vec<_> = library.catalog().into_iter().collect(); - let mut at = 0; - while let Some(&folder) = folders.get(at) { - folders.extend( - (folder.groups.iter()).filter(|group| !crate::library::recycle_bin(&group.path)), - ); - at += 1; - } - folders + library.catalog().map_or_else(Vec::new, |catalog| { + crate::library::folders(catalog, |group| !crate::library::recycle_bin(&group.path)) + }) } #[cfg(test)] diff --git a/crates/snowbound/src/navigation.rs b/crates/snowbound/src/navigation.rs index 6c378795ee935aeb1a0b317406aa5b310dbd3bfb..843cc45ec1bdb1f773a001f1e43070019e8aa0fe 100644 --- a/crates/snowbound/src/navigation.rs +++ b/crates/snowbound/src/navigation.rs @@ -288,6 +288,7 @@ mod tests { identity: None, created: None, margin_origin: [0.0; 2], + rtl: false, color: None, rule_lines: None, objects: Vec::new(), diff --git a/crates/snowbound/src/options.rs b/crates/snowbound/src/options.rs index e32feff63f8f568aa0b2306cf10ffde4efcac8cb..56ce5c9e505c3b26a5aa96d08151c947063ccf90 100644 --- a/crates/snowbound/src/options.rs +++ b/crates/snowbound/src/options.rs @@ -125,6 +125,28 @@ const SECTIONS: &[Section] = &[ control: Control::Check(|options| &mut options.pen_pressure), }], }, + Group { + heading: "Passwords", + rows: &[ + Row { + label: "Lock password protected sections after I have not worked in \ + them for:", + keywords: "protect protected lock unlock idle minutes timeout security", + control: Control::Check(|options| &mut options.lock_idle), + }, + Row { + label: "Amount of time:", + keywords: "password protect protected lock idle minutes hours timeout", + control: Control::Field(lock_after), + }, + Row { + label: "Lock password protected sections as soon as I navigate away \ + from them", + keywords: "password protect protected lock leave switch security", + control: Control::Check(|options| &mut options.lock_on_leave), + }, + ], + }, ], }, Section { @@ -210,6 +232,10 @@ pub struct Options { default_font: DefaultFont, page_tabs_left: bool, navigation_bar_left: bool, + lock_idle: bool, + /// Minutes, as `protection::AFTER` lists them. + lock_minutes: u32, + lock_on_leave: bool, pub(crate) keyboard: crate::keys::Keyboard, } @@ -241,6 +267,10 @@ fn sizes() -> Id { id().child("sizes") } +fn lock_times() -> Id { + id().child("lock-times") +} + fn font_colors() -> Id { id().child("font-colors") } @@ -298,6 +328,9 @@ impl State { default_font: self.view.editor.default_font.clone(), page_tabs_left: self.page_tabs_left, navigation_bar_left: !self.navigation_bar_right, + lock_idle: self.passwords.lock_after.is_some(), + lock_minutes: self.passwords.lock_after.unwrap_or(10), + lock_on_leave: self.passwords.lock_on_leave, keyboard: crate::keys::Keyboard::new(), }); self.ui.open_popup(id()); @@ -600,6 +633,10 @@ impl State { self.view.editor.default_font = options.default_font; self.page_tabs_left = options.page_tabs_left; self.navigation_bar_right = !options.navigation_bar_left; + self.passwords = crate::settings::Passwords { + lock_after: options.lock_idle.then_some(options.lock_minutes), + lock_on_leave: options.lock_on_leave, + }; self.updates.set_automatic(options.automatic_updates); self.show_spelling(); self.follow_color_scheme(); @@ -679,6 +716,35 @@ fn appearance(state: &mut State, options: &mut Options) { } } +fn lock_after(state: &mut State, options: &mut Options) { + let ui = &mut state.ui; + let combo = ui.id("combo"); + let current = crate::protection::AFTER + .iter() + .find(|(minutes, _)| *minutes == options.lock_minutes) + .map_or("", |(_, name)| name); + ui::shell::combo( + ui, + "combo", + "Amount of time", + current, + 140.0, + lock_times(), + true, + ); + let items = crate::protection::AFTER.map(|(minutes, name)| Item { + text: name, + checked: Some(minutes == options.lock_minutes), + current: minutes == options.lock_minutes, + ..Item::default() + }); + let anchor = Anchor::Below(ui.rect(combo).unwrap_or_default()); + if let Some(index) = ui::popup::menu(ui, lock_times(), anchor, &items, None) { + options.lock_minutes = crate::protection::AFTER[index].0; + options.lock_idle = true; + } +} + fn user_name_field(state: &mut State, options: &mut Options) { let ui = &mut state.ui; let theme = &ui.theme; diff --git a/crates/snowbound/src/pane.rs b/crates/snowbound/src/pane.rs index 5ab37abf056e316a355e491df9ea5039aec1dd45..af0eebc0ed1b29aa2f6cac3cbd101de2d13c530d 100644 --- a/crates/snowbound/src/pane.rs +++ b/crates/snowbound/src/pane.rs @@ -929,7 +929,7 @@ impl State { /// The tagged paragraphs `scope` takes in, only those not checked off when `unchecked`. fn tagged(&self, scope: TagScope, unchecked: bool) -> Vec { let session = self.session.as_ref(); - let open = session.map(|session| session.library.key(&session.tabs[session.tab].path)); + let open = session.map(crate::Session::key); // The open page with its subpages, or the page it is a subpage of with its others. let group: Vec<_> = session .and_then(|session| { diff --git a/crates/snowbound/src/prefetch.rs b/crates/snowbound/src/prefetch.rs index de956b5a5a1d9ed1f03673c73bccfd2beb7f7b76..73d5df0ff3a348272e78c300c31ec2464c11fda3 100644 --- a/crates/snowbound/src/prefetch.rs +++ b/crates/snowbound/src/prefetch.rs @@ -38,6 +38,11 @@ impl Recent { self.entries.iter().any(|(held, _)| held == key) } + /// Lets go of the entries `keep` refuses. + pub fn retain(&mut self, keep: impl Fn(&K) -> bool) { + self.entries.retain(|(key, _)| keep(key)); + } + pub fn values_mut(&mut self) -> impl Iterator { self.entries.iter_mut().map(|(_, value)| value) } @@ -143,6 +148,14 @@ impl Prefetch { } } + /// Lets go of the scenes kept of the section `section` names, as a locked one's. + pub fn forget(&mut self, section: &str) { + if let Ok(mut scenes) = self.scenes.lock() { + scenes.retain(|(kept, _)| kept != section); + } + self.asked.retain(|(asked, _)| asked != section); + } + /// Whether `target` is new since it was last asked for, noting it. fn ask(&mut self, target: (String, Option)) -> bool { let new = !self.asked.contains(&target); diff --git a/crates/snowbound/src/print.rs b/crates/snowbound/src/print.rs index d2ed1c9594ef9459943aa740b08541c218d299ec..c7dcf65a55e7129922ed7857df19861638baf7f9 100644 --- a/crates/snowbound/src/print.rs +++ b/crates/snowbound/src/print.rs @@ -146,6 +146,14 @@ impl State { self.ui.open_popup(id()); } + /// Opens Export as PDF on `scope`, as Save As's PDF does. + pub(crate) fn export_pdf(&mut self, scope: Scope) { + self.open_print(true); + if let Some(dialog) = &mut self.printing.dialog { + dialog.setup.scope = scope; + } + } + /// Builds the dialog while it is open; Print or Export goes on with its choices, which /// the next opening starts from. pub(crate) fn print_dialog(&mut self) { @@ -247,22 +255,7 @@ impl State { setup.footer = FOOTERS[at]; } }); - ui.open( - "buttons", - Spec { - size: [fill(), children()], - pad: [0.0, 8.0], - gap: 8.0, - ..Spec::default() - }, - ); - ui.leaf( - "space", - Spec { - size: [fill(), px(1.0)], - ..Spec::default() - }, - ); + crate::buttons(ui); let cancel = ui::button(ui, "cancel", "Cancel").clicked; let action = if dialog.export { "Export…" @@ -349,6 +342,7 @@ impl State { fit_width: setup.fit_width, footer: setup.footer, }; + let whole = matches!(setup.scope, Scope::Section | Scope::Notebook); std::thread::spawn(move || { let made = (|| -> Result, Box> { let mut open = Some(open); @@ -359,6 +353,7 @@ impl State { None => replica.page(space).map_err(Into::into), }) .collect::, Box>>()?; + let this = if whole { printed(this) } else { this }; let mut this = Some((open_tab.1.clone(), this)); let sections = if others.is_empty() { this.into_iter().collect() @@ -377,7 +372,7 @@ impl State { .into_iter() .map(|(space, ..)| section.page(space)) .collect::, _>>()?; - Ok((name, pages)) + Ok((name, printed(pages))) }) .collect::, Box>>()? }; @@ -419,18 +414,20 @@ fn group(levels: &[u32], at: usize) -> std::ops::Range { start..end } -/// Every readable section of `library`, catalog path and name, a folder's sections before -/// its groups', as OneNote orders them. +/// Every readable section of `library` but the recycle bin's, catalog path and name, in the +/// order each folder's TOC lists its sections and groups, as OneNote's notebook PDF prints them. fn notebook_tabs(library: &Library) -> Vec<(String, String)> { fn walk(library: &Library, folder: &Folder, tabs: &mut Vec<(String, String)>) { - tabs.extend( - library - .tabs(&folder.path) - .into_iter() - .map(|tab| (tab.path, tab.name)), - ); - for group in &folder.groups { - walk(library, group, tabs); + let mut sections = library.tabs(&folder.path); + for path in &folder.order { + if let Some(at) = sections.iter().position(|tab| tab.path == *path) { + let tab = sections.remove(at); + tabs.push((tab.path, tab.name)); + } else if let Some(group) = (folder.groups.iter()) + .find(|group| group.path == *path && !crate::library::recycle_bin(&group.path)) + { + walk(library, group, tabs); + } } } let mut tabs = Vec::new(); @@ -441,8 +438,17 @@ fn notebook_tabs(library: &Library) -> Vec<(String, String)> { tabs } +/// The pages of `pages` a section's or notebook's PDF prints: all but untitled ones holding +/// only their date. +fn printed(pages: Vec) -> Vec { + pages + .into_iter() + .filter(|page| !crate::undo::blank(page)) + .collect() +} + /// `title` as a file name: without the characters Windows and macOS refuse in one. -fn file_name(title: &str) -> String { +pub(crate) fn file_name(title: &str) -> String { let name: String = title .chars() .map(|c| match c { @@ -486,4 +492,137 @@ mod tests { assert_eq!(group(&levels, 3), 3..4); assert_eq!(group(&levels, 5), 4..6); } + + /// A notebook whose root lists section A, group G (holding C) and section B in that order, + /// A holding a titled page, an untitled page with only its date and an untitled page with + /// text, each read through the app's sections as printing reads them. + fn ordered_notebook(temporary: &std::path::Path) -> Library { + use notebook::session::Notebook; + use onestore::{ + PageCreation, + op::{Edit, Op, SectionOp}, + }; + let _ = std::fs::remove_dir_all(temporary); + std::fs::create_dir_all(temporary).unwrap(); + let root = temporary.join("Ordered"); + let cache = temporary.join("cache"); + let page = |title: &str| { + PageCreation::new(None, Some(title), "Author") + .unwrap() + .dated("Thursday, October 1, 2026", "12:30 AM") + .unwrap() + }; + let mut notebook = + Notebook::create(&root, &cache, Notebook::NEW_COLOR, &page("A titled")).unwrap(); + notebook.rename("New Section 1.one", "A").unwrap(); + notebook.create_section("", "B", &page("B titled")).unwrap(); + notebook.create_group("", "G").unwrap(); + notebook + .create_section("G", "C", &page("C titled")) + .unwrap(); + notebook.reorder("", &["A.one", "G", "B.one"]).unwrap(); + let library = Library::created(root.to_str().unwrap(), notebook, &cache); + let section = library.open("A.one", || {}).unwrap(); + let (dated, written) = (page(""), page("")); + let space = written.space(); + let edit = |ops| Edit { + at: crate::filetime(), + ops, + }; + let create = |creation| Op::Section(SectionOp::Create(creation)); + (section.apply("Author", edit(vec![create(dated), create(written)]))).unwrap(); + let meeting = crate::templates::Choice::Template("Informal Meeting Notes"); + let ops = crate::manage::template_ops(§ion.page(space).unwrap(), meeting, Vec::new()) + .unwrap() + .into_iter() + .map(|op| Op::Page { space, op }) + .collect(); + section.apply("Author", edit(ops)).unwrap(); + // The template titles the page; its title goes, its text stays. + let untitled = crate::rename::retitled(§ion.page(space).unwrap(), space, String::new()); + section + .apply("Author", edit(vec![untitled.unwrap()])) + .unwrap(); + library.keep("A.one", section); + library + } + + /// A notebook exports in the order its tables of contents list sections and groups, as + /// OneNote 2010's Save As, Notebook, PDF prints A, then G's C, then B, though its own + /// navigation lists A, B, then G (lab, 2026-10-01). + #[test] + fn a_notebook_exports_in_the_order_it_lists_sections_and_groups() { + let temporary = + std::env::temp_dir().join(format!("snowbound-print-order-{}", std::process::id())); + let library = ordered_notebook(&temporary); + let tabs = notebook_tabs(&library); + library.close_kept(); + drop(library); + let _ = std::fs::remove_dir_all(&temporary); + let paths: Vec<&str> = tabs.iter().map(|(path, _)| path.as_str()).collect(); + assert_eq!(paths, ["A.one", "G/C.one", "B.one"]); + } + + /// An untitled page holding only its date is left out, and one holding text is printed, + /// as OneNote 2010's Save As, Section and Notebook, PDF do (lab, 2026-10-01). + #[test] + fn untitled_pages_holding_only_their_date_are_left_out() { + let temporary = + std::env::temp_dir().join(format!("snowbound-print-blank-{}", std::process::id())); + let library = ordered_notebook(&temporary); + let section = library.open("A.one", || {}).unwrap(); + let pages: Vec = (section.pages().unwrap().into_iter()) + .map(|(space, ..)| section.page(space).unwrap()) + .collect(); + section.close().unwrap(); + drop(library); + let _ = std::fs::remove_dir_all(&temporary); + assert_eq!(pages.len(), 3); + // A page's title as typed, which its title object holds. + let typed = |page: &Page| { + page.objects + .iter() + .find_map(|object| match object { + onestore::page::PageObject::Title(title) => { + let text = title.outlines.first()?.paragraphs.first()?.text()?; + Some(text.text.text().to_owned()) + } + _ => None, + }) + .unwrap_or_default() + }; + let printed: Vec<(String, usize)> = printed(pages) + .iter() + .map(|page| (typed(page), page.objects.len())) + .collect(); + assert_eq!(printed.len(), 2, "{printed:?}"); + assert_eq!(printed[0].0, "A titled"); + assert!(printed[1].0.is_empty() && printed[1].1 > 1, "{printed:?}"); + } + + /// A notebook exported whole leaves out its recycle bin, as OneNote 2010's Save As, + /// Notebook, PDF does. + #[test] + fn a_notebook_exports_without_its_recycle_bin() { + use notebook::session::Notebook; + let temporary = + std::env::temp_dir().join(format!("snowbound-print-bin-{}", std::process::id())); + let _ = std::fs::remove_dir_all(&temporary); + std::fs::create_dir_all(&temporary).unwrap(); + let root = temporary.join("Printed"); + let cache = temporary.join("cache"); + let page = || onestore::PageCreation::new(None, Some(""), "Author").unwrap(); + let mut notebook = Notebook::create(&root, &cache, Notebook::NEW_COLOR, &page()).unwrap(); + notebook.create_group("", "Group").unwrap(); + notebook.create_section("Group", "Inner", &page()).unwrap(); + notebook.create_section("", "Binned", &page()).unwrap(); + notebook.delete("Binned.one").unwrap(); + let library = Library::created(root.to_str().unwrap(), notebook, &cache); + let paths: Vec = notebook_tabs(&library) + .into_iter() + .map(|(path, _)| path) + .collect(); + std::fs::remove_dir_all(&temporary).unwrap(); + assert_eq!(paths, ["New Section 1.one", "Group/Inner.one"]); + } } diff --git a/crates/snowbound/src/properties.rs b/crates/snowbound/src/properties.rs index 3a80591cd984ecab479ef97e355826920940c48a..2ad450211c1a1fa49d0801f0f04f46d00108a3ce 100644 --- a/crates/snowbound/src/properties.rs +++ b/crates/snowbound/src/properties.rs @@ -151,27 +151,11 @@ impl State { } label(ui, "Location:"); dim(ui, "location", &dialog.library.location); - let folder = dialog.library.folder().map(std::path::Path::to_owned); let reveal = commands::command(commands::Id::ShowNotebook).title; - if folder.is_some() && ui::button(ui, "reveal", reveal).clicked { + if dialog.library.folder().is_some() && ui::button(ui, "reveal", reveal).clicked { crate::platform::reveal(&dialog.library.location); } - ui.open( - "buttons", - Spec { - size: [fill(), children()], - pad: [0.0, 8.0], - gap: 8.0, - ..Spec::default() - }, - ); - ui.leaf( - "space", - Spec { - size: [fill(), px(1.0)], - ..Spec::default() - }, - ); + crate::buttons(ui); let ok = ui::button(ui, "ok", "OK").clicked || entered; let cancel = ui::button(ui, "cancel", "Cancel").clicked; ui.close(); diff --git a/crates/snowbound/src/protection.rs b/crates/snowbound/src/protection.rs new file mode 100644 index 0000000000000000000000000000000000000000..9c0c3c6aee01dc2716c463159c292ac5f92839bf --- /dev/null +++ b/crates/snowbound/src/protection.rs @@ -0,0 +1,642 @@ +//! Password-protected sections as OneNote 2010 shows them: a locked section's page, the +//! dialogs that unlock one and set, change or remove its password, Lock All, and locking a +//! section after a while unused or as it is left. Keys live in memory only (`Library`). + +use crate::{Command, Library, State, Theme, art, manage::Structure}; +use accesskit::Role; +use std::{error::Error, sync::Arc, time::Duration}; +use ui::{Anchor, Axis, Flags, Id, Spec, Ui, children, fill, px}; +use winit::keyboard::NamedKey; +use zeroize::Zeroizing; + +const WIDTH: f32 = 440.0; + +/// What Options' "Lock password protected sections after…" offers, in minutes, as +/// OneNote 2010's list does. +pub const AFTER: [(u32, &str); 11] = [ + (1, "1 Minute"), + (5, "5 Minutes"), + (10, "10 Minutes"), + (15, "15 Minutes"), + (30, "30 Minutes"), + (60, "1 Hour"), + (120, "2 Hours"), + (240, "4 Hours"), + (480, "8 Hours"), + (720, "12 Hours"), + (1440, "1 Day"), +]; + +/// A password-protected section shown locked, in place of its pages. +pub struct Locked { + pub library: Arc, + pub path: String, +} + +/// A password dialog on a section. +pub struct Asking { + library: Arc, + path: String, + dialog: Dialog, +} + +enum Dialog { + /// Protected Section: the password that unlocks it; whether the last was wrong. + Unlock(Zeroizing, bool), + /// Password Protection: whether it is protected, and the ways to change that. + Protection, + /// Sets a password: it, its confirmation, and why the last try was refused. + Set([Zeroizing; 2], Option<&'static str>), + /// Change Password: the old password, the new one and its confirmation. + Change([Zeroizing; 3], Option<&'static str>), + /// Remove Password: the current password. + Remove(Zeroizing, bool), +} + +fn id() -> Id { + Id::ROOT.child("password") +} + +fn field(index: usize) -> Id { + id().child(("field", index)) +} + +/// The locked page's notice, which a click or Enter unlocks. +fn notice() -> Id { + Id::ROOT.child("locked-notice") +} + +fn section_name(path: &str) -> &str { + let name = path.rsplit('/').next().unwrap_or(path); + name.strip_suffix(".one").unwrap_or(name) +} + +impl State { + /// Shows the locked section `path` of `library` in place of the open section, which stays + /// open a while for coming back to. + pub(crate) fn show_locked( + &mut self, + library: Arc, + path: String, + ) -> Result<(), Box> { + self.stop_loading(); + self.persist()?; + if let Some(previous) = self.session.take() { + let path = &previous.tabs[previous.tab].path; + if self.leave(&previous.library, path) { + previous.section.close()?; + } else { + previous.library.keep(path, previous.section); + } + } + self.sectionless = None; + self.locked = Some(Locked { library, path }); + self.ui.set_focus(Some(notice())); + self.title(); + Ok(()) + } + + /// Locks `path` of `library` as it is left, where Options asks for that; whether it did. + pub(crate) fn leave(&mut self, library: &Arc, path: &str) -> bool { + if self.passwords.lock_on_leave && library.protected(path) { + library.lock(|locked, _| locked == path); + self.prefetch.forget(&library.key(path)); + return true; + } + false + } + + /// The section tabs of the locked section's folder, its own shown. + pub(crate) fn locked_tabs( + &mut self, + row: Id, + section: &ui::Section, + strip: [f32; 4], + ) -> (Option, Id) { + let Some(locked) = &self.locked else { + return (None, row); + }; + let library = Arc::clone(&locked.library); + let tabs = library.tabs(&crate::menus::folder(&locked.path)); + let shown = tabs + .iter() + .position(|tab| tab.path == locked.path) + .unwrap_or(0); + let names: Vec<_> = tabs + .iter() + .map(|tab| (tab.name.as_str(), crate::section_color(tab.color), false)) + .collect(); + let drawn = ui::shell::section_tabs( + &mut self.ui, + row, + &names, + shown, + None, + None, + section, + crate::TAB_ROW, + strip, + ); + if let Some((tab, point)) = drawn.context { + self.menu = Some(( + crate::menus::Target::Section { + library: Arc::clone(&library), + path: tabs[tab].path.clone(), + }, + point, + )); + self.ui.open_popup(crate::menus::id()); + } + let clicked = drawn + .clicked + .filter(|tab| *tab != shown) + .map(|tab| Command::OpenSection(library, tabs[tab].path.clone())); + (clicked, drawn.open) + } + + /// The locked section's page, as OneNote 2010 draws it: a click or Enter unlocks. + pub(crate) fn locked_page(&mut self, theme: &Theme) { + let Some(locked) = &self.locked else { + return; + }; + let (library, path) = (Arc::clone(&locked.library), locked.path.clone()); + let ui = &mut self.ui; + let entered = + ui::popup::navigation(ui, &[notice()], &[NamedKey::Enter]).contains(&NamedKey::Enter); + let area = ui.open( + "locked", + Spec { + size: [fill(), fill()], + fill: Some(ui::mix(theme.paper, theme.chip, 0.6)), + ..Spec::default() + }, + ); + let [left, top, right, bottom] = ui.rect(area).unwrap_or_default(); + let width = 380.0_f32.min(right - left); + let open = ui.open_as( + notice(), + Spec { + flags: Flags::FLOAT | Flags::CLICKABLE | Flags::FOCUSABLE, + size: [px(width), children()], + position: [ + ((right - left - width) / 2.0).max(0.0), + ((bottom - top) * 0.2).max(0.0), + ], + gap: 12.0, + role: Some(Role::Button), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(open) { + node.set_label("This section is password protected. Unlock it"); + } + ui.leaf( + "icon", + Spec { + size: [px(20.0), px(theme.font_size * 1.6)], + icon: Some(art::INFO), + ..Spec::default() + }, + ); + ui.open( + "words", + Spec { + axis: Axis::Y, + size: [fill(), children()], + gap: 14.0, + ..Spec::default() + }, + ); + let line = |ui: &mut Ui, part, text, bold| { + ui.leaf( + part, + Spec { + size: [fill(), px(theme.font_size * 1.6)], + text: Some(text), + bold, + font_size: Some(theme.font_size * 1.15), + ..Spec::default() + }, + ); + }; + line(ui, "title", "This section is password protected.", true); + line( + ui, + "how", + "Click here or press ENTER to unlock this section.", + false, + ); + ui.close(); + ui.close(); + ui.close(); + if ui.signal(open).clicked || entered { + self.ask_password(library, path, Dialog::Unlock(Zeroizing::default(), false)); + } + } + + /// The section shown, open or locked, with its notebook. + pub(crate) fn shown_section(&self) -> Option<(Arc, String)> { + match (&self.session, &self.locked) { + (Some(session), _) if session.library.catalog().is_some() => Some(( + Arc::clone(&session.library), + session.tabs[session.tab].path.clone(), + )), + (None, Some(locked)) => Some((Arc::clone(&locked.library), locked.path.clone())), + _ => None, + } + } + + /// Opens Password Protection on the section at `path` of `library`, as its menu's + /// Password Protect This Section… does. + pub(crate) fn password_protection(&mut self, library: Arc, path: String) { + self.ask_password(library, path, Dialog::Protection); + } + + fn ask_password(&mut self, library: Arc, path: String, dialog: Dialog) { + self.password = Some(Asking { + library, + path, + dialog, + }); + self.ui.open_popup(id()); + self.ui.set_focus(None); + } + + /// Locks every protected section unlocked this run, as Lock All and Ctrl+Alt+L do. + pub(crate) fn lock_all(&mut self) -> Result<(), Box> { + let mut locked = Vec::new(); + for library in self.notebooks.clone() { + let paths = library.lock(|_, _| true); + locked.extend(paths.iter().map(|path| library.key(path))); + } + self.sync_index(true, locked); + self.relock() + } + + /// Locks the sections not worked in for as long as Options says, and wakes in time to + /// lock the next. + pub(crate) fn lock_idle(&mut self) -> Result<(), Box> { + let Some(minutes) = self.passwords.lock_after else { + return Ok(()); + }; + let after = Duration::from_secs(u64::from(minutes) * 60); + // Working in the open section keeps it unlocked. + if self.changed + && let Some(session) = &self.session + { + session.library.touch(&session.tabs[session.tab].path); + } + let (mut waiting, mut locked) = (false, Vec::new()); + for library in self.notebooks.clone() { + let paths = library.lock(|_, idle| { + waiting |= idle < after; + idle >= after + }); + locked.extend(paths.iter().map(|path| library.key(path))); + } + if waiting { + self.ui.wake_after(Duration::from_secs(30)); + } + if !locked.is_empty() { + self.sync_index(true, locked); + } + self.relock() + } + + /// Shows the open section locked once its key is gone. + fn relock(&mut self) -> Result<(), Box> { + let Some(session) = &self.session else { + return Ok(()); + }; + let (library, path) = ( + Arc::clone(&session.library), + session.tabs[session.tab].path.clone(), + ); + if !library.locked(&path) { + return Ok(()); + } + self.persist()?; + if let Some(session) = self.session.take() { + session.section.close()?; + } + self.prefetch.forget(&library.key(&path)); + self.password = None; + self.ui.close_popup(id()); + self.show_locked(library, path) + } + + /// The open password dialog; what its OK does. + pub(crate) fn password_dialog(&mut self) -> Result<(), Box> { + let Some(mut asking) = self.password.take() else { + return Ok(()); + }; + if !self.ui.popup_open(id()) { + return Ok(()); + } + let theme = self.ui.theme.clone(); + let row = theme.font_size * 2.0; + let ui = &mut self.ui; + let fields = match &asking.dialog { + Dialog::Unlock(..) | Dialog::Remove(..) => 1, + Dialog::Protection => 0, + Dialog::Set(..) => 2, + Dialog::Change(..) => 3, + }; + let owners: Vec = (0..fields).map(field).collect(); + // A dialog asking for a password has one of its fields focused, the first at first. + if !owners.is_empty() && !ui.focused().is_some_and(|focus| owners.contains(&focus)) { + ui.set_focus(Some(field(0))); + } + let entered = + ui::popup::navigation(ui, &owners, &[NamedKey::Enter]).contains(&NamedKey::Enter); + let protected = asking.library.protected(&asking.path); + let title = match asking.dialog { + Dialog::Unlock(..) => "Protected Section", + Dialog::Protection | Dialog::Set(..) => "Password Protection", + Dialog::Change(..) => "Change Password", + Dialog::Remove(..) => "Remove Password", + }; + ui.open_as( + id(), + Spec { + axis: Axis::Y, + size: [px(WIDTH), children()], + fill: Some(theme.popup), + border: Some(theme.chip), + shadow: Some(theme.shadow), + radius: 8.0, + pad: [16.0, 12.0], + gap: 8.0, + anchor: Some(Anchor::Dialog), + role: Some(Role::Dialog), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(id()) { + node.set_label(title); + } + let text = |ui: &mut Ui, part: &str, text: &str, bold| { + ui.leaf( + part, + Spec { + size: [fill(), px(row)], + text: Some(text), + bold, + ..Spec::default() + }, + ); + }; + text(ui, "title", title, true); + let name = section_name(&asking.path); + let field_spec = Spec { + size: [fill(), px(row)], + fill: Some(theme.base), + border: Some(theme.accent), + radius: 4.0, + pad: [6.0, 0.0], + ..Spec::default() + }; + let password = |ui: &mut Ui, index, label: &str, value: &mut String| { + text(ui, &format!("label {index}"), label, false); + ui::password_field(ui, field(index), value, "", field_spec.clone()); + if let Some(node) = ui.access(field(index)) { + node.set_label(label.trim_end_matches(':')); + } + }; + let problem = |ui: &mut Ui, problem: &str| { + ui.leaf( + "problem", + Spec { + size: [fill(), px(row)], + icon: Some(art::WARNING), + text: Some(problem), + bold: true, + gap: 6.0, + role: Some(Role::Alert), + ..Spec::default() + }, + ); + }; + let mut buttons: &[&str] = &["Cancel", "OK"]; + match &mut asking.dialog { + Dialog::Unlock(value, wrong) => { + text( + ui, + "about", + &format!("Section \u{201c}{name}\u{201d} is password protected."), + false, + ); + if *wrong { + problem(ui, "Password is incorrect."); + } + password(ui, 0, "Enter Password:", value); + } + Dialog::Protection => { + let status = if protected { + format!("Section \u{201c}{name}\u{201d} is password protected.") + } else { + format!("Section \u{201c}{name}\u{201d} is not password protected.") + }; + text(ui, "status", &status, false); + buttons = if protected { + &["Change Password…", "Remove Password…", "Lock All", "Close"] + } else { + &["Set Password…", "Lock All", "Close"] + }; + } + Dialog::Set([value, confirm], refused) => { + if let Some(refused) = refused { + problem(ui, refused); + } + password(ui, 0, "Enter Password:", value); + password(ui, 1, "Confirm Password:", confirm); + text(ui, "caution", "Caution", true); + ui.leaf( + "caution-text", + Spec { + size: [fill(), ui::fit()], + text: Some( + "If you lose or forget the password, Snowbound cannot recover \ + your data. (Remember that passwords are case-sensitive.)", + ), + overflow: ui::Overflow::Wrap, + ..Spec::default() + }, + ); + } + Dialog::Change([old, value, confirm], refused) => { + if let Some(refused) = refused { + problem(ui, refused); + } + password(ui, 0, "Old Password:", old); + password(ui, 1, "Enter New Password:", value); + password(ui, 2, "Confirm Password:", confirm); + } + Dialog::Remove(value, wrong) => { + if *wrong { + problem(ui, "Password is incorrect."); + } + password( + ui, + 0, + "To remove password protection, enter the current password:", + value, + ); + } + } + ui.open( + "buttons", + Spec { + size: [fill(), children()], + gap: 8.0, + ..Spec::default() + }, + ); + ui.leaf( + "space", + Spec { + size: [fill(), px(1.0)], + ..Spec::default() + }, + ); + let pressed = buttons + .iter() + .position(|label| ui::button(ui, *label, label).clicked); + ui.close(); + ui.close(); + let chosen = pressed.map(|at| buttons[at]).or(entered.then_some("OK")); + let Asking { + library, + path, + dialog, + } = asking; + let next = match (chosen, dialog) { + (None, dialog) => { + self.password = Some(Asking { + library, + path, + dialog, + }); + return Ok(()); + } + (Some("Cancel" | "Close"), _) => None, + (Some("Lock All"), _) => { + self.ui.close_popup(id()); + return self.lock_all(); + } + (Some("Set Password…"), _) => Some(Dialog::Set(Default::default(), None)), + (Some("Change Password…"), _) => Some(Dialog::Change(Default::default(), None)), + (Some("Remove Password…"), _) => Some(Dialog::Remove(Zeroizing::default(), false)), + (Some(_), Dialog::Unlock(value, _)) => match library.unlock(&path, &value) { + Ok(()) => { + self.commands + .push(Command::OpenSection(Arc::clone(&library), path.clone())); + None + } + Err(notebook::Error::Protected(_)) => { + Some(Dialog::Unlock(Zeroizing::default(), true)) + } + Err(error) => { + crate::platform::alert("Couldn't unlock the section", &error.to_string()); + None + } + }, + (Some(_), Dialog::Set([value, confirm], _)) => { + if value.is_empty() { + Some(Dialog::Set(Default::default(), Some("Enter a password."))) + } else if *value != *confirm { + Some(Dialog::Set( + Default::default(), + Some("The passwords don\u{2019}t match."), + )) + } else { + self.set_password(library.clone(), path.clone(), None, Some(value)); + None + } + } + (Some(_), Dialog::Change([old, value, confirm], _)) => { + if value.is_empty() { + Some(Dialog::Change( + Default::default(), + Some("Enter a password."), + )) + } else if *value != *confirm { + Some(Dialog::Change( + Default::default(), + Some("The new passwords don\u{2019}t match."), + )) + } else { + match current(&library, &path, &old) { + Some(key) => { + self.set_password( + library.clone(), + path.clone(), + Some(key), + Some(value), + ); + None + } + None => Some(Dialog::Change( + Default::default(), + Some("Password is incorrect."), + )), + } + } + } + (Some(_), Dialog::Remove(value, _)) => match current(&library, &path, &value) { + Some(key) => { + self.set_password(library.clone(), path.clone(), Some(key), None); + None + } + None => Some(Dialog::Remove(Zeroizing::default(), true)), + }, + (Some(_), Dialog::Protection) => None, + }; + match next { + Some(dialog) => self.ask_password(library, path, dialog), + None => self.ui.close_popup(id()), + } + Ok(()) + } + + /// Sets, changes or removes the password of `path` in `library`, closing its section + /// first: the section is written anew, and its replica goes with the old file. + fn set_password( + &mut self, + library: Arc, + path: String, + key: Option, + password: Option>, + ) { + let open = self.session.as_ref().is_some_and(|session| { + Arc::ptr_eq(&session.library, &library) && session.tabs[session.tab].path == path + }); + if open { + let closed = self.persist().and_then(|()| { + if let Some(session) = self.session.take() { + session.section.close()?; + } + Ok(()) + }); + if let Err(error) = closed { + return crate::platform::alert("Couldn't set the password", &error.to_string()); + } + self.prefetch.forget(&library.key(&path)); + } + library.lock(|locked, _| locked == path); + self.restructure( + library, + Structure::Password { + path, + key, + password, + }, + ); + } +} + +/// The key `password` opens the section at `path` with, if it does. +fn current(library: &Library, path: &str, password: &str) -> Option { + library.unlock(path, password).ok()?; + library.unlocked(path) +} diff --git a/crates/snowbound/src/recycle.rs b/crates/snowbound/src/recycle.rs new file mode 100644 index 0000000000000000000000000000000000000000..f1cf7d9dd74bd5c062d4e2cb95df0d1824d3c73b --- /dev/null +++ b/crates/snowbound/src/recycle.rs @@ -0,0 +1,393 @@ +//! OneNote 2010's Notebook Recycle Bin: the notebook's `OneNote_RecycleBin` group shown as a +//! row of its own tabs, Deleted Pages and each deleted section, read-only beneath a bar +//! saying how to restore them. Pages go back to a section and sections to a folder, and Empty +//! Recycle Bin deletes what the bin holds for good. + +use crate::{Command, Library, Loaded, State, filetime, library, menus, notify, read_session}; +use onestore::{ + ExGuid, + op::{Edit, Op, SectionOp}, +}; +use std::{error::Error, sync::Arc}; +use ui::{Axis, Spec, Ui, children, fill, fit}; + +/// The bin's folder, a section group of the notebook's. +pub const BIN: &str = "OneNote_RecycleBin"; + +/// What the bin's commands ask of the section it shows. +pub enum Request { + /// Puts page `space` at the end of the section at catalog `path`, or with `copy` a copy + /// of it, as OneNote's Move or Copy takes a page out of the bin. + Restore { + space: ExGuid, + path: String, + copy: bool, + }, + /// Deletes pages for good. + Purge(Vec), +} + +/// Whether the section or group at catalog `path` lies in its notebook's recycle bin. +pub fn binned(path: &str) -> bool { + library::recycle_bin(&menus::folder(path)) +} + +impl State { + /// Whether the open section is one of the recycle bin's. + pub(crate) fn in_recycle_bin(&self) -> bool { + (self.session.as_ref()).is_some_and(|session| binned(&session.tabs[session.tab].path)) + } + + /// Notebook Recycle Bin: shows `library`'s bin at its first section holding pages, or + /// while it shows, goes back to the notebook. + pub(crate) fn toggle_recycle_bin(&mut self, library: Arc) { + if self.in_recycle_bin() { + if let Some(path) = library.first_section() { + self.commands.push(Command::OpenSection(library, path)); + } + return; + } + let paths: Vec = library.tabs(BIN).into_iter().map(|tab| tab.path).collect(); + let proxy = self.proxy.clone(); + self.load(move || { + for path in paths { + let section = library.open(&path, notify(proxy.clone()))?; + if section.pages()?.is_empty() { + section.close()?; + continue; + } + let (session, page) = read_session(section, library, path, None)?; + return Ok(Loaded::Section(Box::new(session), page)); + } + Err("The Recycle Bin is empty.".into()) + }); + } + + /// Empty Recycle Bin on `library`, once confirmed as OneNote asks. + pub(crate) fn empty_recycle_bin(&mut self, library: Arc) { + if crate::platform::confirm( + "Are you sure you want to empty the Recycle Bin for this notebook?", + "Its pages and sections are deleted for good.", + "Cancel", + "Empty Recycle Bin", + ) { + let change = crate::manage::Structure::EmptyRecycleBin; + self.commands.push(Command::Structure(library, change)); + } + } + + /// Does `request` to the bin's open section on a thread of its own, then shows the page + /// after the ones gone, or the notebook once the section holds none. + pub(crate) fn recycle(&mut self, request: Request) -> Result<(), Box> { + let gone = match &request { + Request::Restore { copy: true, .. } => Vec::new(), + Request::Restore { space, .. } => vec![*space], + Request::Purge(spaces) => spaces.clone(), + }; + if matches!(request, Request::Purge(_)) + && !crate::platform::confirm( + "Are you sure you want to delete this page for good?", + "It can't be restored.", + "Cancel", + "Delete", + ) + { + return Ok(()); + } + let session = self.session.as_ref().ok_or("No section is open")?; + let replica = Arc::clone(session.section.replica()); + let library = Arc::clone(&session.library); + let shown = session.space; + let at = (session.pages.iter()).position(|(space, ..)| gone.contains(space)); + let kept = |space: &ExGuid| !gone.contains(space); + let after = at.and_then(|at| { + let spaces = session.pages.iter().map(|(space, ..)| *space); + (spaces.clone().skip(at).find(kept)).or_else(|| spaces.take(at).rev().find(kept)) + }); + let (author, proxy) = (self.author.clone(), self.proxy.clone()); + self.load(move || { + carry_out(&library, &replica, request, &author)?; + if let Some(show) = if gone.contains(&shown) { + after + } else { + Some(shown) + } { + return Ok(Loaded::Page(show, replica.page(show)?)); + } + // A section without pages shows no tab: the notebook shows instead. + let path = library + .first_section() + .ok_or("The notebook has no sections")?; + let section = library.open(&path, notify(proxy))?; + let (session, page) = read_session(section, library, path, None)?; + Ok(Loaded::Section(Box::new(session), page)) + }); + Ok(()) + } + + /// The bin's tab row leads with a way back to the notebook and where it is, as + /// OneNote's "Recycle Bin for" does. + pub(crate) fn recycle_heading(&mut self, theme: &ui::Theme) { + let Some(session) = self.session.as_ref().filter(|_| self.in_recycle_bin()) else { + return; + }; + let library = Arc::clone(&session.library); + let heading = format!("Recycle Bin for \u{201c}{}\u{201d}:", library.name); + let back = ui::shell::tool_button( + &mut self.ui, + "recycle back", + crate::art::BACK, + theme.text, + None, + ); + if let Some(node) = self.ui.access(self.ui.id("recycle back")) { + node.set_label("Back to the Notebook"); + } + self.ui.leaf( + "recycle heading", + Spec { + size: [fit(), fill()], + text: Some(&heading), + color: Some(theme.text), + pad: [6.0, 0.0], + ..Spec::default() + }, + ); + if back.clicked { + self.toggle_recycle_bin(library); + } + } +} + +/// Does `request` to the bin's section `replica` holds, in `library`, as `author`: a page +/// restored goes to its section as one op, keeping its identity, a copy under a new one, and +/// what leaves the bin goes from it as another. +fn carry_out( + library: &Library, + replica: ¬ebook::Replica, + request: Request, + author: &str, +) -> Result<(), Box> { + let gone = match request { + Request::Restore { space, path, copy } => { + let page = replica.page(space)?; + let section = library.open(&path, || {})?; + if copy { + section.import_page(&page, author)?; + } else { + let ops = vec![notebook::session::moved(&page, author)?]; + section.replica().apply( + author, + Edit { + at: filetime(), + ops, + }, + )?; + } + section.close()?; + (!copy).then_some(vec![space]).unwrap_or_default() + } + Request::Purge(spaces) => spaces, + }; + if !gone.is_empty() { + let ops = vec![Op::Section(SectionOp::Delete(gone))]; + replica.apply( + author, + Edit { + at: filetime(), + ops, + }, + )?; + } + Ok(()) +} + +/// The bar above a page of the recycle bin, in OneNote 2010's words but for the menu item +/// that restores. +pub fn bar(ui: &mut Ui) { + ui.open( + "recycle bar", + Spec { + axis: Axis::Y, + size: [fill(), children()], + fill: Some(draw::srgb(0xff, 0xee, 0xc2)), + pad: [12.0, 6.0], + role: Some(accesskit::Role::Banner), + ..Spec::default() + }, + ); + for (part, text) in [ + ( + "restore", + "To restore a page or section, right-click it and choose Restore To.", + ), + ("purge", "Content here is deleted after 60 days."), + ] { + ui.leaf( + part, + Spec { + size: [fill(), fit()], + text: Some(text), + overflow: ui::Overflow::Wrap, + color: Some(draw::srgb(0x20, 0x20, 0x20)), + ..Spec::default() + }, + ); + } + ui.close(); +} + +#[cfg(test)] +mod tests { + use super::*; + use notebook::session::{Notebook, stored_pages}; + use onestore::PageCreation; + + const AUTHOR: &str = "Author"; + const FIRST: &str = "New Section 1.one"; + + /// Waits until a section's edits are in its file. + fn published(library: &Library, path: &str) { + let section = library.open(path, || {}).unwrap(); + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); + while section.sync_status().unwrap().queued > 0 { + assert!( + std::time::Instant::now() < deadline, + "{path} never published" + ); + std::thread::sleep(std::time::Duration::from_millis(20)); + } + section.close().unwrap(); + } + + fn titles(root: &std::path::Path, path: &str) -> Vec<(String, Option<[u8; 16]>)> { + let pages = stored_pages(&std::fs::read(root.join(path)).unwrap()).unwrap(); + (pages.into_iter()) + .map(|page| (page.page.title, page.page.identity)) + .collect() + } + + /// Pages leave the recycle bin for a section, keeping their identity, or as copies under + /// new ones, and deleted for good, each as an op; a section leaves for the notebook's + /// folder, and Empty Recycle Bin takes the rest. `SNOWBOUND_RECYCLE_EXPORT` names a new + /// directory receiving the notebook `before` and `after`, for cold reopens in OneNote 2010 + /// (`corpus/recycle-bin-view`). + #[test] + fn pages_and_sections_leave_the_recycle_bin_as_onenote_restores_them() { + let folder = std::env::temp_dir().join(format!("snowbound-recycle-{}", std::process::id())); + let _ = std::fs::remove_dir_all(&folder); + std::fs::create_dir_all(&folder).unwrap(); + let (root, cache) = (folder.join("Recycled"), folder.join("cache")); + let page = |title: &str| PageCreation::new(None, Some(title), AUTHOR).unwrap(); + let mut notebook = + Notebook::create(&root, &cache, Notebook::NEW_COLOR, &page("Kept")).unwrap(); + for (name, title) in [ + ("Back", "Restored page"), + ("Copied", "Copied page"), + ("Purged", "Purged page"), + ] { + notebook.create_section("", name, &page(title)).unwrap(); + } + notebook + .create_section("", "Restored", &page("In a restored section")) + .unwrap(); + notebook + .create_section("", "Emptied", &page("In an emptied section")) + .unwrap(); + for name in ["Back", "Copied", "Purged"] { + let image = notebook.read_section(&format!("{name}.one")).unwrap(); + let pages = stored_pages(&image).unwrap(); + notebook + .recycle_pages(&[pages[0].page.clone()], AUTHOR) + .unwrap(); + } + for name in ["Back", "Copied", "Purged", "Restored", "Emptied"] { + notebook.delete(&format!("{name}.one")).unwrap(); + } + let export = std::env::var_os("SNOWBOUND_RECYCLE_EXPORT").map(std::path::PathBuf::from); + if let Some(directory) = &export { + copy(&root, &directory.join("before")); + } + let library = Library::created(root.to_str().unwrap(), notebook, &cache); + let deleted = format!("{BIN}/OneNote_DeletedPages.one"); + let binned = titles(&root, &deleted); + let bin = library.open(&deleted, || {}).unwrap(); + let space = |title: &str| { + let pages = bin.replica().pages().unwrap(); + pages + .into_iter() + .find(|(_, listed, _)| listed == title) + .unwrap() + .0 + }; + let (back, copied, purged) = ( + space("Restored page"), + space("Copied page"), + space("Purged page"), + ); + let restore = |space, copy| Request::Restore { + space, + path: FIRST.into(), + copy, + }; + carry_out(&library, bin.replica(), restore(back, false), AUTHOR).unwrap(); + carry_out(&library, bin.replica(), restore(copied, true), AUTHOR).unwrap(); + carry_out( + &library, + bin.replica(), + Request::Purge(vec![purged]), + AUTHOR, + ) + .unwrap(); + bin.close().unwrap(); + published(&library, FIRST); + published(&library, &deleted); + let identity = |title: &str| binned.iter().find(|(listed, _)| listed == title).unwrap().1; + let first = titles(&root, FIRST); + let listed: Vec<&str> = first.iter().map(|(title, _)| title.as_str()).collect(); + assert_eq!(listed, ["Kept", "Restored page", "Copied page"]); + assert_eq!( + first[1].1, + identity("Restored page"), + "a restored page keeps its identity" + ); + assert_ne!( + first[2].1, + identity("Copied page"), + "a copy takes a new one" + ); + let left: Vec = titles(&root, &deleted) + .into_iter() + .map(|(title, _)| title) + .collect(); + assert_eq!(left, ["Copied page"]); + + let mut notebook = library.reopen().unwrap(); + notebook + .move_entry(&format!("{BIN}/Restored.one"), "") + .unwrap(); + notebook.empty_recycle_bin().unwrap(); + let sections: Vec<&str> = (notebook.catalog().sections.iter()) + .map(|section| section.path.as_str()) + .collect(); + assert_eq!(sections, [FIRST, "Restored.one"]); + assert!(titles(&root, &deleted).is_empty()); + assert!(!root.join(BIN).join("Emptied.one").exists()); + if let Some(directory) = &export { + copy(&root, &directory.join("after")); + } + std::fs::remove_dir_all(&folder).unwrap(); + } + + fn copy(from: &std::path::Path, to: &std::path::Path) { + std::fs::create_dir_all(to).unwrap(); + for entry in std::fs::read_dir(from).unwrap().flatten() { + let target = to.join(entry.file_name()); + if entry.file_type().unwrap().is_dir() { + copy(&entry.path(), &target); + } else { + std::fs::copy(entry.path(), target).unwrap(); + } + } + } +} diff --git a/crates/snowbound/src/rename.rs b/crates/snowbound/src/rename.rs index 075a271bdaa9d9c97d21215916148a0d991f8783..7779c3fbbc2dffddcde22e876f5b3307cb8153b4 100644 --- a/crates/snowbound/src/rename.rs +++ b/crates/snowbound/src/rename.rs @@ -81,8 +81,7 @@ impl State { let name = match &target { Target::Entry { path, in_tab, .. } => { self.sidebar |= !in_tab; - let name = path.rsplit('/').next().unwrap_or_default(); - name.strip_suffix(".one").unwrap_or(name).to_owned() + crate::library::entry_name(path).to_owned() } Target::Page(space) => self .session @@ -107,8 +106,7 @@ impl State { } match target { Target::Entry { library, path, .. } => { - let old = path.rsplit('/').next().unwrap_or_default(); - if name != old.strip_suffix(".one").unwrap_or(old) { + if name != crate::library::entry_name(&path) { self.commands.push(Command::Structure( library, Structure::Rename { path, name }, diff --git a/crates/snowbound/src/save_as.rs b/crates/snowbound/src/save_as.rs new file mode 100644 index 0000000000000000000000000000000000000000..e72867bfc7f68fc050757221c42df5ff8acaaadc --- /dev/null +++ b/crates/snowbound/src/save_as.rs @@ -0,0 +1,271 @@ +//! File, Save As, as OneNote 2010's: the page, its section or its notebook, as a OneNote +//! section (`.one`), a package (`.onepkg`) or a PDF. A page or section saved as a section is +//! a copy outside any notebook; a notebook's package holds its sections as they stand here, +//! the open one's queued edits included (`notebook::package`). + +use crate::{Library, State, UserEvent, platform, print}; +use accesskit::Role; +use notebook::package; +use std::{error::Error, sync::Arc}; +use ui::{Anchor, Axis, Id, Spec, children, fill, popup::Item, px}; +use winit::keyboard::NamedKey; + +/// What Save As saves. +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Scope { + Page, + Section, + Notebook, +} + +const SCOPES: [(Scope, &str); 3] = [ + (Scope::Page, "Page"), + (Scope::Section, "Section"), + (Scope::Notebook, "Notebook"), +]; + +/// OneNote 2010's formats for each scope, as Save As lists them. +fn formats(scope: Scope) -> [(&'static str, &'static str); 2] { + match scope { + Scope::Notebook => [ + ("OneNote Package (*.onepkg)", "onepkg"), + ("PDF (*.pdf)", "pdf"), + ], + _ => [ + ("OneNote 2010 Section (*.one)", "one"), + ("PDF (*.pdf)", "pdf"), + ], + } +} + +/// The dialog's choices while it is open: the section a scope of Section saves, by catalog +/// path, and the place in `formats` chosen. +pub struct Dialog { + library: Arc, + section: Option, + scope: Scope, + format: usize, +} + +fn id() -> Id { + Id::ROOT.child("save-as") +} + +impl State { + /// Opens Save As on `scope`: the open page or section, or `section` of `library` when + /// given, or the notebook. + pub(crate) fn open_save_as( + &mut self, + library: Arc, + section: Option, + scope: Scope, + ) { + let section = section.or_else(|| { + let session = self.session.as_ref()?; + Some(session.tabs[session.tab].path.clone()) + }); + self.save_as = Some(Dialog { + library, + section, + scope, + format: 0, + }); + self.ui.open_popup(id()); + } + + /// Builds Save As while it is open; Save As… asks where, then writes on a thread. + pub(crate) fn save_as_dialog(&mut self) { + let Some(dialog) = &mut self.save_as else { + return; + }; + let ui = &mut self.ui; + if !ui.popup_open(id()) { + self.save_as = None; + return; + } + let theme = ui.theme.clone(); + let row = theme.font_size * 2.0; + let entered = ui::popup::navigation(ui, &[], &[NamedKey::Enter]).contains(&NamedKey::Enter); + ui.open_as( + id(), + Spec { + axis: Axis::Y, + size: [px(360.0), children()], + fill: Some(theme.popup), + border: Some(theme.chip), + shadow: Some(theme.shadow), + radius: 8.0, + pad: [16.0, 12.0], + gap: 6.0, + anchor: Some(Anchor::Dialog), + role: Some(Role::Dialog), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(id()) { + node.set_label("Save As"); + } + ui.leaf( + "title", + Spec { + size: [fill(), px(row)], + text: Some("Save As"), + bold: true, + role: Some(Role::Heading), + ..Spec::default() + }, + ); + // A page or section is only there to save with one open, or picked. + let offered: Vec<(Scope, &str)> = (SCOPES.iter().copied()) + .filter(|(scope, _)| match scope { + Scope::Page => self.session.is_some(), + Scope::Section => dialog.section.is_some(), + Scope::Notebook => dialog.library.catalog().is_some(), + }) + .collect(); + let current = offered.iter().position(|(scope, _)| *scope == dialog.scope); + let names: Vec<&str> = offered.iter().map(|(_, name)| *name).collect(); + if let Some(at) = choose(ui, "Save current", &names, current.unwrap_or(0)) { + dialog.scope = offered[at].0; + dialog.format = 0; + } + let names = formats(dialog.scope).map(|(name, _)| name); + if let Some(at) = choose(ui, "Format", &names, dialog.format) { + dialog.format = at; + } + crate::buttons(ui); + let cancel = ui::button(ui, "cancel", "Cancel").clicked; + let go = ui::button(ui, "go", "Save As…").clicked || entered; + ui.close(); + ui.close(); + if !go && !cancel { + return; + } + let dialog = self.save_as.take().expect("The dialog is open"); + self.ui.close_popup(id()); + if go && let Err(error) = self.save(dialog) { + platform::alert("Couldn't save", &error.to_string()); + } + } + + /// Asks where to save what `dialog` chose, then writes it on a thread of its own; a PDF + /// goes through Export as PDF's settings. + fn save(&mut self, dialog: Dialog) -> Result<(), Box> { + let (_, extension) = formats(dialog.scope)[dialog.format]; + if extension == "pdf" { + self.export_pdf(match dialog.scope { + Scope::Page => print::Scope::Page, + Scope::Section => print::Scope::Section, + Scope::Notebook => print::Scope::Notebook, + }); + return Ok(()); + } + self.persist()?; + let library = dialog.library; + let open = (self.session.as_ref()) + .filter(|session| Arc::ptr_eq(&session.library, &library)) + .map(|session| { + let path = session.tabs[session.tab].path.clone(); + (path, Arc::clone(session.section.replica()), session.space) + }); + let section = dialog.section.unwrap_or_default(); + let title = match dialog.scope { + Scope::Page => self.view.editor.page()?.title, + Scope::Section => crate::library::section_name(§ion, &None), + Scope::Notebook => library.name.clone(), + }; + let name = format!("{}.{extension}", print::file_name(&title)); + let Some(mut path) = platform::pick_new("Save As", &name, "Save", None) else { + return Ok(()); + }; + if path.extension().is_none() { + path.set_extension(extension); + } + let (scope, author, proxy) = (dialog.scope, self.author.clone(), self.proxy.clone()); + let color = (library + .tabs(crate::menus::folder(§ion).as_str()) + .into_iter()) + .find(|tab| tab.path == section) + .and_then(|tab| tab.color); + std::thread::spawn(move || { + let written = (|| -> Result<(), Box> { + let image = |path: &str| { + let (_, replica, _) = open.as_ref().filter(|(open, ..)| open == path)?; + replica.snapshot().ok() + }; + let bytes = match scope { + Scope::Page => { + let (_, replica, space) = open.as_ref().ok_or("No page is open")?; + let page = replica.page(*space)?; + let file = file_name(&path); + package::page_section(&page, &file, color, &author)? + } + Scope::Section => { + let stored = match image(§ion) { + Some(image) => image, + None => library.reopen()?.read_section(§ion)?, + }; + package::section_copy(stored)? + } + Scope::Notebook => { + let notebook = library.reopen()?; + package::pack(package::notebook_files(¬ebook, image)?)? + } + }; + std::fs::write(&path, bytes)?; + Ok(()) + })(); + let written = written.map_err(|error| error.to_string()); + let _ = proxy.send_event(UserEvent::Then(Box::new(move |_| { + written.map_err(|error| { + platform::alert("Couldn't save", &error); + error.into() + }) + }))); + }); + Ok(()) + } +} + +fn file_name(path: &std::path::Path) -> String { + path.file_name() + .map(|name| name.to_string_lossy().into_owned()) + .unwrap_or_default() +} + +/// A labelled combo listing `names`, choosing among them. +fn choose(ui: &mut ui::Ui, label: &str, names: &[&str], current: usize) -> Option { + let row = ui.theme.font_size * 2.0; + ui.open( + label, + Spec { + size: [fill(), px(row)], + gap: 8.0, + ..Spec::default() + }, + ); + ui.leaf( + "label", + Spec { + size: [px(110.0), px(row)], + text: Some(label), + ..Spec::default() + }, + ); + let menu = id().child(label); + let combo = ui.id(label); + let shown = names.get(current).copied().unwrap_or_default(); + ui::shell::combo(ui, label, label, shown, 210.0, menu, true); + let items: Vec = (names.iter().enumerate()) + .map(|(at, text)| Item { + text, + checked: Some(at == current), + current: at == current, + ..Item::default() + }) + .collect(); + let anchor = Anchor::Below(ui.rect(combo).unwrap_or_default()); + let chosen = ui::popup::menu(ui, menu, anchor, &items, None); + ui.close(); + chosen +} diff --git a/crates/snowbound/src/search.rs b/crates/snowbound/src/search.rs index 2609b5e4489510f4b601e75a89f40ae020e619f8..7c35021267de88f920737a5dec07179b7898123c 100644 --- a/crates/snowbound/src/search.rs +++ b/crates/snowbound/src/search.rs @@ -272,29 +272,21 @@ fn run( fn sections(library: &Library) -> Vec { match &library.notebook { Ok(Some(notebook)) => { - let mut paths = Vec::new(); - let mut folders = vec![notebook.catalog()]; - while let Some(folder) = folders.pop() { - paths.extend( - folder - .sections - .iter() - .filter(|section| { - matches!( - section.state, - notebook::discover::SectionState::Readable { .. } - ) - }) - .map(|section| section.path.clone()), - ); - folders.extend( - folder - .groups - .iter() - .filter(|group| !crate::library::recycle_bin(&group.path)), - ); - } - paths + let enter = + |group: ¬ebook::discover::Folder| !crate::library::recycle_bin(&group.path); + crate::library::folders(notebook.catalog(), enter) + .into_iter() + .flat_map(|folder| &folder.sections) + .filter(|section| match section.state { + notebook::discover::SectionState::Readable { .. } => true, + // OneNote searches a protected section only while it is unlocked. + notebook::discover::SectionState::Locked => { + library.unlocked(§ion.path).is_some() + } + _ => false, + }) + .map(|section| section.path.clone()) + .collect() } Ok(None) => vec![library.location.clone()], Err(_) => Vec::new(), @@ -339,7 +331,10 @@ fn sync( Some(notebook) => notebook.read_section(&path)?, None => onestore::read_file(&file)?, }; - let stored = notebook::session::stored_pages(&bytes)?; + let stored = match library.unlocked(&path) { + Some(key) => notebook::session::stored_pages_unlocked(&bytes, &key)?, + None => notebook::session::stored_pages(&bytes)?, + }; let modified = |space: ExGuid| { stored .iter() @@ -485,12 +480,10 @@ impl State { /// Brings the index to the open notebooks and section when they changed, and when /// `always` or sections `changed` names, by key, to the section files changed since. pub(crate) fn sync_index(&mut self, always: bool, changed: Vec) { - let open = self.session.as_ref().map(|session| { - ( - session.library.key(&session.tabs[session.tab].path), - Arc::downgrade(session.section.replica()), - ) - }); + let open = self + .session + .as_ref() + .map(|session| (session.key(), Arc::downgrade(session.section.replica()))); let identity: Vec = self .notebooks .iter() @@ -511,11 +504,8 @@ impl State { /// Tells the index an edit changed page `space` of the open section. pub(crate) fn edited(&self, spaces: Vec) { if let Some(session) = &self.session { - self.search.changed( - session.library.key(&session.tabs[session.tab].path), - session.section.replica(), - spaces, - ); + self.search + .changed(session.key(), session.section.replica(), spaces); } } @@ -544,7 +534,7 @@ impl State { let open = self .session .as_ref() - .map(|session| session.library.key(&session.tabs[session.tab].path)) + .map(crate::Session::key) .unwrap_or_default(); let wanted = (query.clone(), self.search.scope, version, open); if self.search.found_for.as_ref() == Some(&wanted) { @@ -673,12 +663,10 @@ impl State { ) -> Result<(), Box> { let (location, path) = section.split_once('\n').unwrap_or_default(); self.search.reveal = Some((space, paragraph)); - let open = self.session.as_ref().map(|session| { - ( - session.library.key(&session.tabs[session.tab].path), - session.space, - ) - }); + let open = self + .session + .as_ref() + .map(|session| (session.key(), session.space)); match open { Some((key, shown)) if key == section && shown == space => self.refind(true)?, Some((key, _)) if key == section => self.commands.push(Command::OpenPage(space)), diff --git a/crates/snowbound/src/settings.rs b/crates/snowbound/src/settings.rs index 55853a3756e5bbbd33da6c071458b26ae9172ec8..91a50af7c09eab1e9d82ccfc5659cb7fbb64ea1c 100644 --- a/crates/snowbound/src/settings.rs +++ b/crates/snowbound/src/settings.rs @@ -48,6 +48,27 @@ pub struct Settings { pub keys: std::collections::BTreeMap>, /// Pages shown lately, latest first, which the palette lists first. pub recent: Vec, + pub passwords: Passwords, +} + +/// Options' Passwords, as OneNote 2010's Advanced page keeps them. +#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct Passwords { + /// Minutes a protected section stays unlocked without being worked in; none keeps it. + pub lock_after: Option, + /// Locks a protected section as soon as another is shown. + pub lock_on_leave: bool, +} + +impl Default for Passwords { + /// OneNote 2010's: locked after 10 minutes. + fn default() -> Self { + Self { + lock_after: Some(10), + lock_on_leave: false, + } + } } /// What the toolbar's buttons apply from their menus' last picks. @@ -166,6 +187,7 @@ impl crate::State { servers: self.servers.clone(), keys: crate::commands::Keymap::current().saved(), recent: self.trail.recent.clone(), + passwords: self.passwords, }; if let Err(error) = settings.save(path) { eprintln!("Cannot save the settings in {}: {error}", path.display()); @@ -244,6 +266,10 @@ mod tests { n: 1, }, }], + passwords: Passwords { + lock_after: None, + lock_on_leave: true, + }, }; settings.save(&path).unwrap(); assert_eq!(Settings::load(&path), settings); diff --git a/crates/snowbound/src/sidebar.rs b/crates/snowbound/src/sidebar.rs index 9cbd5f171296411d66da5c138392168608e8b396..075a04ec9015a144aa3c947ed55bbce8d0f3058b 100644 --- a/crates/snowbound/src/sidebar.rs +++ b/crates/snowbound/src/sidebar.rs @@ -28,7 +28,7 @@ pub enum Action { notebook: usize, path: String, }, - /// Folds or unfolds a notebook's or section group's rows, by `fold_key`. + /// Folds or unfolds a notebook's or section group's rows, by `Library::key`. Fold(String), NewNotebook, NewICloudNotebook, @@ -45,11 +45,6 @@ pub enum Action { Unavailable(String, String), } -/// Names a notebook's or group's rows for folding them. -pub fn fold_key(library: &Library, path: &str) -> String { - format!("{}\n{path}", library.location) -} - /// What the tree's rows read and what they were asked. pub struct Tree<'a> { theme: &'a Theme, @@ -68,6 +63,8 @@ pub struct Tree<'a> { ghost: Option, /// Where the gap the dragged row would land in stands. gap: Option<[f32; 4]>, + /// The notebooks, groups and sections holding unread pages, by `Library::key`. + unread: HashSet, } /// Where a dragged row would land: before a row of a folder or at its end, or into a group. @@ -85,6 +82,7 @@ struct Ghost { depth: u32, dim: bool, selected: Option<[f32; 4]>, + bold: bool, } impl<'a> Tree<'a> { @@ -105,6 +103,7 @@ impl<'a> Tree<'a> { lifted: None, ghost: None, gap: None, + unread: HashSet::new(), } } } @@ -137,14 +136,13 @@ pub fn header() -> Id { Id::ROOT.child("sidebar header") } -/// The sidebar's header row, `header` tall and dragging the window when `drags`, then +/// The sidebar's header row, as tall as the tab row and dragging the window when `drags`, then /// with `rows` the tree of `notebooks` with the open section marked. The notebook button /// floats over the header's end at the window's edge, the `right` one or the left. fn sidebar( ui: &mut Ui, tree: &mut Tree, notebooks: &[Arc], - header: f32, drags: bool, rows: bool, right: bool, @@ -158,8 +156,8 @@ fn sidebar( } else { Flags::default() }, - size: [fill(), px(header)], - pad: [crate::FRAME, (header - ui::shell::TOOL) / 2.0 + DROP], + size: [fill(), px(RAIL)], + pad: [crate::FRAME, (RAIL - ui::shell::TOOL) / 2.0 + DROP], gap: 6.0, ..Spec::default() }, @@ -204,7 +202,7 @@ fn sidebar( }, ); for (index, library) in notebooks.iter().enumerate() { - let key = fold_key(library, ""); + let key = library.key(""); let unfolded = !folded.contains(&key); let (row, fold) = tree_row( ui, @@ -222,6 +220,7 @@ fn sidebar( fold: Some(unfolded), selected: None, renamed: false, + bold: tree.unread.contains(&key), }, ); let unsigned = library.notebook.is_err() @@ -281,6 +280,7 @@ fn sidebar( fold: None, selected: None, renamed: false, + bold: false, }, ); if row.clicked { @@ -315,6 +315,12 @@ fn folder( *color, true, ), + // Opens on its locked page, which unlocks it. + SectionState::Locked => ( + crate::library::section_name(§ion.path, &None), + None, + true, + ), _ => ( crate::library::section_name(§ion.path, &None), None, @@ -332,6 +338,7 @@ fn folder( fold: None, selected: (open == Some(section.path.as_str())).then_some(section_color(color)), renamed: renaming, + bold: tree.unread.contains(&library.key(§ion.path)), }; if lifts(tree, notebook, §ion.path, &row) { continue; @@ -357,7 +364,7 @@ fn folder( if crate::library::recycle_bin(&group.path) { continue; } - let key = fold_key(library, &group.path); + let key = library.key(&group.path); let unfolded = !tree.folded.contains(&key); let name = group.path.rsplit('/').next().unwrap_or_default(); gap(ui, tree, &folder.path, Some(&group.path)); @@ -371,6 +378,7 @@ fn folder( fold: Some(unfolded), selected: None, renamed: renaming, + bold: tree.unread.contains(&key), }; // A dragged group's rows fold away beneath it. let lifted = lifts(tree, notebook, &group.path, &row); @@ -425,6 +433,7 @@ fn folder( fold: None, selected: None, renamed: false, + bold: false, }, ); if row.clicked { @@ -499,6 +508,7 @@ fn lifts(tree: &mut Tree, notebook: usize, path: &str, row: &Row) -> bool { depth: row.depth, dim: row.dim, selected: row.selected, + bold: row.bold, }); } lifted @@ -594,6 +604,8 @@ struct Row<'a> { selected: Option<[f32; 4]>, /// The row is being renamed: its label is the tree's rename field. renamed: bool, + /// It holds unread pages, which OneNote sets bold. + bold: bool, } /// One row of the tree: its signal, and whether its fold arrow was clicked. @@ -653,6 +665,7 @@ fn tree_row(ui: &mut Ui, tree: &mut Tree, id: Id, row: Row) -> (Signal, bool) { Spec { size: [fill(), px(ROW)], text: Some(row.label), + bold: row.bold, color: Some(color), ..Spec::default() }, @@ -729,15 +742,22 @@ impl crate::State { }, ); crate::name(&mut self.ui, rows_id, "Notebooks"); - let open = self.session.as_ref().and_then(|session| { + let shown = match (&self.session, &self.locked) { + (Some(session), _) => Some((&session.library, session.tabs[session.tab].path.as_str())), + (None, Some(locked)) => Some((&locked.library, locked.path.as_str())), + (None, None) => None, + }; + let open = shown.and_then(|(shown, path)| { let index = self .notebooks .iter() - .position(|library| Arc::ptr_eq(library, &session.library))?; - Some((index, session.tabs[session.tab].path.as_str())) + .position(|library| Arc::ptr_eq(library, shown))?; + Some((index, path)) }); let drags = self.chrome_drags(); + let unread = self.unread_keys(); let mut tree = Tree::new(theme, open, &self.folded, self.renaming.as_mut()); + tree.unread = unread; tree.lifted = self .drag .as_ref() @@ -750,7 +770,6 @@ impl crate::State { &mut self.ui, &mut tree, &self.notebooks, - crate::TAB_ROW, drags, width > 0.5, self.navigation_bar_right, @@ -800,9 +819,6 @@ impl crate::State { } } - /// The sidebar's button in its square at the window's edge, and the room the section - /// tabs, standing `width` from that edge, leave it; the button stays put as the sidebar - /// eases open and shut. /// The notebook button, floating at the body's corner over the section tabs' row, `height` /// tall as it eases, or over the sidebar's header while that is open. pub(crate) fn sidebar_button(&mut self, theme: &Theme, height: f32) { @@ -903,6 +919,7 @@ impl crate::State { fold: None, selected: ghost.selected, renamed: false, + bold: ghost.bold, }, ); self.ui.close(); @@ -1049,9 +1066,10 @@ impl crate::State { self.commands .push(crate::Command::OpenSection(library, path)); } + crate::library::Located::Package(package) => self.open_unpack(&package), crate::library::Located::Nothing => crate::platform::alert( "Couldn't open", - "Choose a notebook folder, its Open Notebook file, or a section file.", + "Choose a notebook folder, its Open Notebook file, a section file or a package.", ), } } diff --git a/crates/snowbound/src/spell_linux.rs b/crates/snowbound/src/spell_linux.rs index 5fc3258b0760952b44b28efdf7838f879b476619..39caba7a0db709c19913d570d5094ea53784ff33 100644 --- a/crates/snowbound/src/spell_linux.rs +++ b/crates/snowbound/src/spell_linux.rs @@ -1,6 +1,7 @@ //! Spelling through Enchant, loaded at run time with whichever dictionaries its providers //! (Hunspell, Nuspell, Aspell) have. Without Enchant, words go unmarked. +use crate::platform::symbol; use canvas::spelling::{Dictionary, pick}; use std::collections::HashMap; use std::ffi::{CStr, CString, c_char, c_int, c_void}; @@ -98,12 +99,6 @@ impl Dictionary for Checker { } } -/// The function `name` in `library`, of C signature `F`. -unsafe fn symbol(library: *mut c_void, name: &CStr) -> Option { - let symbol = unsafe { libc::dlsym(library, name.as_ptr()) }; - (!symbol.is_null()).then(|| unsafe { std::mem::transmute_copy::<*mut c_void, F>(&symbol) }) -} - unsafe extern "C" fn describe( tag: *const c_char, _: *const c_char, diff --git a/crates/snowbound/src/surface_gl.rs b/crates/snowbound/src/surface_gl.rs index ef60f62dbcb27a4548003990a8ddeb6465706a04..f1a2e0105ef1a10290ca04606cb4fa45df1adc39 100644 --- a/crates/snowbound/src/surface_gl.rs +++ b/crates/snowbound/src/surface_gl.rs @@ -92,36 +92,36 @@ impl Surface { } /// The window's next frame, or none to skip this one. - pub fn frame(&mut self, _: &Renderer) -> Result, Box> { + pub fn frame(&mut self, renderer: &Renderer) -> Result, Box> { if self.size.contains(&0) { return Ok(None); } let target = match self.target.take() { Some(target) if target.size() == self.size => target, - _ => Target::new(self.size)?, + _ => renderer.target(self.size)?, }; Ok(Some(Frame { target })) } pub fn present(&mut self, renderer: &Renderer, frame: Frame) { - if self.translucent { - renderer.present_translucent(&frame.target); - } else { - frame.target.present(); - } + renderer.present(&frame.target, self.translucent); let _: () = unsafe { msg_send![&self.context, flushBuffer] }; self.target = Some(frame.target); } /// A target the size of the window's frames that `read` reads back. - pub fn offscreen(&self, _: &Renderer) -> Result> { + pub fn offscreen(&self, renderer: &Renderer) -> Result> { Ok(Frame { - target: Target::new(self.size)?, + target: renderer.target(self.size)?, }) } /// The offscreen target's sRGB RGBA rows, top first. - pub fn read(&self, _: &Renderer, offscreen: Offscreen) -> Result, Box> { - Ok(offscreen.target.read_pixels()) + pub fn read( + &self, + renderer: &Renderer, + offscreen: Offscreen, + ) -> Result, Box> { + Ok(renderer.read_pixels(&offscreen.target)?) } } diff --git a/crates/snowbound/src/surface_windows.rs b/crates/snowbound/src/surface_windows.rs index 9a5633e59ab095921a4b1ba3c1115b4b6a1b9fee..5bd9c2e615ee42a438aad0dae4e436e90946dfe8 100644 --- a/crates/snowbound/src/surface_windows.rs +++ b/crates/snowbound/src/surface_windows.rs @@ -1,11 +1,13 @@ -//! Frames reach the window through Direct3D 12 where Windows has it (10 and 11), and -//! otherwise, as on Windows 7, through OpenGL 2.1 on a WGL context: frames draw into an sRGB -//! target, copied to the window's back buffer and swapped. +//! Frames reach the window through Direct3D 12 where Windows has it (10 and 11), otherwise +//! through Direct3D 11, as on Windows 7, and failing both through OpenGL 2.1 on a WGL +//! context. The last two draw into an sRGB target, copied to the window's back buffer. +//! `SNOWBOUND_RENDERER` set to `d3d11` or `gl` picks one of those, and to anything else +//! insists on Direct3D 12. #[path = "surface.rs"] mod webgpu; -use draw::{GlTarget, Renderer, Target}; +use draw::{Renderer, Target}; use std::{error::Error, sync::Arc}; use windows_sys::Win32::{ Foundation::HWND, @@ -27,13 +29,14 @@ pub struct Surface { enum Backend { Wgpu(Box), - Gl { - /// The window's device context, which the context draws to. - device: HDC, + /// Direct3D 11 or OpenGL, which present the renderer's own targets. + Native { + /// For OpenGL, the window's device context, which the context draws to. + opengl: Option, /// Frames leave the desktop's glass showing through their transparent pixels. translucent: bool, /// The frame target, kept between frames. - target: Option, + target: Option, }, } @@ -57,22 +60,42 @@ impl Surface { backdrop: bool, ) -> Result<(Self, Renderer), Box> { let forced = std::env::var("SNOWBOUND_RENDERER").ok(); - if forced.as_deref() != Some("gl") { + let forced = forced.as_deref(); + let size = window.inner_size(); + let size = [size.width, size.height]; + let native = |opengl, translucent, renderer| { + let backend = Backend::Native { + opengl, + translucent, + target: None, + }; + Ok((Self { size, backend }, renderer)) + }; + if !matches!(forced, Some("d3d11" | "gl")) { match webgpu::Surface::new(window.clone(), backdrop).await { Ok((surface, renderer)) => { let backend = Backend::Wgpu(Box::new(surface)); - let size = window.inner_size(); - let size = [size.width, size.height]; return Ok((Self { size, backend }, renderer)); } Err(error) if forced.is_some() => return Err(error), - Err(error) => eprintln!("No Direct3D 12 ({error}); drawing with OpenGL"), + Err(error) => eprintln!("No Direct3D 12 ({error})"), } } let RawWindowHandle::Win32(handle) = window.window_handle()?.as_raw() else { unreachable!() }; - let device = unsafe { GetDC(handle.hwnd.get() as HWND) }; + let hwnd = handle.hwnd.get() as HWND; + if forced != Some("gl") { + match Renderer::direct3d11(hwnd) { + Ok((renderer, adapter)) => { + eprintln!("Canvas GPU: Direct3D 11 ({adapter})"); + return native(None, backdrop, renderer); + } + Err(error) if forced.is_some() => return Err(error.into()), + Err(error) => eprintln!("No Direct3D 11 ({error}); drawing with OpenGL"), + } + } + let device = unsafe { GetDC(hwnd) }; let request = |alpha| gl::PIXELFORMATDESCRIPTOR { nSize: size_of::() as u16, nVersion: 1, @@ -147,25 +170,14 @@ impl Surface { the driver from your graphics card's maker. ({error})" ) })?; - let size = window.inner_size(); - Ok(( - Self { - size: [size.width, size.height], - backend: Backend::Gl { - device, - translucent, - target: None, - }, - }, - renderer, - )) + native(Some(device), translucent, renderer) } /// Whether frames leave the system's backdrop showing. pub fn translucent(&self) -> bool { match &self.backend { Backend::Wgpu(surface) => surface.translucent(), - Backend::Gl { translucent, .. } => *translucent, + Backend::Native { translucent, .. } => *translucent, } } @@ -189,13 +201,13 @@ impl Surface { texture: Some((frame.texture, frame.reconfigure)), })) } - Backend::Gl { target, .. } => { + Backend::Native { target, .. } => { let target = match target.take() { Some(target) if target.size() == self.size => target, - _ => GlTarget::new(self.size)?, + _ => renderer.target(self.size)?, }; Ok(Some(Frame { - target: target.into(), + target, texture: None, })) } @@ -213,20 +225,18 @@ impl Surface { surface.present(renderer, frame); } ( - Backend::Gl { - device, + Backend::Native { + opengl, translucent, target: kept, }, - Target::Gl(target), + target, None, ) => { - if *translucent { - renderer.present_translucent(&target); - } else { - target.present(); + renderer.present(&target, *translucent); + if let Some(device) = opengl { + unsafe { gl::SwapBuffers(*device) }; } - unsafe { gl::SwapBuffers(*device) }; *kept = Some(target); } _ => unreachable!("Frames come from the surface's own backend"), @@ -244,8 +254,8 @@ impl Surface { texture: Some(offscreen.texture), }) } - Backend::Gl { .. } => Ok(Offscreen { - target: GlTarget::new(self.size)?.into(), + Backend::Native { .. } => Ok(Offscreen { + target: renderer.target(self.size)?, texture: None, }), } @@ -261,7 +271,7 @@ impl Surface { (Backend::Wgpu(surface), target, Some(texture)) => { surface.read(renderer, webgpu::Offscreen { target, texture }) } - (Backend::Gl { .. }, Target::Gl(target), None) => Ok(target.read_pixels()), + (Backend::Native { .. }, target, None) => Ok(renderer.read_pixels(&target)?), _ => unreachable!("Snapshots come from the surface's own backend"), } } diff --git a/crates/snowbound/src/sync.rs b/crates/snowbound/src/sync.rs index 80b9597377f5e7b315056d745e28cc00b770f89c..ead43de22709b19b0129ea75e550977b44fb3123 100644 --- a/crates/snowbound/src/sync.rs +++ b/crates/snowbound/src/sync.rs @@ -39,7 +39,7 @@ fn describe( quiet: bool, ) -> (&'static str, &'static [&'static str]) { if offline { - return ("Working offline", art::SYNC_OFFLINE); + return ("Offline", art::SYNC_OFFLINE); } match sync.state() { SyncState::ReadOnly => ("Can’t save changes", art::SYNC_ERROR), @@ -78,14 +78,6 @@ fn brief(sync: &SyncStatus, offline: bool) -> String { /// out the recycle bin, unless something is wrong there. fn sections(library: &Library, session: &Session) -> Vec<(String, SyncStatus)> { let open = &session.tabs[session.tab].path; - let copy = |sync: &SyncStatus| SyncStatus { - synced: sync.synced, - error: sync - .error - .as_ref() - .map(|error| std::io::Error::new(error.kind(), error.to_string())), - queued: sync.queued, - }; let mut sections = library .background .as_ref() @@ -120,13 +112,21 @@ fn overall(sections: &[(String, SyncStatus)]) -> SyncStatus { .map(|(_, sync)| sync.synced) .collect::>>() .and_then(|times| times.into_iter().min()), - error: worst - .and_then(|sync| sync.error.as_ref()) - .map(|error| std::io::Error::new(error.kind(), error.to_string())), + error: worst.and_then(|sync| copy(sync).error), queued: sections.iter().map(|(_, sync)| sync.queued).sum(), } } +/// `sync` again; its error, which can't be cloned, as one of the same kind and message. +fn copy(sync: &SyncStatus) -> SyncStatus { + SyncStatus { + synced: sync.synced, + error: (sync.error.as_ref()) + .map(|error| std::io::Error::new(error.kind(), error.to_string())), + queued: sync.queued, + } +} + fn changes(count: u64) -> String { match count { 1 => "1 change".to_owned(), @@ -175,8 +175,8 @@ const TITLE: &str = "Notebook Sync Status"; fn update_note(update: &update::Status) -> Option { match update { update::Status::Downloading(version) => Some(format!("Downloading {version}…")), - update::Status::Ready(version, _) => Some(format!("{version} is ready")), - update::Status::Available(version) => Some(format!("{version} is available")), + update::Status::Ready(version, ..) => Some(format!("{version} is ready")), + update::Status::Available(version, ..) => Some(format!("{version} is available")), _ => None, } } @@ -209,7 +209,7 @@ pub(crate) fn control(ui: &mut Ui, session: &Session, update: &update::Status, t ); let waiting = matches!( update, - update::Status::Ready(..) | update::Status::Available(_) + update::Status::Ready(..) | update::Status::Available(..) ); if waiting { ui.leaf( @@ -259,6 +259,8 @@ struct Facts<'a> { conflicts: Vec<(ExGuid, &'a str)>, offline: bool, update: &'a update::Status, + /// Whether the update's changes are listed. + changes_listed: bool, /// Whether the open section's file can be shown in the file manager. local: bool, } @@ -273,6 +275,126 @@ struct Picked { conflict: Option, build_folder: bool, restart: bool, + list_changes: bool, +} + +/// What a newer build changes: `summary`, which unfolds the titles under their kinds when +/// `listed`. Returns whether the summary was clicked. +fn changes_list(ui: &mut Ui, summary: &str, changes: &[update::Change], listed: bool) -> bool { + let theme = ui.theme.clone(); + let line = theme.font_size * 1.6; + let toggle = ui.open( + "summary", + Spec { + flags: Flags::CLICKABLE, + size: [fill(), px(line)], + gap: 4.0, + role: Some(accesskit::Role::Button), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(toggle) { + node.set_label(summary); + node.set_expanded(listed); + } + ui.leaf( + "label", + Spec { + size: [fit(), px(line)], + text: Some(summary), + overflow: Overflow::Ellipsis, + ..Spec::default() + }, + ); + ui.leaf( + "chevron", + Spec { + size: [fit(), px(line)], + icon: Some(if listed { + art::CHEVRON_UP + } else { + ui::shell::CHEVRON + }), + color: Some(theme.text_dim), + ..Spec::default() + }, + ); + ui.close(); + // Unfolds to the titles' height, scrolling past a few dozen lines. + let list = ui.id("changes"); + let rows = ui + .rect(list.child("rows")) + .map_or(0.0, |rect| rect[3] - rect[1]); + let height = ui.animate(list, if listed { rows.min(line * 9.0) } else { 0.0 }); + if listed || height > 0.0 { + ui.open_as( + list, + Spec { + flags: Flags::SCROLL | Flags::CLIP, + axis: Axis::Y, + size: [fill(), px(height)], + role: Some(accesskit::Role::List), + ..Spec::default() + }, + ); + ui.open( + "rows", + Spec { + axis: Axis::Y, + size: [fill(), children()], + pad: [0.0, 2.0], + gap: 2.0, + ..Spec::default() + }, + ); + let mut kind = None; + for (index, change) in changes.iter().enumerate() { + if kind != Some(change.kind) { + kind = Some(change.kind); + ui.leaf( + ("heading", index), + Spec { + size: [fill(), px(line)], + text: Some(change.kind.heading()), + color: Some(theme.text_dim), + bold: true, + ..Spec::default() + }, + ); + } + ui.open( + ("change", index), + Spec { + size: [fill(), children()], + gap: 6.0, + role: Some(accesskit::Role::ListItem), + ..Spec::default() + }, + ); + ui.leaf( + "bullet", + Spec { + size: [fit(), fit()], + text: Some("•"), + color: Some(theme.text_dim), + ..Spec::default() + }, + ); + ui.leaf( + "title", + Spec { + size: [fill(), fit()], + text: Some(&change.title), + overflow: Overflow::Wrap, + ..Spec::default() + }, + ); + ui.close(); + } + ui.close(); + ui.close(); + } + ui.signal(toggle).clicked } /// Lays out the open popup's contents. @@ -320,10 +442,7 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { let waiting = changes(sync.queued); let conflict; let advice = if facts.offline { - Some(match sync.queued { - 0 => "Turn off Work offline to sync.".to_owned(), - _ => format!("{waiting} will sync when you go back online."), - }) + None } else { match state { SyncState::NotConnected => Some(match sync.queued { @@ -354,7 +473,9 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { icon = art::SYNC_WARNING; } - // The status: headline, when it last synced or what to do, and a running sync's bar. + // The status: headline and Work offline's switch, what to do, then one line of when it + // last synced or how a sync runs, over a running sync's bar. Its height holds as Work + // offline turns on and off. ui.open( "status", Spec { @@ -367,10 +488,19 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { if let Some(node) = ui.access(ui.current()) { node.set_live(accesskit::Live::Polite); } + let height = theme.font_size * 2.0; + ui.open( + "header", + Spec { + size: [fill(), px(height)], + gap: 8.0, + ..Spec::default() + }, + ); ui.leaf( "headline", Spec { - size: [fill(), px(theme.font_size * 2.0)], + size: [fill(), px(height)], text: Some(headline), icon: Some(icon), font_size: Some(theme.font_size * 1.2), @@ -379,12 +509,118 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { ..Spec::default() }, ); + let switch = ui.open( + "offline", + Spec { + flags: Flags::CLICKABLE, + size: [children(), px(height)], + gap: 8.0, + role: Some(accesskit::Role::Switch), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(switch) { + node.set_label("Work offline"); + node.set_toggled(facts.offline.into()); + } + let signal = ui.signal(switch); + picked.offline = signal.clicked; + ui.leaf( + "label", + Spec { + size: [fit(), px(height)], + text: Some("Work offline"), + color: Some(theme.text_dim), + ..Spec::default() + }, + ); + let [width, side] = [30.0, 18.0]; + let on = ui.animate(switch.child("on"), f32::from(u8::from(facts.offline))); + let mix = |from: [f32; 4], to: [f32; 4]| { + std::array::from_fn(|at| from[at] + (to[at] - from[at]) * on) + }; + ui.open( + "track", + Spec { + size: [px(width), px(height)], + inset: [0.0, (height - side) / 2.0, 0.0, (height - side) / 2.0], + fill: Some(mix(theme.chip, theme.accent)), + border: signal.hovered.then_some(theme.accent), + radius: side / 2.0, + ..Spec::default() + }, + ); + let knob = side - 4.0; + let left = 2.0 + (width - side) * on; + let top = (height - side) / 2.0 + 2.0; + ui.mark([left, top, left + knob, top + knob], [1.0; 4], knob / 2.0); + ui.close(); + ui.close(); + ui.close(); + if let Some(advice) = &advice { + text(ui, "advice", advice, theme.text); + } else if !facts.conflicts.is_empty() && !showing { + text( + ui, + "advice", + "Both versions are kept. Open the page to compare them.", + theme.text, + ); + } + let fraction = match total { + 0 => 1.0, + _ if state == SyncState::UpToDate => 1.0, + _ => done as f32 / total as f32, + }; + let subtitle = if showing { + let mut caption = match total { + 0 | 1 => String::new(), + _ => format!("{done} of {total} sections synced"), + }; + if sync.queued > 0 { + if !caption.is_empty() { + caption += " · "; + } + caption += &format!("{waiting} to send"); + } + caption + } else if facts.offline && sync.queued > 0 { + format!("{waiting} waiting") + } else if let Some(synced) = sync.synced { + ui.wake_after(Duration::from_secs(30)); + let prefix = match advice.is_some() || facts.offline { + true => "Last synced", + false => "Synced", + }; + format!("{prefix} {}", ago(synced)) + } else { + String::new() + }; + let subtitle = match subtitle.is_empty() { + true => "Checking for changes…", + false => &subtitle, + }; + ui.leaf( + "subtitle", + Spec { + size: [fill(), px(theme.font_size * 1.5)], + text: Some(subtitle), + color: Some(theme.text_dim), + overflow: Overflow::Ellipsis, + ..Spec::default() + }, + ); + ui.close(); + + // A running sync's bar takes the rule's place, which keeps the bar's height. + ui.open( + "progress", + Spec { + size: [fill(), px(6.0)], + ..Spec::default() + }, + ); if showing { - let fraction = match total { - 0 => 1.0, - _ if state == SyncState::UpToDate => 1.0, - _ => done as f32 / total as f32, - }; let fraction = ui.animate(bar.child("fraction"), fraction); let running = ui.lasted(bar.child("running"), true).as_secs_f32(); ui.open_as( @@ -419,48 +655,18 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { node.set_numeric_value(f64::from((fraction * 100.0).round())); } ui.close(); - let mut caption = match total { - 0 | 1 => String::new(), - _ => format!("{done} of {total} sections synced"), - }; - if sync.queued > 0 { - if !caption.is_empty() { - caption += " · "; - } - caption += &format!("{waiting} to send"); - } - if caption.is_empty() { - caption = "Checking for changes…".to_owned(); - } - text(ui, "caption", &caption, theme.text_dim); } else { - if let Some(advice) = &advice { - text(ui, "advice", advice, theme.text); - } else if !facts.conflicts.is_empty() && headline != "Syncing…" { - text( - ui, - "advice", - "Both versions are kept. Open the page to compare them.", - theme.text, - ); - } - if let Some(synced) = sync.synced { - let prefix = match advice { - Some(_) => "Last synced", - None => "Synced", - }; - text( - ui, - "synced", - &format!("{prefix} {}", ago(synced)), - theme.text_dim, - ); - ui.wake_after(Duration::from_secs(30)); - } + ui.leaf( + "rule", + Spec { + size: [fill(), px(6.0)], + inset: [0.0, 2.5, 0.0, 2.5], + fill: Some(theme.chip), + ..Spec::default() + }, + ); } ui.close(); - - rule(ui, "identity-rule"); // Which notebook, and where it lives; the full location in the tooltip. ui.open( "identity", @@ -528,9 +734,7 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { ); // Where the whole notebook can't be reached, the headline says so for each section // without changes waiting. - let unreached = |sync: &SyncStatus| { - !facts.offline && sync.state() == SyncState::NotConnected && sync.queued == 0 - }; + let unreached = |sync: &SyncStatus| sync.state() == SyncState::NotConnected && sync.queued == 0; let behind: Vec<_> = facts .sections .iter() @@ -650,17 +854,32 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { ui.open( "update", Spec { + axis: Axis::Y, size: [fill(), children()], + gap: 4.0, + ..Spec::default() + }, + ); + text(ui, "note", &format!("Snowbound {note}"), theme.text); + if let update::Status::Ready(_, _, changes) | update::Status::Available(_, changes) = + facts.update + && let Some(summary) = update::summary(changes) + { + picked.list_changes = changes_list(ui, &summary, changes, facts.changes_listed); + } + ui.open( + "actions", + Spec { + size: [fill(), children()], + pad: [0.0, 4.0], gap: 8.0, ..Spec::default() }, ); ui.leaf( - "note", + "space", Spec { - size: [fill(), px(theme.font_size * 2.0)], - text: Some(&format!("Snowbound {note}")), - overflow: Overflow::Ellipsis, + size: [fill(), px(1.0)], ..Spec::default() }, ); @@ -669,6 +888,7 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { picked.restart = ui::button(ui, "restart", "Restart to Update").clicked; } ui.close(); + ui.close(); } ui.open( @@ -680,7 +900,6 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { ..Spec::default() }, ); - picked.offline = ui::check_box(ui, "offline", "Work offline", facts.offline).clicked; ui.leaf( "space", Spec { @@ -688,30 +907,32 @@ fn build(ui: &mut Ui, facts: &Facts) -> Picked { ..Spec::default() }, ); - picked.show_file = match facts.local { - true => ui::button(ui, "show-file", platform::SHOW_FILE).clicked, - false => { - ui.leaf( - "show-file", - Spec { - size: [fit(), px(theme.font_size * 2.0)], - text: Some(platform::SHOW_FILE), - color: Some(theme.text_dim), - fill: Some(theme.chip), - radius: 4.0, - pad: [theme.font_size * 0.75, 0.0], - center: true, - role: Some(accesskit::Role::Button), - ..Spec::default() - }, - ); - if let Some(node) = ui.access(ui.id("show-file")) { - node.set_disabled(); - } - false + // A button that can't act now, dimmed. + let button = |ui: &mut Ui, part: &str, label: &str, enabled: bool| { + if enabled { + return ui::button(ui, part, label).clicked; } + ui.leaf( + part, + Spec { + size: [fit(), px(theme.font_size * 2.0)], + text: Some(label), + color: Some(theme.text_dim), + fill: Some(theme.chip), + radius: 4.0, + pad: [theme.font_size * 0.75, 0.0], + center: true, + role: Some(accesskit::Role::Button), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(ui.id(part)) { + node.set_disabled(); + } + false }; - picked.sync_now = ui::button(ui, "sync-now", "Sync Now").clicked; + picked.show_file = button(ui, "show-file", platform::SHOW_FILE, facts.local); + picked.sync_now = button(ui, "sync-now", "Sync Now", !facts.offline); ui.close(); picked } @@ -817,6 +1038,7 @@ impl State { .collect(), offline, update: &update, + changes_listed: self.updates.changes_listed, local: file.is_some(), }; open(ui, anchor); @@ -852,13 +1074,14 @@ impl State { } match update { update::Status::Downloading(version) - | update::Status::Ready(version, _) - | update::Status::Available(version) + | update::Status::Ready(version, ..) + | update::Status::Available(version, ..) if picked.build_folder => { update::show_build(&version) } _ if picked.restart => self.restart_to_update(), + _ if picked.list_changes => self.updates.changes_listed ^= true, _ => {} } Ok(()) @@ -915,6 +1138,7 @@ mod tests { conflicts: Vec::new(), offline: false, update: &IDLE, + changes_listed: false, local: true, } } @@ -1110,16 +1334,11 @@ mod tests { assert!(!bar(&ui)); } - #[cfg(all(feature = "wgpu", not(windows)))] - #[test] - fn popup_renders_each_state() { - let output = std::env::var_os("SNOWBOUND_SYNC_RENDER").map(std::path::PathBuf::from); - let mut gpu = output.as_ref().map(|output| { - std::fs::create_dir_all(output).unwrap(); - Gpu::new() - }); - type Made = fn() -> Facts<'static>; - let states: Vec<(&str, Made)> = vec![ + type Made = fn() -> Facts<'static>; + + /// Each state the popup shows, by name. + fn states() -> Vec<(&'static str, Made)> { + vec![ ("up-to-date", || facts(sections(|_| status(true, 0, None)))), ("syncing", || { facts(sections(|index| match index { @@ -1178,7 +1397,71 @@ mod tests { place: vec!["iCloud Drive".into(), "Notes".into()], ..facts(sections(|_| status(true, 0, None))) }), - ]; + ("update", || Facts { + update: ready(), + ..facts(sections(|_| status(true, 0, None))) + }), + ("update-listed", || Facts { + update: ready(), + changes_listed: true, + ..facts(sections(|_| status(true, 0, None))) + }), + ] + } + + /// A staged build that brings a little of each kind. + fn ready() -> &'static update::Status { + let changes = serde_json::from_value(serde_json::json!([ + {"version": "2026-10-01-r3", "kind": "feature", "title": "Styles and themes"}, + {"version": "2026-10-01-r3", "kind": "feature", "title": "Settings redesign with search"}, + {"version": "2026-10-01-r3", "kind": "feature", "title": "Undo across pages"}, + {"version": "2026-10-01-r4", "kind": "fix", "title": "Section copies keep their own TOC entries"}, + {"version": "2026-10-01-r4", "kind": "fix", "title": "Pasted pictures keep the size OneNote 2010 gives them"}, + {"version": "2026-10-01-r5", "kind": "other", "title": "Drop leftover debug output"}, + ])) + .unwrap(); + Box::leak(Box::new(update::Status::Ready( + update::Version::parse("2026-10-01-r5").unwrap(), + std::path::PathBuf::new(), + changes, + ))) + } + + /// Work offline's switch stays put as it turns on and off, and so do the buttons below + /// but where a problem's advice, which offline leaves out, goes and comes back. + #[test] + fn toggling_offline_moves_nothing() { + let switch = id().child("status").child("header").child("offline"); + let controls = id().child("controls"); + for (name, made) in states() { + let advised = !matches!( + overall(&made().sections).state(), + SyncState::UpToDate | SyncState::Syncing + ); + let mut places = Vec::new(); + for offline in [false, true, false] { + let mut ui = ui(Appearance::Light); + let mut now = Instant::now(); + let facts = Facts { offline, ..made() }; + settle(&mut ui, &mut now, &facts); + places.push((ui.rect(switch).unwrap(), ui.rect(controls).unwrap())); + } + for pair in places.windows(2) { + assert_eq!(pair[0].0, pair[1].0, "{name}"); + assert!(advised || pair[0].1 == pair[1].1, "{name}: {places:?}"); + } + } + } + + #[cfg(all(feature = "wgpu", not(windows)))] + #[test] + fn popup_renders_each_state() { + let output = std::env::var_os("SNOWBOUND_SYNC_RENDER").map(std::path::PathBuf::from); + let mut gpu = output.as_ref().map(|output| { + std::fs::create_dir_all(output).unwrap(); + Gpu::new() + }); + let states = states(); for (appearance, theme) in [(Appearance::Light, "light"), (Appearance::Dark, "dark")] { for (name, facts) in &states { let mut ui = ui(appearance); @@ -1226,6 +1509,32 @@ mod tests { shot += 1; } } + // Work offline on, an edit waiting, then off: the edit sends and nothing moves. + let frames = output.join(format!("toggle-{theme}")); + std::fs::create_dir_all(&frames).unwrap(); + let mut ui = self::ui(appearance); + let mut now = Instant::now(); + settle( + &mut ui, + &mut now, + &facts(sections(|_| status(true, 0, None))), + ); + for tick in 0..360 { + let seconds = tick as f32 / 60.0; + let queued = u64::from((2.0..4.6).contains(&seconds)) * 2; + let facts = Facts { + offline: (1.0..3.2).contains(&seconds), + ..facts(sections(|index| { + status(true, u64::from(index == 1) * queued, None) + })) + }; + now += Duration::from_micros(16_667); + frame(&mut ui, now, &facts); + if tick % 2 == 0 { + let path = frames.join(format!("{:03}.png", tick / 2)); + gpu.save(&ui, &path, Some(360.0)); + } + } } } } diff --git a/crates/snowbound/src/tags.rs b/crates/snowbound/src/tags.rs index c3a6f15c50048b858e990702b48058773e739a8d..fe2b3e2745f8fcaf0500ddf8d622db711c92a9bd 100644 --- a/crates/snowbound/src/tags.rs +++ b/crates/snowbound/src/tags.rs @@ -345,26 +345,6 @@ fn picker( Anchor::Below(ui.rect(button).unwrap_or_default()) } -/// The trailing row of a dialog: its buttons at the right. -fn buttons(ui: &mut Ui) { - ui.open( - "buttons", - Spec { - size: [fill(), children()], - pad: [0.0, 8.0], - gap: 8.0, - ..Spec::default() - }, - ); - ui.leaf( - "space", - Spec { - size: [fill(), px(1.0)], - ..Spec::default() - }, - ); -} - /// The frame of a dialog titled `title`, centred in the window. fn dialog(ui: &mut Ui, id: Id, title: &str, width: f32) { let theme = ui.theme.clone(); @@ -545,7 +525,7 @@ impl State { .flatten() }); ui.close(); - buttons(ui); + crate::buttons(ui); let ok = button(ui, "ok", "OK", list.tags != self.tags); let cancel = ui::button(ui, "cancel", "Cancel").clicked; ui.close(); @@ -880,7 +860,7 @@ fn tag_editor( ..Spec::default() }, ); - buttons(ui); + crate::buttons(ui); let named = !tag.label.trim().is_empty(); let ok = button(ui, "ok", "OK", named) || entered && named; let cancel = ui::button(ui, "cancel", "Cancel").clicked; diff --git a/crates/snowbound/src/themes.rs b/crates/snowbound/src/themes.rs index 88a2a1cb6879b40958f080b019101a82bb6bda18..94d5d6d81592bd3ae8b26e6d3e78290748afc973 100644 --- a/crates/snowbound/src/themes.rs +++ b/crates/snowbound/src/themes.rs @@ -156,22 +156,7 @@ impl State { return Ok(()); } self.persist()?; - let Some(session) = &self.session else { - return Ok(()); - }; - let space = session.space; - session.section.apply( - &self.author, - onestore::op::Edit { - at: filetime(), - ops: ops - .into_iter() - .map(|op| onestore::op::Op::Page { space, op }) - .collect(), - }, - )?; - self.edited(vec![space]); - self.refresh() + self.edit_page(ops) } /// Opens the Themes dialog choosing a theme for `scope` of the open page. diff --git a/crates/snowbound/src/undo.rs b/crates/snowbound/src/undo.rs index 912c47b8da9f57d01a4754948cf29d2f79a6c2c4..8e6f22084509255f261e4135b5e16945b5c3e219 100644 --- a/crates/snowbound/src/undo.rs +++ b/crates/snowbound/src/undo.rs @@ -3,6 +3,7 @@ //! window keeps what was done to pages and sections between those edits, so Undo takes back //! whichever came last where the user is. Every step taken back is an edit of its own. +use crate::library::{entry_name, folders}; use crate::{Command, Library, Loaded, State, UserEvent}; use canvas::editor::CanvasEditor; use notebook::{Replica, discover::Folder}; @@ -287,7 +288,7 @@ fn drop_newest(steps: &mut Vec, page: ExGuid, count: usize) { } /// Whether `page` holds nothing but its title, untitled. -fn blank(page: &Page) -> bool { +pub(crate) fn blank(page: &Page) -> bool { page.title.trim().is_empty() && page .objects @@ -353,6 +354,46 @@ impl Site { Ok(()) } + /// The page shown once `gone` leave `listed`, preferring `prefer`, and the page `ops` gain + /// where none stays. + fn after( + &self, + listed: &[(ExGuid, String, u32)], + gone: &[ExGuid], + prefer: Option, + ops: &mut Vec, + ) -> (ExGuid, Option) { + match neighbor(listed, gone, prefer) { + Some(show) => (show, None), + None => { + let space = self.fresh.space(); + ops.push(Op::Section(SectionOp::Create(self.fresh.clone()))); + (space, Some(space)) + } + } + } + + /// Takes out `added`, the page a section left without pages gained, in `ops` while + /// `listed` holds it and it holds nothing; the pages going. + fn take_added( + &self, + added: Option, + listed: &[(ExGuid, String, u32)], + ops: &mut Vec, + ) -> Vec { + let gone: Vec = added + .filter(|added| { + listed.iter().any(|(space, ..)| space == added) + && self.replica.page(*added).is_ok_and(|page| blank(&page)) + }) + .into_iter() + .collect(); + if !gone.is_empty() { + ops.push(Op::Section(SectionOp::Delete(gone.clone()))); + } + gone + } + /// The catalog path of the section `identity` names. fn section_path(&self, identity: [u8; 16]) -> Option { entry_of(self.library.catalog()?, identity).map(|(_, path)| path) @@ -397,14 +438,7 @@ impl Site { }) .collect(); let mut ops = vec![Op::Section(SectionOp::Delete(pages.clone()))]; - let (show, added) = match neighbor(&listed, &pages, show) { - Some(show) => (show, None), - None => { - let space = self.fresh.space(); - ops.push(Op::Section(SectionOp::Create(self.fresh.clone()))); - (space, Some(space)) - } - }; + let (show, added) = self.after(&listed, &pages, show, &mut ops); if !created && binned { let pages: Vec = kept.iter().map(|kept| kept.page.clone()).collect(); self.library.reopen()?.recycle_pages(&pages, &self.author)?; @@ -452,15 +486,7 @@ impl Site { )?]))); spaces.push(space); } - let gone: Vec = added - .filter(|added| { - at(*added).is_some() && self.replica.page(*added).is_ok_and(|p| blank(&p)) - }) - .into_iter() - .collect(); - if !gone.is_empty() { - ops.push(Op::Section(SectionOp::Delete(gone.clone()))); - } + let gone = self.take_added(added, &listed, &mut ops); self.apply(ops)?; if !created && binned { let identities: Vec<[u8; 16]> = @@ -531,14 +557,7 @@ impl Site { let before = listed[from + 1..].first().map(|(space, ..)| *space); let level = listed[from].2; let mut ops = vec![Op::Section(SectionOp::Delete(vec![page]))]; - let (show, added) = match neighbor(&listed, &[page], None) { - Some(show) => (show, None), - None => { - let space = self.fresh.space(); - ops.push(Op::Section(SectionOp::Create(self.fresh.clone()))); - (space, Some(space)) - } - }; + let (show, added) = self.after(&listed, &[page], None, &mut ops); let section = self.library.open(&path, || {})?; section.replica().apply( &self.author, @@ -590,15 +609,7 @@ impl Site { level, )?])), ]; - let gone: Vec = added - .filter(|added| { - at(*added).is_some() && self.replica.page(*added).is_ok_and(|p| blank(&p)) - }) - .into_iter() - .collect(); - if !gone.is_empty() { - ops.push(Op::Section(SectionOp::Delete(gone.clone()))); - } + let gone = self.take_added(added, &listed, &mut ops); self.apply(ops)?; section.replica().apply( &self.author, @@ -641,21 +652,10 @@ fn folder_id(folder: &Folder) -> Option<[u8; 16]> { (!folder.path.is_empty()).then_some(toc.file_id) } -/// Every folder of `catalog`, the notebook's own first. -fn folders(catalog: &Folder) -> Vec<&Folder> { - let mut all = vec![catalog]; - let mut at = 0; - while let Some(folder) = all.get(at) { - all.extend(&folder.groups); - at += 1; - } - all -} - /// The folder `identity` names, the notebook's own without one. fn folder_of(catalog: &Folder, identity: Option<[u8; 16]>) -> Option<&Folder> { match identity { - Some(_) => folders(catalog) + Some(_) => folders(catalog, |_| true) .into_iter() .find(|folder| folder_id(folder) == identity), None => Some(catalog), @@ -664,7 +664,7 @@ fn folder_of(catalog: &Folder, identity: Option<[u8; 16]>) -> Option<&Folder> { /// The section or group `identity` names: its folder and catalog path. fn entry_of(catalog: &Folder, identity: [u8; 16]) -> Option<(&Folder, String)> { - folders(catalog).into_iter().find_map(|folder| { + folders(catalog, |_| true).into_iter().find_map(|folder| { let (_, path) = entries(folder) .into_iter() .find(|(id, _)| *id == identity)?; @@ -674,18 +674,12 @@ fn entry_of(catalog: &Folder, identity: [u8; 16]) -> Option<(&Folder, String)> { /// The identity of the section or group at catalog `path`. fn identity_at(catalog: &Folder, path: &str) -> Option<[u8; 16]> { - folders(catalog).into_iter().find_map(|folder| { + folders(catalog, |_| true).into_iter().find_map(|folder| { let (id, _) = entries(folder).into_iter().find(|(_, at)| at == path)?; Some(id) }) } -/// A section or group's name, as its catalog path ends. -fn name_of(path: &str) -> &str { - let name = path.rsplit('/').next().unwrap_or(path); - name.strip_suffix(".one").unwrap_or(name) -} - /// The action taking back `change` to `library`'s sections and groups, which is about to be /// made; none for changes Undo does not take back, as OneNote 2010 takes back none. pub fn structure_undo(library: &Library, change: &crate::manage::Structure) -> Option { @@ -695,7 +689,7 @@ pub fn structure_undo(library: &Library, change: &crate::manage::Structure) -> O Structure::Rename { path, name } => Change::Rename { entry: identity_at(catalog, path)?, from: name.clone(), - to: name_of(path).to_owned(), + to: entry_name(path).to_owned(), }, Structure::Move { path, .. } => { let entry = identity_at(catalog, path)?; @@ -707,7 +701,7 @@ pub fn structure_undo(library: &Library, change: &crate::manage::Structure) -> O } } Structure::Reorder { folder, .. } => { - let folder = folders(catalog) + let folder = folders(catalog, |_| true) .into_iter() .find(|listed| listed.path == *folder)?; Change::Place { @@ -733,7 +727,7 @@ fn restructuring(library: &Library, change: &Change) -> Option<(crate::manage::S let (structure, undo) = match change { Change::Rename { entry, from, to } => { let (_, path) = entry_of(catalog, *entry)?; - if name_of(&path) != from { + if entry_name(&path) != from { return None; } ( @@ -1450,7 +1444,7 @@ mod tests { } notebook.create_group("", "Group").unwrap(); let order = |notebook: &Notebook, folder: &str| -> Vec { - let folder = folders(notebook.catalog()) + let folder = folders(notebook.catalog(), |_| true) .into_iter() .find(|listed| listed.path == folder) .unwrap(); diff --git a/crates/snowbound/src/unpack.rs b/crates/snowbound/src/unpack.rs new file mode 100644 index 0000000000000000000000000000000000000000..c33cb6f78f47122ce367ca5fdc7dee4fc6d42f14 --- /dev/null +++ b/crates/snowbound/src/unpack.rs @@ -0,0 +1,235 @@ +//! OneNote 2010's Unpack Notebook: opening a package (`.onepkg`) asks for the notebook's name, +//! colour and the folder it goes in, then writes it there (`notebook::package::unpack`) and +//! opens it. + +use crate::{State, UserEvent, art, menus::SECTION_COLORS, platform}; +use accesskit::Role; +use notebook::session::Notebook; +use std::path::{Path, PathBuf}; +use ui::{Anchor, Axis, Id, Spec, children, fill, popup::Item, px}; +use winit::keyboard::NamedKey; + +const TITLE: &str = "Unpack Notebook"; +/// The most a package may unpack to. +const LIMIT: u64 = 16 << 30; + +/// The dialog's fields while it is open. +pub struct Dialog { + package: PathBuf, + name: String, + /// A colour picked, COLORREF; none keeps the package's. + color: Option, + folder: PathBuf, +} + +fn id() -> Id { + Id::ROOT.child("unpack") +} + +fn name_field() -> Id { + id().child("name") +} + +impl State { + /// Opens Unpack Notebook on the package at `package`, named for its file and going in the + /// documents folder, as OneNote's starts in its notebooks folder. + pub(crate) fn open_unpack(&mut self, package: &Path) { + let name = package + .file_stem() + .map_or_else(String::new, |stem| stem.to_string_lossy().into_owned()); + let folder = (platform::documents_dir()) + .or_else(|| package.parent().map(Path::to_owned)) + .unwrap_or_default(); + self.unpacking = Some(Dialog { + package: package.to_owned(), + name, + color: None, + folder, + }); + self.ui.open_popup(id()); + self.ui.focus_all(name_field()); + } + + /// Builds Unpack Notebook while it is open. Create, or Enter in the name, unpacks into a + /// new folder of that name. + pub(crate) fn unpack_dialog(&mut self) { + let Some(dialog) = &mut self.unpacking else { + return; + }; + let ui = &mut self.ui; + if !ui.popup_open(id()) { + self.unpacking = None; + return; + } + let theme = ui.theme.clone(); + let row = theme.font_size * 2.0; + let entered = ui::popup::navigation(ui, &[name_field()], &[NamedKey::Enter]) + .contains(&NamedKey::Enter); + ui.open_as( + id(), + Spec { + axis: Axis::Y, + size: [px(420.0), children()], + fill: Some(theme.popup), + border: Some(theme.chip), + shadow: Some(theme.shadow), + radius: 8.0, + pad: [16.0, 12.0], + gap: 4.0, + anchor: Some(Anchor::Dialog), + role: Some(Role::Dialog), + ..Spec::default() + }, + ); + if let Some(node) = ui.access(id()) { + node.set_label(TITLE); + } + ui.leaf( + "title", + Spec { + size: [fill(), px(row)], + text: Some(TITLE), + bold: true, + role: Some(Role::Heading), + ..Spec::default() + }, + ); + let label = |ui: &mut ui::Ui, text: &str| { + ui.leaf( + text, + Spec { + size: [fill(), px(row * 0.8)], + text: Some(text), + ..Spec::default() + }, + ); + }; + label(ui, "Name:"); + ui::text_field( + ui, + name_field(), + &mut dialog.name, + "", + Spec { + size: [fill(), px(row)], + fill: Some(theme.base), + border: Some(theme.accent), + radius: 4.0, + pad: [6.0, 0.0], + ..Spec::default() + }, + ); + if let Some(node) = ui.access(name_field()) { + node.set_label("Name"); + } + label(ui, "Color:"); + let colors = id().child("colors"); + let named = (SECTION_COLORS.iter()) + .find(|(color, _)| Some(*color) == dialog.color) + .map_or("As packaged", |(_, name)| name); + let combo = ui.id("combo"); + ui::shell::combo(ui, "combo", "Color", named, 160.0, colors, true); + let items: Vec = (SECTION_COLORS.iter()) + .map(|&(color, text)| Item { + text, + icon: Some(art::SECTION), + tint: Some(theme.section(crate::section_color(Some(color))).accent), + current: Some(color) == dialog.color, + ..Item::default() + }) + .collect(); + let anchor = Anchor::Below(ui.rect(combo).unwrap_or_default()); + if let Some(index) = ui::popup::menu(ui, colors, anchor, &items, None) { + dialog.color = Some(SECTION_COLORS[index].0); + } + label(ui, "Path:"); + let folder = dialog.folder.to_string_lossy().into_owned(); + ui.leaf( + "folder", + Spec { + flags: ui::Flags::CLIP, + size: [fill(), px(row * 0.8)], + text: Some(&folder), + color: Some(theme.text_dim), + ..Spec::default() + }, + ); + let browse = ui::button(ui, "browse", "Browse…").clicked; + let root = dialog.folder.join(dialog.name.trim()); + let full = format!("Full path: {}", root.display()); + ui.leaf( + "full", + Spec { + flags: ui::Flags::CLIP, + size: [fill(), px(row * 0.8)], + text: Some(&full), + color: Some(theme.text_dim), + ..Spec::default() + }, + ); + crate::buttons(ui); + let cancel = ui::button(ui, "cancel", "Cancel").clicked; + let create = ui::button(ui, "create", "Create").clicked || entered; + ui.close(); + ui.close(); + if browse + && let Some(chosen) = + platform::pick_new(TITLE, dialog.name.trim(), "Choose", Some(&dialog.folder)) + { + if let Some(name) = chosen.file_name() { + dialog.name = name.to_string_lossy().into_owned(); + } + if let Some(parent) = chosen.parent() { + dialog.folder = parent.to_owned(); + } + } + let name = dialog.name.trim(); + let valid = + !name.is_empty() && !name.contains(['/', '\\', ':']) && name != "." && name != ".."; + if create && !valid { + return platform::alert("Couldn't unpack the notebook", "Give the notebook a name."); + } + if create && root.exists() { + return platform::alert( + "Couldn't unpack the notebook", + &format!( + "{} already exists. Choose another name or path.", + root.display() + ), + ); + } + if !create && !cancel { + return; + } + let dialog = self.unpacking.take().expect("The dialog is open"); + self.ui.close_popup(id()); + if create { + self.unpack(dialog.package, root, dialog.color); + } + } + + /// Unpacks `package` into the new folder `root` on a thread of its own, colours it + /// `color` where one was picked, and opens it. + fn unpack(&mut self, package: PathBuf, root: PathBuf, color: Option) { + let (cache, proxy) = (self.cache.clone(), self.proxy.clone()); + std::thread::spawn(move || { + let unpacked = (|| -> Result> { + let files = notebook::package::read(&std::fs::read(&package)?, LIMIT)?; + notebook::package::unpack(files, &root)?; + let location = std::path::absolute(&root)?.to_string_lossy().into_owned(); + if let Some(color) = color { + Notebook::open(&location, &cache)?.set_color(color)?; + } + Ok(location) + })() + .map_err(|error| error.to_string()); + let _ = proxy.send_event(UserEvent::Then(Box::new(move |state: &mut State| { + match unpacked { + Ok(location) => state.open_notebook(location, None), + Err(error) => platform::alert("Couldn't unpack the notebook", &error), + } + Ok(()) + }))); + }); + } +} diff --git a/crates/snowbound/src/unread.rs b/crates/snowbound/src/unread.rs new file mode 100644 index 0000000000000000000000000000000000000000..db7006f2c2b72b89e53b6c5feb698443073e9304 --- /dev/null +++ b/crates/snowbound/src/unread.rs @@ -0,0 +1,431 @@ +//! Unread changes, as OneNote 2010 shows them: a page another author changed since it was +//! last viewed is bold in the page list, and so are its section's tab and row and the groups +//! and notebook holding it, until the page is viewed and left or marked as read. OneNote keeps +//! this, and whether a notebook shows it, per user and machine in its cache, never in the +//! notebook's files; this keeps it in the cache folder's `read.json`. + +use crate::{Library, State, UserEvent, menus, recycle}; +use onestore::ExGuid; +use std::{ + collections::{BTreeMap, BTreeSet, HashSet}, + path::{Path, PathBuf}, + sync::Arc, +}; + +/// Seconds from 1970 to 1980, where OneNote's Time32 starts. +const TIME32: u64 = 315_532_800; + +/// What has been read, by notebook location. +#[derive(Default, serde::Serialize, serde::Deserialize)] +pub struct Reads { + notebooks: BTreeMap, + #[serde(skip)] + file: PathBuf, + /// The page shown: its notebook, section and space, and whether Mark as Unread left it + /// unread, which leaving it then keeps. + #[serde(skip)] + viewing: Option<(String, [u8; 16], ExGuid, bool)>, + /// The notebooks whose sections were last taken in, by `Arc` address. + #[serde(skip)] + taken: Vec, +} + +#[derive(Default, serde::Serialize, serde::Deserialize)] +struct Kept { + /// Show Unread Changes in This Notebook turned off. + #[serde(default)] + hidden: bool, + /// By section file identity, in hexadecimal. + sections: BTreeMap, +} + +#[derive(Default, serde::Serialize, serde::Deserialize)] +struct Section { + /// Time32 up to which changes to the section's pages are known. + read: u32, + unread: BTreeSet, +} + +fn hex(identity: [u8; 16]) -> String { + identity.iter().map(|byte| format!("{byte:02x}")).collect() +} + +fn now() -> u32 { + let unix = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map_or(0, |since| since.as_secs()); + u32::try_from(unix.saturating_sub(TIME32)).unwrap_or(u32::MAX) +} + +impl Reads { + /// What the cache folder `cache` keeps. + pub fn load(cache: &Path) -> Self { + let file = cache.join("read.json"); + let reads: Self = (std::fs::read(&file).ok()) + .and_then(|bytes| serde_json::from_slice(&bytes).ok()) + .unwrap_or_default(); + Self { file, ..reads } + } + + fn save(&self) { + let partial = self.file.with_extension("partial"); + let saved = serde_json::to_vec(self) + .map_err(std::io::Error::from) + .and_then(|bytes| std::fs::write(&partial, bytes)) + .and_then(|()| std::fs::rename(&partial, &self.file)); + if let Err(error) = saved { + eprintln!("Keeping what was read failed: {error}"); + } + } + + fn section(&self, notebook: &str, section: [u8; 16]) -> Option<&Section> { + let kept = self.notebooks.get(notebook).filter(|kept| !kept.hidden)?; + kept.sections.get(&hex(section)) + } + + fn section_mut(&mut self, notebook: &str, section: [u8; 16]) -> &mut Section { + let kept = self.notebooks.entry(notebook.to_owned()).or_default(); + (kept.sections.entry(hex(section))).or_insert_with(|| Section { + read: now(), + unread: BTreeSet::new(), + }) + } + + /// Whether Show Unread Changes is on for the notebook at `notebook`. + pub fn shown(&self, notebook: &str) -> bool { + self.notebooks.get(notebook).is_none_or(|kept| !kept.hidden) + } + + /// The unread pages of a section. + pub fn pages(&self, notebook: &str, section: [u8; 16]) -> Option<&BTreeSet> { + self.section(notebook, section) + .map(|section| §ion.unread) + } + + /// Takes in the pages of a section another author changed, by space. + fn changed( + &mut self, + notebook: &str, + section: [u8; 16], + pages: impl IntoIterator, + ) { + self.section_mut(notebook, section).unread.extend(pages); + self.save(); + } + + /// Takes in a section as its file stands, its pages with their `LastModifiedTime`: those + /// changed since it was last known are unread. + fn arrived( + &mut self, + notebook: &str, + section: [u8; 16], + pages: impl IntoIterator)>, + ) { + let now = now(); + let kept = self.section_mut(notebook, section); + let read = kept.read; + let mut newest = read.max(now); + for (space, modified) in pages { + if modified.is_some_and(|modified| modified > read) { + kept.unread.insert(space); + } + newest = newest.max(modified.unwrap_or(0)); + } + kept.read = newest; + self.save(); + } +} + +impl State { + /// The open section's unread pages. + pub(crate) fn unread_pages(&self) -> HashSet { + let Some(session) = &self.session else { + return HashSet::new(); + }; + let section = session + .library + .section_identity(&session.tabs[session.tab].path); + (section.and_then(|section| self.reads.pages(&session.library.location, section))) + .map_or_else(HashSet::new, |pages| pages.iter().copied().collect()) + } + + /// The sections of `library` holding unread pages, but the recycle bin's. + fn unread_sections<'a>(&'a self, library: &'a Library) -> impl Iterator + 'a { + (menus::folders(library).into_iter()) + .flat_map(|folder| &folder.sections) + .filter(|section| { + (self.reads.pages(&library.location, section.file_id)) + .is_some_and(|pages| !pages.is_empty()) + }) + .map(|section| section.path.as_str()) + } + + /// The notebooks, groups and sections holding unread pages, by `Library::key`. + pub(crate) fn unread_keys(&self) -> HashSet { + let mut keys = HashSet::new(); + for library in &self.notebooks { + for mut path in self.unread_sections(library) { + keys.insert(library.key(path)); + while let Some((folder, _)) = path.rsplit_once('/') { + keys.insert(library.key(folder)); + path = folder; + } + keys.insert(library.key("")); + } + } + keys + } + + /// Whether `library` has an unread page anywhere. + pub(crate) fn unread_notebook(&self, library: &Library) -> bool { + self.unread_sections(library).next().is_some() + } + + /// Follows what is read, each frame: a notebook's sections are known from when it opens, + /// and the page shown turns read once left, its section known up to then. + pub(crate) fn follow_reading(&mut self) { + let taken: Vec = self + .notebooks + .iter() + .map(|library| Arc::as_ptr(library) as usize) + .collect(); + if taken != self.reads.taken { + let mut added = false; + for library in &self.notebooks { + for folder in menus::folders(library) { + for section in &folder.sections { + let kept = self + .reads + .notebooks + .entry(library.location.clone()) + .or_default(); + if !kept.sections.contains_key(&hex(section.file_id)) { + self.reads.section_mut(&library.location, section.file_id); + added = true; + } + } + } + } + if added { + self.reads.save(); + } + self.reads.taken = taken; + } + let viewing = self.session.as_ref().and_then(|session| { + let path = &session.tabs[session.tab].path; + let section = session.library.section_identity(path)?; + (session.version.is_none() && !recycle::binned(path)) + .then(|| (session.library.location.clone(), section, session.space)) + }); + let same = |(notebook, section, space, _): &(String, [u8; 16], ExGuid, bool)| { + viewing.as_ref() == Some(&(notebook.clone(), *section, *space)) + }; + if self.reads.viewing.as_ref().is_some_and(same) { + return; + } + if let Some((notebook, section, space, kept)) = self.reads.viewing.take() { + let left = self.reads.section_mut(¬ebook, section); + let removed = !kept && left.unread.remove(&space); + let moved = viewing.as_ref().is_none_or(|(_, now, _)| *now != section); + if moved { + left.read = left.read.max(now()); + } + if removed || moved { + self.reads.save(); + } + } + self.reads.viewing = + viewing.map(|(notebook, section, space)| (notebook, section, space, false)); + } + + /// Pages of the open section another author changed, as its sync reports them. + pub(crate) fn changed_elsewhere(&mut self, spaces: &[ExGuid]) { + if let Some(session) = &self.session + && let Some(section) = session + .library + .section_identity(&session.tabs[session.tab].path) + { + self.reads + .changed(&session.library.location, section, spaces.iter().copied()); + } + } + + /// Sections of `library` at catalog `paths` whose files another client changed: their + /// pages are read on a thread of their own, those changed since unread. + pub(crate) fn sections_changed(&self, library: &Arc, paths: Vec) { + let (library, proxy) = (Arc::clone(library), self.proxy.clone()); + std::thread::spawn(move || { + let Ok(Some(notebook)) = &library.notebook else { + return; + }; + let read: Vec<_> = (paths.iter()) + .filter(|path| !recycle::binned(path)) + .filter_map(|path| { + let section = library.section_identity(path)?; + let image = notebook.read_section(path).ok()?; + let pages = notebook::session::stored_pages(&image).ok()?; + Some((section, pages)) + }) + .collect(); + let location = library.location.clone(); + let _ = proxy.send_event(UserEvent::Then(Box::new(move |state: &mut State| { + for (section, pages) in read { + let pages = pages.iter().map(|page| (page.space, page.modified)); + state.reads.arrived(&location, section, pages); + } + Ok(()) + }))); + }); + } + + /// Mark as Read, or as Unread, on the page shown, as OneNote 2010's Ctrl+Q does. + pub(crate) fn toggle_read(&mut self) { + let Some((notebook, section, space, kept)) = self.reads.viewing.as_mut() else { + return; + }; + let pages = &mut self.reads.notebooks.entry(notebook.clone()).or_default(); + let unread = &mut (pages.sections.entry(hex(*section)).or_default()).unread; + *kept = unread.insert(*space); + if !*kept { + unread.remove(space); + } + self.reads.save(); + } + + /// Whether the page shown is unread. + pub(crate) fn page_unread(&self) -> bool { + self.reads + .viewing + .as_ref() + .is_some_and(|(notebook, section, space, _)| { + self.reads + .pages(notebook, *section) + .is_some_and(|pages| pages.contains(space)) + }) + } + + /// Mark Notebook as Read. + pub(crate) fn mark_notebook_read(&mut self, library: &Library) { + if let Some(kept) = self.reads.notebooks.get_mut(&library.location) { + kept.sections + .values_mut() + .for_each(|section| section.unread.clear()); + if let Some((.., kept)) = &mut self.reads.viewing { + *kept = false; + } + self.reads.save(); + } + } + + /// Show Unread Changes in This Notebook, on or off. + pub(crate) fn toggle_unread_shown(&mut self, library: &Library) { + let kept = self + .reads + .notebooks + .entry(library.location.clone()) + .or_default(); + kept.hidden = !kept.hidden; + self.reads.save(); + } + + /// Next Unread: the next unread page of the open section, else the first of the next + /// section, in the notebook's order, holding one. + pub(crate) fn next_unread(&mut self) { + let Some(session) = &self.session else { + return; + }; + let unread = self.unread_pages(); + let at = session + .pages + .iter() + .position(|(space, ..)| *space == session.space); + let after = (session.pages.iter().skip(at.map_or(0, |at| at + 1))) + .find(|(space, ..)| unread.contains(space)); + if let Some((space, ..)) = after { + self.commands.push(crate::Command::OpenPage(*space)); + return; + } + let library = Arc::clone(&session.library); + let here = session.tabs[session.tab].path.clone(); + let paths: Vec = (menus::folders(&library).into_iter()) + .flat_map(|folder| library.tabs(&folder.path)) + .map(|tab| tab.path) + .collect(); + let start = paths + .iter() + .position(|path| *path == here) + .map_or(0, |at| at + 1); + let next = (paths[start..].iter().chain(&paths[..start])).find_map(|path| { + let section = library.section_identity(path)?; + let first = self.reads.pages(&library.location, section)?.first()?; + Some((path.clone(), *first)) + }); + if let Some((path, space)) = next { + self.last_pages.insert(library.key(&path), space); + self.commands + .push(crate::Command::OpenSection(library, path)); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn page(n: u32, modified: Option) -> (ExGuid, Option) { + ( + ExGuid { + guid: [n as u8; 16], + n, + }, + modified, + ) + } + + /// A section first known has nothing unread; pages another client changed after are, + /// and stay so across a reload, until read; a notebook not showing them shows none. + #[test] + fn pages_changed_elsewhere_stay_unread_until_read() { + let folder = std::env::temp_dir().join(format!("snowbound-unread-{}", std::process::id())); + std::fs::create_dir_all(&folder).unwrap(); + let (notebook, section) = ("/notebook", [3; 16]); + let mut reads = Reads::load(&folder); + let known = reads.section_mut(notebook, section).read; + reads.arrived( + notebook, + section, + [page(1, Some(known - 10)), page(2, Some(known + 5))], + ); + let unread = |reads: &Reads| -> Vec { + (reads.pages(notebook, section).into_iter().flatten()) + .map(|space| space.n) + .collect() + }; + assert_eq!(unread(&reads), [2]); + reads.changed( + notebook, + section, + [ExGuid { + guid: [4; 16], + n: 4, + }], + ); + let mut reads = Reads::load(&folder); + assert_eq!(unread(&reads), [2, 4]); + // Known up to the newest change: the same page arriving again is no news. + reads.section_mut(notebook, section).unread.clear(); + reads.arrived(notebook, section, [page(2, Some(known + 5))]); + assert!(unread(&reads).is_empty()); + reads.changed( + notebook, + section, + [ExGuid { + guid: [4; 16], + n: 4, + }], + ); + reads.notebooks.get_mut(notebook).unwrap().hidden = true; + assert!(reads.pages(notebook, section).is_none() && !reads.shown(notebook)); + std::fs::remove_dir_all(&folder).unwrap(); + } +} diff --git a/crates/snowbound/src/update.rs b/crates/snowbound/src/update.rs index 36a056908bfa734a0ab008b825b66dffd7d371c4..a97ab4b6deb089c5e74aa683d69bb93318b8bc17 100644 --- a/crates/snowbound/src/update.rs +++ b/crates/snowbound/src/update.rs @@ -73,7 +73,7 @@ pub struct Version { } impl Version { - fn parse(name: &str) -> Option { + pub(crate) fn parse(name: &str) -> Option { let (date, revision) = name.split_once("-r")?; let digits = |range: std::ops::Range| { date.get(range) @@ -120,6 +120,64 @@ pub fn describe_running() -> String { struct Build { version: String, archives: HashMap, + /// Every change since the first published build, oldest first; builds before these + /// were listed have none. + #[serde(default)] + changes: Vec, +} + +/// One feature, bug fix or other change a build brings, as `tools/release.py` lists them. +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Change { + /// The version of the commit that made it. + version: String, + pub kind: Kind, + pub title: String, +} + +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "lowercase")] +pub enum Kind { + Feature, + Fix, + #[serde(other)] + Other, +} + +impl Kind { + /// The kind's heading in a list of changes. + pub fn heading(self) -> &'static str { + match self { + Kind::Feature => "Features", + Kind::Fix => "Bug fixes", + Kind::Other => "Other changes", + } + } +} + +/// What `changes` amount to, as "3 features, 5 bug fixes, and 2 other changes"; none when +/// there are none. +pub fn summary(changes: &[Change]) -> Option { + let parts: Vec = [ + (Kind::Feature, "feature", "features"), + (Kind::Fix, "bug fix", "bug fixes"), + (Kind::Other, "other change", "other changes"), + ] + .into_iter() + .filter_map(|(kind, one, many)| { + match changes.iter().filter(|change| change.kind == kind).count() { + 0 => None, + 1 => Some(format!("1 {one}")), + count => Some(format!("{count} {many}")), + } + }) + .collect(); + match parts.as_slice() { + [] => None, + [one] => Some(one.clone()), + [first, second] => Some(format!("{first} and {second}")), + [rest @ .., last] => Some(format!("{}, and {last}", rest.join(", "))), + } } #[derive(Clone, Debug, Deserialize)] @@ -169,25 +227,35 @@ fn newer( } /// `platform`'s archive in the build `build.json` describes, once its signature holds and -/// it describes `version`. +/// it describes `version`, and its changes since `running`, features first. fn archive( key: &[u8], build: &[u8], signature: &[u8], version: &Version, platform: &str, -) -> Result { + running: Option<&Version>, +) -> Result<(Archive, Vec), String> { verify(key, build, &String::from_utf8_lossy(signature))?; - let build: Build = + let mut build: Build = serde_json::from_slice(build).map_err(|error| format!("build.json: {error}"))?; if Version::parse(&build.version).as_ref() != Some(version) { return Err(format!("build.json describes {}", build.version)); } - build + let archive = build .archives - .get(platform) - .cloned() - .ok_or_else(|| format!("{} has no {platform} archive", version.name())) + .remove(platform) + .ok_or_else(|| format!("{} has no {platform} archive", version.name()))?; + let mut changes: Vec = build + .changes + .into_iter() + .filter(|change| { + Version::parse(&change.version) + .is_some_and(|made| running.is_none_or(|running| made > *running)) + }) + .collect(); + changes.sort_by_key(|change| change.kind); + Ok((archive, changes)) } fn check_archive(key: &[u8], archive: &Archive, bytes: &[u8]) -> Result<(), String> { @@ -302,10 +370,11 @@ pub enum Status { Idle, UpToDate, Downloading(Version), - /// Verified and unpacked beside the install, waiting for Restart to Update. - Ready(Version, PathBuf), + /// Verified and unpacked beside the install, waiting for Restart to Update, with what it + /// changes. + Ready(Version, PathBuf, Vec), /// Newer than this build, which can't install it itself: its folder has the download. - Available(Version), + Available(Version, Vec), Failed(&'static str), } @@ -326,6 +395,7 @@ fn check( progress: &dyn Fn(Status), ) -> Status { let platform = platform(); + let since = running; // Under Rosetta the native build of the same version is still the update. let running = running.filter(|_| !translated()); let fetch = |path: &str, limit| { @@ -346,15 +416,16 @@ fn check( }; let build = fetch(&format!("{}build.json", version.folder()), 1 << 20)?; let signature = fetch(&format!("{}build.json.sig", version.folder()), 1 << 10)?; - let archive = archive(key, &build, &signature, &version, &platform).map_err(unverified)?; + let (archive, changes) = + archive(key, &build, &signature, &version, &platform, since).map_err(unverified)?; let Some(folder) = install.and_then(staging) else { - return Ok(Status::Available(version)); + return Ok(Status::Available(version, changes)); }; let item = staged(&folder); if std::fs::read_to_string(folder.join("version")).is_ok_and(|name| name == version.name()) && item.exists() { - return Ok(Status::Ready(version, item)); + return Ok(Status::Ready(version, item, changes)); } progress(Status::Downloading(version.clone())); let bytes = fetch( @@ -363,10 +434,10 @@ fn check( )?; check_archive(key, &archive, &bytes).map_err(unverified)?; Ok(match stage(&bytes, &folder, &version) { - Ok(item) => Status::Ready(version, item), + Ok(item) => Status::Ready(version, item, changes), Err(error) => { eprintln!("Cannot stage the update in {}: {error}", folder.display()); - Status::Available(version) + Status::Available(version, changes) } }) })(); @@ -410,6 +481,8 @@ pub struct Updates { thread: std::thread::Thread, /// Restart to Update was chosen: swap the staged build in once the app quits. restart: bool, + /// The sync popup lists what the update changes. + pub(crate) changes_listed: bool, } impl Updates { @@ -474,6 +547,7 @@ impl Updates { shared, thread, restart: false, + changes_listed: false, } } @@ -499,7 +573,7 @@ impl Updates { /// The staged build to swap in, once Restart to Update has quit the app. pub fn restarting(&self) -> Option { match self.status() { - Status::Ready(_, staged) if self.restart => Some(staged), + Status::Ready(_, staged, _) if self.restart => Some(staged), _ => None, } } @@ -518,20 +592,26 @@ impl State { return; }; match status { - Status::Ready(version, _) => { + Status::Ready(version, _, changes) => { if platform::confirm( "Update ready", - &format!("Snowbound {version} is ready to install."), + &described( + format!("Snowbound {version} is ready to install."), + &changes, + ), "Later", "Restart to Update", ) { self.restart_to_update(); } } - Status::Available(version) => { + Status::Available(version, changes) => { if platform::confirm( "Update available", - &format!("Download Snowbound {version} from its build folder."), + &described( + format!("Download Snowbound {version} from its build folder."), + &changes, + ), "Later", "Open Build Folder", ) { @@ -548,6 +628,28 @@ impl State { } } +/// `lead`, then what `changes` amount to and the first dozen of their titles under their +/// kinds, as a dialog's detail. +fn described(lead: String, changes: &[Change]) -> String { + const LISTED: usize = 12; + let Some(summary) = summary(changes) else { + return lead; + }; + let mut detail = format!("{lead} It brings {summary}.\n"); + let mut kind = None; + for change in changes.iter().take(LISTED) { + if kind != Some(change.kind) { + kind = Some(change.kind); + detail += &format!("\n{}\n", change.kind.heading()); + } + detail += &format!("• {}\n", change.title); + } + if changes.len() > LISTED { + detail += &format!("and {} more\n", changes.len() - LISTED); + } + detail.trim_end().to_owned() +} + /// Opens the folder a build is published in. pub fn show_build(version: &Version) { platform::reveal(format!("{BASE}{}", version.folder())); @@ -696,6 +798,18 @@ mod tests { assert!(newer(b"", "macos-aarch64", None).is_err()); } + /// What each build `publish` describes lists: r9 and r10 published, r7 and r8 skipped. + fn changes() -> serde_json::Value { + serde_json::json!([ + {"version": "2026-09-29-r7", "kind": "fix", "title": "Old fix"}, + {"version": "2026-09-29-r8", "kind": "fix", "title": "Pasted pictures keep their size"}, + {"version": "2026-09-29-r8", "kind": "feature", "title": "Pinch zoom"}, + {"version": "2026-09-29-r9", "kind": "release", "title": "Stable download names"}, + {"version": "2026-09-29-r10", "kind": "feature", "title": "Styles and themes"}, + {"version": "someday", "kind": "feature", "title": "Unversioned"}, + ]) + } + /// A build.json for `archive`'s bytes under `platform`, with its signature. fn publish( pair: &Ed25519KeyPair, @@ -708,6 +822,7 @@ mod tests { let build = serde_json::to_vec_pretty(&serde_json::json!({ "version": name, "commit": "0123456789abcdef", + "changes": changes(), "archives": {platform: { "file": file, "size": bytes.len(), @@ -728,35 +843,37 @@ mod tests { let bytes = b"an archive".to_vec(); let (build, signature) = publish(&pair, "2026-09-29-r10", "linux-x86_64", "a.tar.gz", &bytes); - let found = archive(key, &build, &signature, &tenth, "linux-x86_64").unwrap(); + let (found, _) = archive(key, &build, &signature, &tenth, "linux-x86_64", None).unwrap(); check_archive(key, &found, &bytes).unwrap(); let mut tampered = build.clone(); let at = tampered.iter().position(|&byte| byte == b'a').unwrap(); tampered[at] = b'b'; - assert!(archive(key, &tampered, &signature, &tenth, "linux-x86_64").is_err()); + assert!(archive(key, &tampered, &signature, &tenth, "linux-x86_64", None).is_err()); assert!( archive( generate().public_key().as_ref(), &build, &signature, &tenth, - "linux-x86_64" + "linux-x86_64", + None ) .is_err() ); - assert!(archive(key, &build, b"zz", &tenth, "linux-x86_64").is_err()); + assert!(archive(key, &build, b"zz", &tenth, "linux-x86_64", None).is_err()); assert!( archive( key, &build, &signature, &version("2026-09-29-r11"), - "linux-x86_64" + "linux-x86_64", + None ) .is_err() ); - assert!(archive(key, &build, &signature, &tenth, "macos-aarch64").is_err()); + assert!(archive(key, &build, &signature, &tenth, "macos-aarch64", None).is_err()); assert!( check_archive(key, &found, b"an archivf") @@ -780,6 +897,98 @@ mod tests { ); } + fn change(kind: Kind, title: &str) -> Change { + Change { + version: "2026-09-29-r10".to_owned(), + kind, + title: title.to_owned(), + } + } + + #[test] + fn summaries_name_each_kind_with_plurals_and_list_grammar() { + let fix = || change(Kind::Fix, "A fix"); + let feature = || change(Kind::Feature, "A feature"); + let other = || change(Kind::Other, "Another change"); + assert_eq!(summary(&[]), None); + assert_eq!(summary(&[fix()]).unwrap(), "1 bug fix"); + assert_eq!(summary(&[other(), other()]).unwrap(), "2 other changes"); + assert_eq!( + summary(&[fix(), feature(), fix()]).unwrap(), + "1 feature and 2 bug fixes" + ); + let mut all = vec![feature(), feature(), feature(), other(), other()]; + all.extend(std::iter::repeat_with(fix).take(5)); + assert_eq!( + summary(&all).unwrap(), + "3 features, 5 bug fixes, and 2 other changes" + ); + assert_eq!( + described("Ready.".to_owned(), &[feature(), fix(), fix()]), + "Ready. It brings 1 feature and 2 bug fixes.\n\nFeatures\n• A feature\n\nBug fixes\n• A fix\n• A fix" + ); + assert_eq!(described("Ready.".to_owned(), &[]), "Ready."); + } + + /// A build lists what every build since the first brought; a check sums those newer than + /// the running build, skipped releases included, features first, and an unknown kind is + /// another change. + #[test] + fn changes_sum_across_skipped_releases() { + let pair = generate(); + let key = pair.public_key().as_ref(); + let tenth = version("2026-09-29-r10"); + let (build, signature) = publish(&pair, "2026-09-29-r10", "linux-x86_64", "a", b"a"); + let since = |running: Option<&str>| { + let running = running.map(version); + let (_, changes) = archive( + key, + &build, + &signature, + &tenth, + "linux-x86_64", + running.as_ref(), + ) + .unwrap(); + changes + .into_iter() + .map(|change| (change.kind, change.title)) + .collect::>() + }; + assert_eq!( + since(Some("2026-09-29-r9")), + [(Kind::Feature, "Styles and themes".to_owned())] + ); + assert_eq!( + since(Some("2026-09-29-r7")), + [ + (Kind::Feature, "Pinch zoom".to_owned()), + (Kind::Feature, "Styles and themes".to_owned()), + (Kind::Fix, "Pasted pictures keep their size".to_owned()), + (Kind::Other, "Stable download names".to_owned()), + ] + ); + assert_eq!(since(Some("2026-09-29-r10")), []); + assert_eq!(since(None).len(), 5); + + // Builds published before changes were listed still read, as builds listing them do + // for clients that predate them. + let old = serde_json::json!({"version": "2026-09-29-r10", "archives": {"linux-x86_64": { + "file": "a", "size": 1, "sha256": "", "signature": "", + }}}); + let old = serde_json::to_vec(&old).unwrap(); + let signature = hex(pair.sign(&old).as_ref()).into_bytes(); + let (_, changes) = archive(key, &old, &signature, &tenth, "linux-x86_64", None).unwrap(); + assert_eq!(changes, []); + #[derive(Deserialize)] + #[allow(dead_code)] + struct Earlier { + version: String, + archives: HashMap, + } + assert!(serde_json::from_slice::(&build).is_ok()); + } + /// An archive as `tools/release.py` packs this platform's, holding `marker`. fn pack(folder: &Path, marker: &str) -> Vec { if !cfg!(target_os = "macos") { @@ -856,10 +1065,14 @@ mod tests { let status = check(&fetch, &key, Some(&running), Some(&install), &|status| { progress.lock().unwrap().push(status) }); - let Status::Ready(found, item) = status else { + let Status::Ready(found, item, listed) = status else { panic!("{status:?}"); }; assert_eq!(found, version("2026-09-29-r10")); + assert_eq!( + summary(&listed).unwrap(), + "2 features, 2 bug fixes, and 1 other change" + ); assert_eq!( *progress.lock().unwrap(), [Status::Downloading(found.clone())] @@ -869,7 +1082,10 @@ mod tests { fetched.lock().unwrap().clear(); let again = check(&fetch, &key, Some(&running), Some(&install), &|_| {}); - assert_eq!(again, Status::Ready(found.clone(), item.clone())); + assert_eq!( + again, + Status::Ready(found.clone(), item.clone(), listed.clone()) + ); assert!( !fetched .lock() @@ -884,7 +1100,7 @@ mod tests { ); assert_eq!( check(&fetch, &key, Some(&running), None, &|_| {}), - Status::Available(found.clone()) + Status::Available(found.clone(), listed.clone()) ); assert_eq!( check( @@ -955,6 +1171,13 @@ mod tests { fn the_published_build_installs() { let folder = scratch("published"); let install = staged(&folder); + let placeholder = pack(&folder, "old"); + let unpacked = stage( + &placeholder, + &folder.join("unpacked"), + &version("2000-01-01-r1"), + ); + std::fs::rename(unpacked.unwrap(), &install).unwrap(); let old = version("2000-01-01-r1"); let status = check( &download, @@ -963,7 +1186,7 @@ mod tests { Some(&install), &|_| {}, ); - let Status::Ready(found, staged) = status else { + let Status::Ready(found, staged, _) = status else { panic!("{status:?}"); }; apply(&staged, &install).unwrap(); diff --git a/crates/snowbound/src/windows.rs b/crates/snowbound/src/windows.rs index f15a3b1dd36d58fa9ce10f0297c419537b19be26..307378e100e1b69860579e46fdc08aaf41de4086 100644 --- a/crates/snowbound/src/windows.rs +++ b/crates/snowbound/src/windows.rs @@ -51,6 +51,8 @@ static PREVIOUS: AtomicIsize = AtomicIsize::new(0); static COMPOSED: AtomicBool = AtomicBool::new(false); /// The window's scale factor, as `f32` bits, for hit-testing outside a frame. static SCALE: AtomicU32 = AtomicU32::new(0x3f80_0000); +/// The window's smallest client size in points, as `f32` bits. +static MIN_SIZE: [AtomicU32; 2] = [AtomicU32::new(0), AtomicU32::new(0)]; /// The caption button under the pointer, by its hit-test code: as the system reports it /// over Mica, where the system runs them, and as the row saw it for the close button, /// whose glyph turns white on red. @@ -219,7 +221,7 @@ fn offer_to_open() { None, &format!("\"{executable}\" \"%1\""), ); - for extension in [".one", ".onetoc2"] { + for extension in [".one", ".onetoc2", ".onepkg"] { set(&format!(r"{extension}\OpenWithProgids"), Some(PROG_ID), ""); } } @@ -259,6 +261,46 @@ fn reframe(hwnd: HWND) { unsafe { wm::SetWindowPos(hwnd, std::ptr::null_mut(), 0, 0, 0, 0, flags) }; } +/// Keeps the window's client area at least `size` points, widening it now if narrower. +/// winit's `set_min_inner_size` would size the window to its client area with the caption +/// the row took over, growing it by the caption's height each time. +pub fn set_min_size(window: &Window, size: [f32; 2]) { + for (bound, side) in MIN_SIZE.iter().zip(size) { + bound.store(side.to_bits(), Ordering::Relaxed); + } + let hwnd = hwnd(window); + let mut current = RECT::default(); + unsafe { wm::GetWindowRect(hwnd, &mut current) }; + let [width, height] = outer(hwnd, min_size()); + let (now, high) = (current.right - current.left, current.bottom - current.top); + if now < width || high < height { + let flags = wm::SWP_NOMOVE | wm::SWP_NOZORDER | wm::SWP_NOACTIVATE; + let [width, height] = [now.max(width), high.max(height)]; + unsafe { wm::SetWindowPos(hwnd, std::ptr::null_mut(), 0, 0, width, height, flags) }; + } +} + +/// The smallest client size in device pixels. +fn min_size() -> [i32; 2] { + let scale = f32::from_bits(SCALE.load(Ordering::Relaxed)); + MIN_SIZE + .each_ref() + .map(|side| (f32::from_bits(side.load(Ordering::Relaxed)) * scale).ceil() as i32) +} + +/// The window size whose client area is `client`, with the window's frame as it is now. +fn outer(hwnd: HWND, client: [i32; 2]) -> [i32; 2] { + let (mut window, mut inner) = (RECT::default(), RECT::default()); + unsafe { + wm::GetWindowRect(hwnd, &mut window); + wm::GetClientRect(hwnd, &mut inner); + } + [ + client[0] + (window.right - window.left) - inner.right, + client[1] + (window.bottom - window.top) - inner.bottom, + ] +} + fn set_attribute(hwnd: HWND, attribute: u32, value: &T) -> bool { unsafe { Dwm::DwmSetWindowAttribute( @@ -292,6 +334,14 @@ unsafe extern "system" fn frame_procedure( let procedure: wm::WNDPROC = std::mem::transmute(PREVIOUS.load(Ordering::Relaxed)); wm::CallWindowProcW(procedure, hwnd, message, wparam, lparam) }; + if message == wm::WM_GETMINMAXINFO { + let result = previous(message, wparam, lparam); + let info = unsafe { &mut *(lparam as *mut wm::MINMAXINFO) }; + let [width, height] = outer(hwnd, min_size()); + let least = &mut info.ptMinTrackSize; + (least.x, least.y) = (least.x.max(width), least.y.max(height)); + return result; + } match message { // Accent colours and transparency effects reach the window only as settings. wm::WM_SETTINGCHANGE | wm::WM_DWMCOLORIZATIONCOLORCHANGED => { @@ -652,23 +702,58 @@ pub fn titlebar(appearance: Theme) -> Option<[[f32; 4]; 2]> { }) } -/// The theme over the window's material. Over Windows 7's glass, fields and tool buttons -/// take white faces, as Internet Explorer's do there, so their text and icons stay legible, -/// and the sidebar stays opaque. -pub fn over_backdrop(theme: ui::Theme, _: Theme) -> ui::Theme { - let sidebar = theme.sidebar; - let theme = theme.over_backdrop(); - if caption() != Caption::Glass || eleven() { - return theme; +/// The theme over the window's material. Aero glass takes whatever lies behind the window +/// and any colour the user picks, so on Windows 7 the toolbar keeps opaque faces under its +/// icons, as `SNOWBOUND_W7_CHROME` picks: `bar`, Explorer's opaque command bar under the glass +/// frame; `pills`, a face per group of tools over the glass; `frost`, the strip see-through +/// enough to tint it; or `tint`, one panel of tools in the glass's colour, and `tint-tiles`, +/// a tile per group. +pub fn over_backdrop(theme: ui::Theme, appearance: Theme) -> ui::Theme { + if version() >= (6, 2, 0) { + return theme.over_backdrop(); } - ui::Theme { - sidebar, - base: [1.0, 1.0, 1.0, 0.8], - tool: [1.0, 1.0, 1.0, 0.35], - ..theme + match std::env::var("SNOWBOUND_W7_CHROME").as_deref() { + Ok("pills") => ui::Theme { + strip: [0.0; 4], + tool: theme.base, + ..theme + }, + Ok("frost") => ui::Theme { + strip: [theme.strip[0], theme.strip[1], theme.strip[2], 0.85], + ..theme + }, + Ok(chrome @ ("tint" | "tint-tiles")) => ui::Theme { + strip: [0.0; 4], + tool: glass_tint(appearance == Theme::Dark), + tool_panel: chrome == "tint", + chip: [0.0, 0.0, 0.0, 0.35], + ..theme + }, + _ => theme, } } +/// The colour Windows 7 tints its glass with, at a lightness text keeps its contrast on, as +/// Mica takes the wallpaper's: more of it as the colour's intensity rises. +fn glass_tint(dark: bool) -> [f32; 4] { + let (mut color, mut opaque) = (0u32, 0); + unsafe { Dwm::DwmGetColorizationColor(&mut color, &mut opaque) }; + let [blue, green, red, intensity] = color.to_le_bytes(); + let [high, low] = [red.max(green).max(blue), red.min(green).min(blue)].map(f32::from); + let lightness = (high + low) / 510.0; + let saturation = if high == low { + 0.0 + } else { + (high - low) / 255.0 / (1.0 - (2.0 * lightness - 1.0).abs()) + }; + let strength = 0.85 * (0.6 + 0.4 * f32::from(intensity) / 255.0); + draw::hsl( + draw::hue(draw::srgb(red, green, blue)), + saturation * strength, + if dark { 0.22 } else { 0.84 }, + ) +} + /// None: the kit's own menus. pub fn menu(_: Theme) -> Option { None @@ -1402,7 +1487,10 @@ pub fn edit_date( pub fn pick_notebook(title: &str) -> Option { pick( title, - &[("OneNote notebooks and sections", "*.onetoc2;*.one")], + &[( + "OneNote notebooks, sections and packages", + "*.onetoc2;*.one;*.onepkg", + )], None, false, ) diff --git a/crates/snowbound/tests/replay.rs b/crates/snowbound/tests/replay.rs index 5784a87790897a2b952824201abbbc95e2462d2f..c00ce5eb935ebe24f7f9e5408439ccbf07036e2f 100644 --- a/crates/snowbound/tests/replay.rs +++ b/crates/snowbound/tests/replay.rs @@ -252,3 +252,101 @@ fn undo_walks_back_through_new_pages_and_their_titles() { assert_eq!(tabs, expected, "{tree}"); } } + +/// The search box's results in `tree`, one a line. +fn search_results(tree: &str) -> Vec<&str> { + tree.lines() + .skip_while(|line| line.trim() != r#"Dialog "Search""#) + .filter(|line| line.trim_start().starts_with("ListBoxOption")) + .collect() +} + +/// Steps typing `query` into the search box, then writing the tree as `name`. +fn search(query: &str, name: &str) -> Vec { + ["modifiers command", "key e", "modifiers"] + .into_iter() + .map(String::from) + .chain([ + format!("type {query}"), + "wait 2500".into(), + format!("accessibility {name}"), + ]) + .collect() +} + +/// Steps opening the page versions notebook's first version and its bar's menu. +fn version_menu() -> Vec { + let mut steps: Vec = ["modifiers command shift", "key p", "modifiers"] + .into_iter() + .chain(["type Page Versions", "wait 300", "key Enter", "wait 1000"]) + .map(String::from) + .collect(); + // The version row under the page, then the yellow bar above the version. + for point in ["1003 114", "177 94"] { + steps.extend([format!("move {point}"), "press".into(), "release".into()]); + steps.push("wait 1200".into()); + } + steps +} + +fn run(scratch: &Scratch, notebook: &Path, steps: &[String]) -> Vec { + let steps: Vec<&str> = steps.iter().map(String::as_str).collect(); + replay(scratch, Some(notebook), &steps) +} + +/// A template's content is found by search once it is on the page. +#[test] +fn search_finds_what_a_template_put_on_the_page() { + let scratch = Scratch::new("template-search"); + let notebook = + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../corpus/cross-container/candidate"); + let mut steps: Vec = ["modifiers command", "key n", "modifiers", "wait 1200"] + .into_iter() + // The Meeting tile of the template strip over the new page. + .chain(["move 615 287", "press", "release", "wait 3000"]) + .map(String::from) + .collect(); + steps.extend(search("Attendees", "found")); + let [found] = run(&scratch, ¬ebook, &steps).try_into().unwrap(); + assert!( + search_results(&found) + .iter() + .any(|line| line.contains("Attendees")), + "{found}" + ); +} + +/// A version restored is found by search. +#[test] +fn search_finds_a_restored_version() { + let scratch = Scratch::new("restore-search"); + let notebook = + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../corpus/page-versions/candidate-restore"); + let mut steps = version_menu(); + // Restore Version. + steps.extend(["key Down", "key Enter", "wait 2000"].map(String::from)); + steps.extend(search("Second author", "found")); + let [found] = run(&scratch, ¬ebook, &steps).try_into().unwrap(); + assert!(!search_results(&found).is_empty(), "{found}"); +} + +/// A version copied into its own section is listed there at once, and found by search. +#[test] +fn a_version_copied_into_its_section_is_listed_and_found() { + let scratch = Scratch::new("copy-version"); + let notebook = + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../corpus/page-versions/candidate-restore"); + let mut steps = version_menu(); + // Copy Page To…, then the section itself. + steps.extend(["key Down", "key Down", "key Down", "key Enter", "wait 600"].map(String::from)); + steps.extend(["key Down", "key Enter", "wait 2000", "accessibility copied"].map(String::from)); + steps.extend(search("Second author", "found")); + let [copied, found] = run(&scratch, ¬ebook, &steps).try_into().unwrap(); + let pages = page_tabs(&copied); + let versioned = pages + .iter() + .filter(|tab| tab.ends_with("Versioned")) + .count(); + assert_eq!(versioned, 3, "{pages:?}"); + assert!(!search_results(&found).is_empty(), "{found}"); +} diff --git a/crates/ui/src/layout.rs b/crates/ui/src/layout.rs index 45c29680eb70c5ef39f06f18cc571488fd5ca92e..385398abda719214bcd30cf53e9346eb2db461c6 100644 --- a/crates/ui/src/layout.rs +++ b/crates/ui/src/layout.rs @@ -316,9 +316,14 @@ fn in_flow(nodes: &[Built], index: usize) -> impl Iterator + '_ { /// The children's extent on `axis`: summed with gaps along the flow, otherwise the largest. fn flow(nodes: &[Built], index: usize, axis: usize) -> f32 { let sizes = in_flow(nodes, index).map(|child| nodes[child].computed[axis]); - if along(&nodes[index], axis) { + span(&nodes[index], axis, sizes) +} + +/// The extent of children `sizes` long on `axis` of `node`, as `flow` measures it. +fn span(node: &Built, axis: usize, sizes: impl Iterator) -> f32 { + if along(node, axis) { let (sum, count) = sizes.fold((0.0, 0), |(sum, count), size| (sum + size, count + 1)); - sum + nodes[index].gap * (count.max(1) - 1) as f32 + sum + node.gap * (count.max(1) - 1) as f32 } else { sizes.fold(0.0, f32::max) } @@ -335,13 +340,7 @@ pub(crate) fn narrowest(nodes: &[Built], index: usize) -> f32 { !nodes[**child].flags.contains(Flags::FLOAT) && nodes[**child].anchor.is_none() }) .map(|child| least(nodes, *child)); - let content = if along(node, 0) { - let (sum, count) = sizes.fold((0.0, 0), |(sum, count), size| (sum + size, count + 1)); - sum + node.gap * (count.max(1) - 1) as f32 - } else { - sizes.fold(0.0, f32::max) - }; - content + 2.0 * node.pad[0] + span(node, 0, sizes) + 2.0 * node.pad[0] } /// The least width `index` takes without clipping its children. diff --git a/crates/ui/src/lib.rs b/crates/ui/src/lib.rs index cff8eade2267a91433a280a7019ff8fe8fc6bc77..ddcddcfada81b1dab9d2e5439eef4cf8faee9fe6 100644 --- a/crates/ui/src/lib.rs +++ b/crates/ui/src/lib.rs @@ -324,6 +324,15 @@ struct Motion { opacity: f32, } +impl Motion { + const NONE: Motion = Motion { + zoom: 1.0, + pivot: [0.0; 2], + tilt: 0.0, + opacity: 1.0, + }; +} + /// What a box is this frame. Colours are linear RGBA. #[derive(Clone, Default)] pub struct Spec<'a> { @@ -332,13 +341,13 @@ pub struct Spec<'a> { /// The axis its children flow along. pub axis: Axis, pub text: Option<&'a str>, - /// The family the label is shaped in, where it has the glyphs; the interface's otherwise. /// The label's size in logical pixels; the theme's otherwise. pub font_size: Option, /// Shapes the label semibold. pub bold: bool, /// Shapes the label italic. pub italic: bool, + /// The family the label is shaped in, where it has the glyphs; the interface's otherwise. pub font: Option<&'a str>, pub overflow: Overflow, /// The label's colour; the theme's text colour otherwise. @@ -463,12 +472,7 @@ impl Primitives<'_> { pivot, tilt, opacity, - } = self.motion.unwrap_or(Motion { - zoom: 1.0, - pivot: [0.0; 2], - tilt: 0.0, - opacity: 1.0, - }); + } = self.motion.unwrap_or(Motion::NONE); let device = |point: [f32; 2]| point.map(|value| value * scale); let moved = |point: [f32; 2]| { device(std::array::from_fn(|axis| { @@ -797,8 +801,11 @@ impl Ui { } /// Asks for a frame `after` this one, as a running clock does. - pub fn wake_after(&mut self, after: std::time::Duration) { - let due = self.now + after; + pub fn wake_after(&mut self, after: Duration) { + self.wake_by(self.now + after); + } + + fn wake_by(&mut self, due: Instant) { self.wake = Some(self.wake.map_or(due, |wake| wake.min(due))); } @@ -1196,7 +1203,7 @@ impl Ui { /// The id a box built next under the current parent would take. pub fn id(&self, part: impl Hash) -> Id { - self.nodes[*self.stack.last().unwrap()].id.child(part) + self.current().child(part) } /// Adds a box and makes it the parent of the boxes built until `close`. @@ -1247,7 +1254,6 @@ impl Ui { self.signal(id) } - /// Eases towards `target` over the next frames, starting there the first time `id` asks. /// Holds animated value `id` at `value` without easing, as a dragged box follows the /// pointer; it eases from there once animated again. pub fn hold(&mut self, id: Id, value: f32) -> f32 { @@ -1257,6 +1263,7 @@ impl Ui { value } + /// Eases towards `target` over the next frames, starting there the first time `id` asks. pub fn animate(&mut self, id: Id, target: f32) -> f32 { let state = self.states.entry(id).or_default(); state.touched = self.frame; @@ -1293,7 +1300,7 @@ impl Ui { /// The size of `text` as a label, in logical pixels. pub fn measure(&mut self, text: &str) -> [f32; 2] { self.texts - .label(text, self.theme.font_size, false, None, self.frame) + .label(text, self.theme.font_size, self.frame) .size } @@ -1316,8 +1323,7 @@ impl Ui { self.caret = Some((id, start, self.frame)); let (opacity, hold) = draw::edit::caret_blink(self.now.saturating_duration_since(start)); if let Some(hold) = hold { - let due = self.now + hold; - self.wake = Some(self.wake.map_or(due, |wake| wake.min(due))); + self.wake_after(hold); } opacity } @@ -1468,10 +1474,8 @@ impl Ui { { let opacity = self.progress(due, TIP_FADE); self.nodes[index].motion = Some(Motion { - zoom: 1.0, - pivot: [0.0; 2], - tilt: 0.0, opacity, + ..Motion::NONE }); self.paint(index, None, None); } @@ -1961,28 +1965,8 @@ impl Ui { layers } - pub(crate) fn texts(&mut self) -> (&mut Texts, u64) { - (&mut self.texts, self.frame) - } - - pub(crate) fn field( - &mut self, - id: Id, - ) -> ( - &mut Selection, - &mut (Selection, SelectionUnit), - &mut Option<[usize; 2]>, - ) { - let state = self.states.entry(id).or_default(); - (&mut state.selection, &mut state.press, &mut state.select) - } - - pub(crate) fn grab(&mut self, id: Id) -> &mut f32 { - &mut self.states.entry(id).or_default().grab - } - - pub(crate) fn held(&mut self, id: Id) -> &mut Option<(ScrollerPart, Instant)> { - &mut self.states.entry(id).or_default().held + pub(crate) fn state(&mut self, id: Id) -> &mut State { + self.states.entry(id).or_default() } } diff --git a/crates/ui/src/popup.rs b/crates/ui/src/popup.rs index 6b20f19b7d423c091d15201b51424223d0934701..d90201efd2d7ffc80f8e1fbdb41cf11fe10420fd 100644 --- a/crates/ui/src/popup.rs +++ b/crates/ui/src/popup.rs @@ -86,6 +86,13 @@ impl Item<'_> { } } +/// Whether `items`' rows leave room for an icon or a check. +fn icons(items: &[Item]) -> bool { + items + .iter() + .any(|item| item.icon.is_some() || item.checked == Some(true)) +} + /// Builds popup `id` as a menu of `items` beside `anchor` while it is open, under a /// filter field showing `filter` while empty when given. Returns the index of the item /// chosen. @@ -100,11 +107,7 @@ pub fn menu( return None; } let style = ui.theme.menu(); - let mut measure = |text| { - ui.texts - .label(text, style.font_size, false, None, ui.frame) - .size[0] - }; + let mut measure = |text| ui.texts.label(text, style.font_size, ui.frame).size[0]; let [text, shortcut] = items.iter().fold([0.0_f32; 2], |[text, shortcut], item| { [ text.max( @@ -118,15 +121,12 @@ pub fn menu( shortcut.max(measure(item.trailing())), ] }); - let icons = items - .iter() - .any(|item| item.icon.is_some() || item.checked == Some(true)); let width = text + if shortcut > 0.0 { 3.0 * ICON_GAP + shortcut } else { 0.0 - } + if icons { ICON + ICON_GAP } else { 0.0 } + } + if icons(items) { ICON + ICON_GAP } else { 0.0 } + if items.len() as f32 > ROWS { GUTTER } else { @@ -189,7 +189,7 @@ pub fn submenus(ui: &mut Ui, id: Id, items: &[Item], submenu: impl Fn(usize) -> return; }; if now < due { - ui.wake = Some(ui.wake.map_or(due, |wake| wake.min(due))); + ui.wake_by(due); return; } popup.submenu = Some((key, None)); @@ -283,7 +283,7 @@ fn tooltip_below( return; }; if now < due { - ui.wake = Some(ui.wake.map_or(due, |wake| wake.min(due))); + ui.wake_by(due); return; } let title = if keys.is_empty() { @@ -723,34 +723,8 @@ pub fn colors( // The button is cell 0 and the swatches follow it. let cell = |index: usize| id.child(("cell", index)); let count = swatches.len() + 1; - let keys = navigation( - ui, - &[id], - &[ - NamedKey::ArrowLeft, - NamedKey::ArrowRight, - NamedKey::ArrowUp, - NamedKey::ArrowDown, - NamedKey::Enter, - ], - ); - let mut highlight = state(ui, id).highlight.map(|cell| cell as usize); - let mut chosen = None; - for index in 0..count { - let signal = ui.signal(cell(index)); - if signal.hovered && ui.moved { - highlight = Some(index); - } - if signal.clicked { - chosen = Some(index); - } - } - for key in keys { - highlight = Some(match (key, highlight) { - (NamedKey::Enter, _) => { - chosen = chosen.or(highlight); - continue; - } + let (highlight, chosen) = pick_cell(ui, id, count, cell, |key, highlight| { + match (key, highlight) { (_, None) => 0, (NamedKey::ArrowLeft, Some(at)) => at.saturating_sub(1), (NamedKey::ArrowRight, Some(at)) => (at + 1).min(count - 1), @@ -758,8 +732,8 @@ pub fn colors( (_, Some(0)) => 1, (_, Some(at)) if at + columns < count => at + columns, (_, Some(at)) => at, - }); - } + } + }); if let Some(index) = chosen { ui.close_popup(id); return Some((index > 0).then(|| swatches[index - 1].0)); @@ -834,7 +808,6 @@ pub fn colors( } highlighted(ui, id, highlight.map(cell)); ui.close(); - state(ui, id).highlight = highlight.map(|cell| cell as u64); None } @@ -845,6 +818,47 @@ fn highlighted(ui: &mut Ui, id: Id, cell: Option) { } } +/// Routes the pointer and keys over open popup `id`'s `count` cells, keeping its highlight, +/// which `step` moves for each arrow. Returns the highlight and the cell a click or Enter chose. +fn pick_cell( + ui: &mut Ui, + id: Id, + count: usize, + cell: impl Fn(usize) -> Id, + step: impl Fn(NamedKey, Option) -> usize, +) -> (Option, Option) { + let keys = navigation( + ui, + &[id], + &[ + NamedKey::ArrowLeft, + NamedKey::ArrowRight, + NamedKey::ArrowUp, + NamedKey::ArrowDown, + NamedKey::Enter, + ], + ); + let mut highlight = state(ui, id).highlight.map(|cell| cell as usize); + let mut chosen = None; + for index in 0..count { + let signal = ui.signal(cell(index)); + if signal.hovered && ui.moved { + highlight = Some(index); + } + if signal.clicked { + chosen = Some(index); + } + } + for key in keys { + match key { + NamedKey::Enter => chosen = chosen.or(highlight), + _ => highlight = Some(step(key, highlight)), + } + } + state(ui, id).highlight = highlight.map(|cell| cell as u64); + (highlight, chosen) +} + /// Builds popup `id` as a grid of `size` columns and rows beside `anchor` while it is open, /// lit from its corner to the cell pointed at, as Office's table picker is. Returns the /// columns and rows chosen. @@ -853,44 +867,19 @@ pub fn table_picker(ui: &mut Ui, id: Id, anchor: Anchor, size: [usize; 2]) -> Op return None; } let cell = |index: usize| id.child(("cell", index)); - let keys = navigation( - ui, - &[id], - &[ - NamedKey::ArrowLeft, - NamedKey::ArrowRight, - NamedKey::ArrowUp, - NamedKey::ArrowDown, - NamedKey::Enter, - ], - ); let [columns, rows] = size; - let mut highlight = state(ui, id).highlight.map(|cell| cell as usize); - let mut chosen = None; - for index in 0..columns * rows { - let signal = ui.signal(cell(index)); - if signal.hovered && ui.moved { - highlight = Some(index); - } - if signal.clicked { - chosen = Some(index); - } - } - for key in keys { - let at = highlight.unwrap_or(0); + let (highlight, chosen) = pick_cell(ui, id, columns * rows, cell, |key, highlight| { + let Some(at) = highlight else { + return 0; + }; let [column, row] = [at % columns, at / columns]; - highlight = Some(match key { - NamedKey::Enter => { - chosen = chosen.or(highlight); - continue; - } - _ if highlight.is_none() => 0, + match key { NamedKey::ArrowLeft => at - usize::from(column > 0), NamedKey::ArrowRight => at + usize::from(column + 1 < columns), NamedKey::ArrowUp => at - if row > 0 { columns } else { 0 }, _ => at + if row + 1 < rows { columns } else { 0 }, - }); - } + } + }); let extent = |index: usize| [index % columns + 1, index / columns + 1]; if let Some(index) = chosen { ui.close_popup(id); @@ -971,7 +960,6 @@ pub fn table_picker(ui: &mut Ui, id: Id, anchor: Anchor, size: [usize; 2]) -> Op ui.close(); highlighted(ui, id, highlight.map(cell)); ui.close(); - state(ui, id).highlight = highlight.map(|cell| cell as u64); None } @@ -1011,41 +999,15 @@ pub fn gallery( }) .map_or(1, |group| group.columns) }; - let keys = navigation( - ui, - &[id], - &[ - NamedKey::ArrowLeft, - NamedKey::ArrowRight, - NamedKey::ArrowUp, - NamedKey::ArrowDown, - NamedKey::Enter, - ], - ); - let mut highlight = state(ui, id).highlight.map(|cell| cell as usize); - let mut chosen = None; - for index in 0..count { - let signal = ui.signal(cell_id(index)); - if signal.hovered && ui.moved { - highlight = Some(index); - } - if signal.clicked { - chosen = Some(index); - } - } - for key in keys { + let (highlight, chosen) = pick_cell(ui, id, count, cell_id, |key, highlight| { let at = highlight.or(current.first().copied()).unwrap_or(0); - highlight = Some(match key { - NamedKey::Enter => { - chosen = chosen.or(highlight); - continue; - } + match key { NamedKey::ArrowLeft => at.saturating_sub(1), NamedKey::ArrowRight => (at + 1).min(count - 1), NamedKey::ArrowUp => at.saturating_sub(columns(at)), _ => (at + columns(at)).min(count - 1), - }); - } + } + }); if let Some(index) = chosen { ui.close_popup(id); return Some(index); @@ -1113,7 +1075,6 @@ pub fn gallery( } highlighted(ui, id, highlight.map(cell_id)); ui.close(); - state(ui, id).highlight = highlight.map(|cell| cell as u64); None } @@ -1488,9 +1449,7 @@ impl<'a> Matches<'a> { rules, ruled, rule, - icons: items - .iter() - .any(|item| item.icon.is_some() || item.checked == Some(true)), + icons: icons(items), } } } diff --git a/crates/ui/src/shell.rs b/crates/ui/src/shell.rs index 24bf0eaca67761237db02018b67d05ad2a0d60f1..8cee9f9eaf614fbd0ab377f0f51125e6e5a3af1f 100644 --- a/crates/ui/src/shell.rs +++ b/crates/ui/src/shell.rs @@ -34,12 +34,12 @@ const EDGE: f32 = 20.0; /// The row is as wide as the tabs, and gives up all of that where its own row lacks room. /// Then the tabs scroll sideways under the wheel, either way it turns, fading out at the /// ends they are cut at into the row's `fill`, and the open tab scrolls into view as it -/// opens. +/// opens. A tab given `true` after its colour reads bold, as an unread section's does. #[allow(clippy::too_many_arguments)] pub fn section_tabs( ui: &mut Ui, row: Id, - tabs: &[(&str, [f32; 4])], + tabs: &[(&str, [f32; 4], bool)], active: usize, lit: Option, dragged: Option, @@ -52,8 +52,11 @@ pub fn section_tabs( let mut left = crate::SHADOW[0]; let placed: Vec<_> = tabs .iter() - .map(|(name, _)| { - let width = TAB_PAD + ui.measure(name)[0] + 4.0 + lean(height); + .map(|&(name, _, bold)| { + let label = ui + .texts + .styled(name, ui.theme.font_size, bold, false, None, ui.frame); + let width = TAB_PAD + label.size[0] + 4.0 + lean(height); left += width; (left - width, width) }) @@ -129,7 +132,7 @@ pub fn section_tabs( .chain((active < tabs.len() && Some(active) != lifted).then_some(active)) .chain(lifted); for index in order { - let (name, color) = tabs[index]; + let (name, color, bold) = tabs[index]; let (x, width) = placed[index]; // Keyed by name, so a tab eases from where it stood when the tabs are reordered. let key = ui.id(("x", name)); @@ -164,6 +167,7 @@ pub fn section_tabs( size: [px(width), px(tall)], position: [x - offset, height - tall], text: Some(name), + bold, color: Some(mix(mix(theme.ink, fill, 0.2), theme.ink, open)), fill: Some(if lit == Some(index) { mix(colors.frame[0], [1.0; 4], 0.08) @@ -306,6 +310,11 @@ fn opens(ui: &mut Ui, id: Id, menu: Id) { } } +/// `color` as a control that does not apply now shows it. +fn faded([red, green, blue, alpha]: [f32; 4]) -> [f32; 4] { + [red, green, blue, alpha * 0.35] +} + /// A tool button, with a menu arrow where `menu`, whose command does not apply now: `icon` /// tinted by `tint` shows faded, and it takes no clicks. pub fn unavailable( @@ -315,7 +324,6 @@ pub fn unavailable( tint: [f32; 4], menu: bool, ) { - let faded = |[red, green, blue, alpha]: [f32; 4]| [red, green, blue, alpha * 0.35]; let arrow = faded(ui.theme.text_dim); let id = ui.open( part, @@ -530,9 +538,7 @@ pub fn combo( enabled: bool, ) { let theme = ui.theme.clone(); - let faded = |[red, green, blue, alpha]: [f32; 4]| { - [red, green, blue, if enabled { alpha } else { alpha * 0.35 }] - }; + let faded = |color| if enabled { color } else { faded(color) }; let id = ui.open( part, Spec { diff --git a/crates/ui/src/tests.rs b/crates/ui/src/tests.rs index 6d13f603bc016374b6ec65446a28c2ffc5f527c6..22e36ee77a917b6ce1a7c54a07726c151e9ed9fa 100644 --- a/crates/ui/src/tests.rs +++ b/crates/ui/src/tests.rs @@ -605,8 +605,8 @@ fn focused_field(text: &str) -> (Ui, String) { /// Moves the pointer over the caret before byte `index` of the field's `text`. fn point_to(ui: &mut Ui, text: &str, index: usize) { let size = ui.theme.font_size; - let (texts, frame) = ui.texts(); - let layout = &texts.label(text, size, false, None, frame).layout; + let (texts, frame) = (&mut ui.texts, ui.frame); + let layout = &texts.label(text, size, frame).layout; let x = parley::editing::Cursor::from_byte_index(layout, index, parley::Affinity::Downstream) .geometry(layout, 1.0) .x0 as f32; @@ -2817,7 +2817,7 @@ fn tab_row(ui: &mut Ui, active: usize) -> Id { ]; let tabs: Vec<_> = names .iter() - .map(|name| (*name, [0.5, 0.6, 0.9, 1.0])) + .map(|name| (*name, [0.5, 0.6, 0.9, 1.0], false)) .collect(); let section = ui.theme.section([0.5, 0.6, 0.9, 1.0]); let row = Id::ROOT.child("tabs"); diff --git a/crates/ui/src/text.rs b/crates/ui/src/text.rs index c8076a82a2281aacdc8eaa357b53abd75f458a28..57274e5e991c0b47b145ba5b1d9f90e07d48f6a1 100644 --- a/crates/ui/src/text.rs +++ b/crates/ui/src/text.rs @@ -24,19 +24,12 @@ pub(crate) struct Texts { } impl Texts { - /// `size` is in logical pixels; `font` names a family to prefer over the interface's. - pub fn label( - &mut self, - text: &str, - size: f32, - bold: bool, - font: Option<&str>, - frame: u64, - ) -> Rc

    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 U8sU220t0;%Wz}SAq|Ac<2Zv7}M*si- literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-search-locked.png b/corpus/protected-sections/native/observed/onenote-search-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..a419bcc59ee5b88a18f19805110a95f63ed45304 GIT binary patch literal 44611 zcma&NcRbr&_&?mzQdJZ+Y8F+sYj5thR7+7aF+xy#k61CPT8g5ry<2J~A~uOxtM-l= zidwPvi1CE`{(Zl{*Yo`IeEv#KPR_O8*L9t9KH+aPRVi*W-M)718pW%Z$~xDs5kI(g zjR<&)h%iETkB;ZsHN@>#%1`xt($?xoeeNy&$S;CkKrz~-*RToE_2)Lv$VbIKCkz}>q3>=Wn1Vd!Wf!`*M!t_z7= zNXeng&}C(?c;GAlt@=Lb!Ds6{|FUo6QetJ_w4kayoP@_uJM(}x{S)C?Rv{BmCOpCp z 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 VG&Il|8B+iN002ovPDHLkV1f?m^~nGL literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-tags-locked.png b/corpus/protected-sections/native/observed/onenote-tags-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3b03e6d5c78b7d569aee4c24defa29fd273813 GIT binary patch literal 52933 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 & zou4R5dotX6@03iAP&19+j*BBj3CaW<$^h#Gc^u3h)aS5f9E!KQCAI~KX!ONA7{w7Y zZFhROd9hK#IV5}3Ei%+hO;2CvGB1S=)e1O|M~wem?(zDuprgqK1%TVj9vhf=Aa@mX zfCDldS&jC_fXov^Nu|E%42mfiZHorEC+oAFp(PaWwwRyS{?J>E``j$g^_13*7uFjZ zWV|il0EjDMa&o`hTm3N+ z_hyef*@yhDV3B!6b-2)w@^ZfKPTzAZgCG>nUB&6s)9D(P!$u%*uw?@YY@*IH@Zw;j z;VDL{;1?ATpMy5=%Zj?(|$w8cqK*NIO z?@*3PEB}EC`_gr&pW&9N8UV47yzf~uoI|WM# z$2*X+V~pWZXQdyIL}hUpC{8RuomcA}YV4TMwU53nSz~=sfXhmfsMG%7_h@xqwaI3z ztR5O{BFUJvT`E}qkWews`HIEJ5dxN0pvcjQAbLwNLUe?mstXQu)!rEomU&fa#Nm|i z&I*3L(^hnGqH2;hmCgE>IwQd_vXIf+0J*LN1VJFcr`iBH^6z}~H{{4|4Mog7ZH^A?Vf9(=6J@%89@|(2?ON(fDRk%nS#h`Y3duD0p6hfGG{zxQ}pOz*&~OdBG;^3 z4X)f0`ca7T{>*H5#71L+h`k;q0MLC~0z_xE9%N)IMVD9g8O^ic)F2%HcWBV`G){bc z3zez>qf?X39))(_5nctIGQF&b(gIyz`0Ukegl!_81jDJ8Dn$WZ&G49;>IgAA)Q}WnSQ-^4zNcBn}HtgrZyHy;9Y1 zPN+Q`n=>98Hh_G-YkbdR&j@Hv2wRE^L!Fu!(ZG_0cvNCOO0UKfVk(5-c7QggiKiDF zI7Pg3Bo!Ikt1d&di4l~jPb64h&CCt!qb%Cz~NyS@cA+#;P5St6DV)(z-ZN-xwa|h(!RLB4Ghn5 z(Ha2QR9D5hoZxW^}GIR$;Ark|&QJ`4*G!c9>5^j{iZ zk4rJl*8t-~sU{8zGzWkt$q-=atAZI-QOyuR4eirAf&M|UbJf3#)2r0{@6O79iXqg* z{|{O+|J{KZfm=SqjxL)UuG`-qRk=@yoAsA$L~358Oa^}}fXZ4}JW%X}k{Ct(@bN!N z0Pf2G?IcuEfU3j)OC|chdf*IZDOy28SxE(Oa&l!KvwIK|BRAk4&0lQ@lo|hjy@UVx z%ANt09`2wO%#6-VjV|n8R(ml$)_;w6d9>s9qvfa#_|wN}@>D}xBwRy4mPTh#RBVLS ze4O@KI6p5NuJPTw>7ryRMZCQDqZz+)el19AsYm?E`*4|-X>00fPk;b}_s;?XvOPT4 z((JP`ZS7m-_O~ADn?hWyOwEh~EXXklK(~?=5KvlN>bsPrU=Rp~4e#nuKm_Fk!O%b; z5mGQUHXMr*3wRFn>N%|P7Ag1*HwzR5YA3{u41EqmQ$<4pzpY@$0tFLd5^&?=QiDLZ zFpv+dSfC2}3J4G=hz^&U00W60feyz4fj<6ESxPA%Ho?dLy0~#PB0Z<7f39P+rnI>} z*9Z^}hX23ICjP(GS1)Pl-iB{pUTIZ%ZgW1OM!4>csF;YLI2mB2SDOE_COaE+P3EKb ztMr6dS@NzgF(Q2muv%xBiwfT0`0QlaU!97c;S-kn(g!D850QTDa|697pe+OA{ ztkBoRFEq6rRUZizG``7Y<7(p&W4|qq_J4-O|7s_{+C|RFUeG^q#DZU0f>Z>MCG>}; zSnx3;-~SCreHLgb(I1+6*+EgN_)l`m0m$jbA08wP#hq+#2mO=e^Z_`}{-MSoZWTl^ zz1bg6NrOWQYLbk{DW4YOYxY0gi!>B*dq80TFl7)An(RMUg)@OC|E5$GMG|V~zu7V8 z4bDG>{r7T!_dNPTstT0A9>xE&N5FgjA^22qXm-Dq^?&Q(fUUHDXykun5gS}%Q`^i@ z1A}{p7RJffd6TU zt1z(+4`s2&M+F{Ql#LBA2^1-*016M9xDFyYA*lFLdL6GwIWYlYU}9Hmg>ti^LRrZ* z)vMqE_6I?U08{E0!>CS*oR3#^4*Hn%15k0y7=>dSTx$IsAHVUIft$WLp|DC|n!kn{ zVDXJOW#y}n?AGWksp!>^f@=ZeT`#1T0-IT&Ns}Bc=<=$NasA}e@zk4o)k-;QbTdKo z80ten{WGf@kC)PcL0AN^F$h5q?2-L~e9_-5OzpHhBuT4Tns+dTw@>6&tBhE(j{|PL zxjH{v==uaJ6pRaOyxj?aSCmEYTsYxKI;SW{B#vHfh&{PIIkg}eUSbt)+Q{EKi$60D zX>R3v!biRnn3Jl6Ag%mcId>?)OA7GFU_a&@Y@=w4J!kq=jd2*53`yRm!Yu%;SLubL zp5;~dN1TH355At_O<@5#$vuSW`-(b&o+VCWDIz7xeD=p5Jyd;$P)jYqX;8kRYmmZ3 zZ*7LyfPndNn$1{_#lzgK!j4~Tz%GNO8`w2bTX^F{s+G|6LsJFONuzi*C?{kX4k@Wg zN-_aX9@l7|R_#X^j8-#uaw!8s?1}h!#NiCRRy(lAA8g2F{m*s zSS4~$OR}~>QS9zI)w~*ttEE7WC^SoAI*(gAotR{9Z>e;tvhuR$B{&K~%l6Q&7KP#f zV$dm*q##PQ6Y2}AVDEczuGeA&*0N)RQ$6JRrL6NotEsrh*^Z>glb;0kLv5vxtx`nt+OWp@Y{{h z0rPhYLObd(S@+lTlx~|3)KWBVrhEImt*DGC6|KUnGU`n`7TZrH(uMO;JLi z>^g}CEKA7`6@8E{MvP1lei@(*&trNm+rS9*L-x}sb(V(!5JEk9*e>6O0uvU2u|HzI zcbA)0^#RnRgHuUE{*c2cxRU^$AV4O3DN)ez28+*26upT&jpRy^MhQ=%#Q|2ho%l5T zu6va9e&dqz_=~evH4?Y%F6L!1tx~5GoCdu$ZZ9)LRToP%X*S;VIC5NS;ry?C6Hn`ZSr_u*Fr_>}3ylX)L zaWiIinht)od~p{yl6ed>{A(|~ z=1u&`7=qu~nFmc;>my z?SxFp)f|i~&E|tpoM?%Vn>gTc-T1z7qx2gw%YXB!wN39MLg2TcaN_X7w$!Rb3M|}N zpeV>vf&j(Z5Ex&=biRRvk#Y05SF=Nb=pP!-1H5V)3}L*8`WdkjrQ2w7x3Sv9*TF3` z7Xr<2xpq)g9FNjQZfr1vU4PgU#`FGcW3!*?4HR4;Pq1KhA_{IEbtNU>$qTbrBNvy(%#O9pI#N=~&y zdEW{)%_Ib&t)UVr-+?h0`B*eDe=;zng9cW}u#Y8b45HV5n1D^z-uK6X> zJrgMi?JQy2Z|TLXs3IsD{ZwbRGgcPli@g8#X)Gr0t^pusLK`Ti|3Pw&Jy0byo zU-x>q!Zgg{Ls^@EG85%Zlqhd{f@F)0LUD!~p0S1x08k@i2-G0n9Ga45{wgV*isGu& z;=IPEm^+boil<0eEjLem4I9B2=-ST-u1$0>hjz3iU<3cx0_=teCN~@xnkVsiYpnke zuo33(JIhs)Usj*@!&s3^cqfkWjwky}nxTNymC9iFsI+qwYZJ%1g3(iG=KZ!u=0$J4 zvM0+-w2i%P!}lwA1o40X5Z|EzCx~@tWpA8*{BJQK4-{AU=if=00^)xxWBnKT0t_WA zQa3z0YJf3DwYL*@^mgXDSOtJaycEw{3C>Qqt4S0s}9N_%P$pd}4d0#a5|N zwz_KZpeS;4(-~{*#vapEC=Ob`(!4sttaJAtZ9WvWv5pKZ(pQ@y>%?z5G} zB_$^17LHH5e!ic&r=_Q7(&&aD_{ZabCjl=~YYd2BK%@BSB$zA4m(zdp? zDq2r@#l#@)s}dPL=nt1V`BHV_>%zjk;$^zR>e%&uYN!-)F8hBPW%)sN1&~**C~xt> zEYT;lXGJd65Uw}Y4v(ocH^bRdUG*vMhvpA&?l${OKKY=xT&kYm11efYn7oZrdNR3> z8QR^z7|J>aTlD0?{fB^ixW>V>gZKQ9Ia~c{)fTC@IZB=t=Gk(~X1{a(4sOMdMIZX` zLY9Db&Bttred!=5p#R7EVk$!#GFzlE1bSk{1RbLic6ptZ&s0|CvuQ5>)kLL?-Lci% zT1_m=Orlw%%H!=}l<)j`Sa?ghel_j=5{~Q0Sc9sMdMUvIspf29)g~M#!HeVio~u+} zsuVJml|-EzSnVUR?2*)h1~=K+gJpbud|EDlpPf$_xNK$H(}N9Y#0+oUo;JFrvG$`a zp3TAl@z^H5X3vH$6c*fp_1)2Ftl89PWD$>Nzw3rb@lT~sWKOBQ`B)y2Edox~=gG&b zc{@a`z0dwio>4)}?lpXser8lQ*KVM4*NGLb%H&}wxx&*&J^w4P;^|G>*0UXHL#<88 zr)w%|YQo&aiGIVaY?yk2A@-x3SS7boXr3Q}&B8jdw3?Mri?W|as987~8Ft=>|0-5H z*PAQ}zKShl%&5d77Dg3rwWxUjQ(dbAo9weWy@z?NJRQi)HkWz5I+*+M;_OKN@_c`H z_wm~Uxc1t%mj;8SNzOn3QfAQ+$$;dA=PgkPvwRlABmWYYi=X$A#xV+t;cdPod&f6A z;a=))Yy91Ye<_+B8u|b#@oXeeWc`F+rQmnVV5H%c5|?mhwW^MZ9~FH+-%CG2c_LxD zLnb8QV%IPH4_YU>9oacr;mI`j^bs(X*yHMB2p%s@TAbwl=CF~9yEgY&t%XLWRBxp0 z8uV4Th+cD(*;Uz!Z)|UG-%5*)q^I`;6Blr1(p0?pg$4XzmpDuG)F~>>>sRh8gqz7-cN>&u~8(fMc!7+{dv-{+54(zw-K`%Qzzwk zLrrmk{TjdiD1QX-TTaUkSM`4yw^5(7#hXo$Huz+1o+vU&LtC38*2TpI=vHTW6NymE zfAD#hY0Y&n{B8Dm7ep0NoSXtQVLKA`fIjTUIe6~)$5+!Tf45>O$iREtDR&4KNY-+5 zbHV1dAE&oE_$r#o85m>~zuaZ*E>z3eBo?U!N+?vK_ZOT?V`5?+3cb`Ki%cLlxG5v! zhlFD(Dk?6OV00<{SFvxt0upDSYzVq0A|B}W_BI{NSNUJh0p*{eVRcSUPGzMKk+w;1 z6Y$@Ax;hQ2s7(K=hYcjDgoK2^+dC!2#j{BF&}QisS+*bJN#;p}NZvIgKK{_WWUQ`L zNvu3NNv!aqv=NlJNvKjPmw>u&=IJ+4F|mpE>v8FBp(s)gQn^k$mEyvIjQ{_(d-1PW z@b5&N1^SX49TibgEd~svQW8L=|8E*4|C=n;PWb#a{qpiMa7jy6My6cPRX0;gY(j^Y z%jQdh?Dp{5(~ zz)8*hA<#_FCQX+9RALd#DI{_a_dh!*l;QPCH~BA<0BuVjqaD!-H=>lzkKU+c9vgnu z4|%hvy(M~|xl}GvNwz+qgTL>(VdH0p+2w;b;f;4AjZ`y`)esMuKkWfBqB>I@q4C-c zL*b@a5{xPt!o!cnNp;fodh0yl*VcJRQdA)hDfpItr|!P>NX*FTEk!H3ic~@^rtJ8M zLe1Q??9M~o5dwV;6s|4cs?Ni=HWqC0r4N)4(_|a5-4TXf+kYLnp+S*JWHiu4M`!<+QKF_QNypX$q_Fm9j~ z`DU+|9omt?GJBun9gfzquw^ZytER!D2vTs?&s#>qqj%q`jrw+G3(gkvc(d}N)DmBZ zqov~RUCRO17#CgE4wD*?5$#pdiOnHHJ{Xn|I;x7u@YPr7ra|q`hG6nL6WfR!+d7%}UE`kRBqMBy&W2?q?eM2W8bQG@Jn1>^qK;%0 zDw4nSfNM<#j<;F^rcof7{60bZ3=v`%qmQ_G5n9NBilh&}u;mKwJ08#5H@a~De2_D3 zkR=mM4la&*Y?7wKc6~}?#B_qG1!s?{#))hYSG8obq1~19ZHCqkM^J1c4Ysar^>G?g zi$%(huBt__)yQV;v4hnT9`y&#j`)O{4|w9wwL(PLt~4ivt@Z1{H0~0d(@fXzdqU?d zrFgGp;pYf>jeJ_CL|&-ju96YZDj@(;?vS3W*o`+27-|M35}A=6YC0Zx)`(-m*q9!c zBRYyJUCkRuEH-&0U^j?-@pQL=ARn&HQnEwey>~JS%`s2nh8q65p6yRF@e26N>cL%9 z+GJi?+1$K!-{?@G>91}@vihp-{;~t&nCKfT6gX}~9X(wo*+xu&AH|j+6I_|4JPPNs z>_c!3??8<_bjq}myu3UFvCSmNbhLOj=*lP6I3b_|Xb1j>hp}m!&NRGT96>{pjVf;y z7uHk4#V~*-{#A!0`PX|8>%FhpB6WOX0t*{k_rEgAiaRX>0|PVjm)TjViAV7S5Sr4% z!^81$qX#B74~jqMfL`8OU0Hjfx{&Ggz5FhO>JBflGv@ShfD7bFKYR)o#LK(yQ@Ope^lJzv}IU=l9ti|wO^^#Mg~rmk)VzlscYo7_DU4hqIhNer!Nm2E?UL! zvB!Sv3u*b{v+x@ERx#oCb2PF~{endyK-@C|660&`n}MqmD+F@{2V)q8NkE9ukvSr_ zdZ)l`2$j88=@3+7q7eTNmsMd!R&i%(0H+7yb)E^5vi|-y-H=#^gxN4Vv+ClF^xmBO z6wf`{>;xjzFw744!G*3Na2WY17li{AVkA97<2r@jw?-3inFU5LhHOhqLl>mRt}CA! zzq90hi(!N{D%g+V$1|1Y$!`GFJX8dXGFLo5^a4Zq0wdV}f&(KDa!>;sxd$;b{UU!W z&d^B1&hzLHUx0ozCb@m(Iz>@BCtpnEBgVr?#kIc&Fy52!YPp|_-we_$N+?&iMtl1h z$BdJz@r51ZIiZIE{usf)FQozUxWBX{>v4M=Nm*N>bz4~y_~8} zEW5u6QLI_GbuwfkaUIZA6(!16gLmjxe(#)5(5}cCil8Bjo8FNH6gd3Swko5`TJxc; zh>Y~roLoBc-rg&J*S{;>?(L>lmf+CM2czy0bfo4gbh4R`KRGX8Gs6W8rft8=uS9Kk4p)_ofTkwb!|UVaR&J zM|Q~Md-MJ2V~ozT5`YwYBgQ>G#&2sr9J14$X6sB6?c@TW()IVZVT_1 zFH_MnRf`#ft&_hsLN3uPyXt?}%=X4KCo|vT;gXe!YanYuj5lzp_o>$x1?Oj8dOs8%Srb(9>0RDM zW%yFcAv_Xb;Iff%K9Ec#g{m&RfPD(m-W4ZOTJAZib0qyZ$7 z4|}is)=zPM7I*Bun9FJ%Emjk@G?-E7EUA57RnpXotS13vNe5&Rk-p6#BgG=2L?aH;q#Mv?^1`!JN%xVn{e7aLN_+{D&r;7y zHqHC|ys}v|sQTHVD}jkfD}CY1+Zr#DI97XV@Zl`hL>G$AS%*=}-%&><(>&0Z3CeiJ zR*tLCWo8DCgBZb~%8hhs-;#~bW`*kg|oem+4tN!dNQU|48~ zy5TbG?B`WH9*zE3M=DIkZu-;UNuh1Jo)P8g*W-jOogWq-15xXW2I&f5BR>gZ^2@2* znB<%`i~R0b(lu{WvG`N@U`Cz~RXqX^U(zv-@q&UXmE>$Q$FiO<$f{tL*or#M4sx)? zU?B|-P(*B_1Xm>oz7g2WTY`v?Y4q(!@SR|lK+v-VX9VODslgg0AP^<`Nz#)7*`*io zA71I2f%;2uF(+a@gbF~2c^jxizE=e+l0#TrRktbOKEmv~pjPZ)-KOYESolx@R^$^Z z8~Xf~cfmi&($*FmdfnB}?WGYYm${;3*nK?)py z11Y)+URpl<;Jbb`3y$tQB{g_a)!hL}o*k?G;SPBzk1H*k2(bKZ)bh9llTG_3k!{>$ z@eim==c!3c(}31#PKdT4(#gq}gTV?(ZmOb0kaFy2L*Kmz*Ku|R7EiiO7*7WQGDtfD z0_x>Ra%1ksf(Uv3MY2CB0w6tbbD50{H|3bk4AJ?GeGKTXl$x8H1DkKQdigO<&-Ahe zP#%!8Xb5V0-)fRk02~ITIN@Y?a$Ev%&Pq>D-=&ON*9<{xqL^@hN#-tdI{sqw~4@=Y^mopLoiKFiG%?X zX`3N9%HY~1ugve+_^IRv8mS^w(seMkP9w>gpQti8Bi+QLmONDnCg;C0WWQ7blD9$t zVGUOZ)5MHqCoTPs6Yhu9e1xmTL{U+8c! zse$=~tdJw|>xWp?`Q5hI)NkRY;A5fcC&Qaix*05uB2%GCjSe^!!+o6?3#<5}NX>pH zr_GgrxsCY5DMtnXd5(*mYL2EHtN{`5(CuQ0T}4SrCq;yj0LtF_wJ@qAqbOWsv%}yJ zBR1#=U2N|nkIaeH9VH@3H-M26-evXvSkS`%r$7EZv1w9L+=nDD@8|d3HSRvdl5~o< zrjdllFVk*mLayLgL{|D5J{tA9BPnXGK3CKX!8S(Ur^qW>nZnROpPo*JshE`b6E8*2 zhAc4T*#mw_&v^O{@NUS0a;3 z%V$|O!N;{(+I6RidC30-K94wG<(mLD4c>=$ z1RwRU$@G^w43;e)3UKd@4@Di!>Vr$d<)o~a$&@+YQzEEx@b2CpMR@Z5NYuo+VXvQ5`8N&V=<+U zt;|K;vYEnq`}fz;`DrbtC#kX&<=$K~Cmf&8@+FQ7B(ZHIu=7=i)a<;Bdzax^3vx)hbWJY#vP^cahl<}t>R3L(3A1~P481?^ z@-!#Qg~m$xB#wz|h-p~cL#%OBO3GG6mzyEoc_40d&0ig z_NKHdKgxjDku$oeE1E}@s85whBXs;N2Wy+0+@+NTQ}Xm&BaWoe&bRR{o2k+8!5pSU zf*TL2dF>Sj$RLE0cN0H|NjfAd-)4+!&^$X`CUp#gchhvQ&;BQkQ+%)@mg~k4zzo}Q#>YMckkzK9!`BpNM)!8hYegt>>$d# z=;=jviN~7DI9F&NuZ=3tgeK5Ipi|EZ^w}96zRQ=WtKrU*r8}~C6hl}7Nh~xY`b_nO zH7xIKc!hB?yA$UIq{e83C(rQn@&4Y?!S?fhQxWr)eQ}jCU3v?NfXSu8th9apA=^!_K0c`X;Ov6O;Y$hU zAN!+b^R6}9eiRY-#TlB;^!pNGbgIcbC#!uvwx~^Wif9$z*e|AUS;D7gZrIx+Dd>wB z->CIkpLJ+ri`{bo4t?p=9gqp!28@Jkss?H1*^95}DmSx+?91!!KW)A!UXHdGOsqfO ztQruhox1cnnUxo?yg17%32a*VHKnB+Soy?nc6O2H#+m%*X?dTK9lTAxz(((rpOLAT z-aki~OWibk3%R(bxJ{?ym@uk}5yGv^Du98y9}^=h3=4)592IA616!OFgr zaRU0e)k3|^yy_m}>#H)6>!~vP9lxkGyEvZD8NQRP-FQ}zD^vz8JS$Kb*JoOZX{_qz z=H?)y6U(io8+KEnLiM)OCd^5&)n$fnzn8Us@Xp!qC+1K|%to4Hrd&mlbxuIX-R*kh z^LO@-7+eHQt1a&#g`e)dZ@ck(t-E?-GHWJpLTDYUl|*<)EpLHXtAQ?Ih5WVm#l4RA zZ@d+I4TTfIY*=@M3|^Hg8FQ2*YBI>O-3fL7CPdzf$uN*$=?2M zJEU&7-kj{D?t?+F%qI#)IZuM{^gVV0Hjx^bP(%{TuUEWM>n5X0tw-gNWjl^P7R9|} zc^%6&%6TG}l2nsZRo(j8By1O7kG`x*cpRYlp>TN2hU@}Lub7;Rxp`SS=dWzAFVS%U zLC<6(RxCg?hU(s^^IC3QhNn<4t{k|&AN{S*>kfIcvd4B`$1HRrDg zf0li3$#Nv_KVhkg%{0?U`0Ok(S4mMmMJ7!K>9(sS(!%81J-L~*nrWD_V>k7qi)(&e z`?R+Eh${QDR2@9AOMa9!%ih4EHEjz+-Mjaorv07c?{vrC^hE*mJgxM7tuGS&#wl7R zC|Za)y_q78?ml~b^!1_%=f}yc?unI)uiYV^E9nU9S|<$;YbtqEz7y^5QPY@b0liK? zQaaS<%jVy&d#sL7C7G$FP?+;Zb91d3shv>VFVv=887a{rm_Seg$fRcsF+fljylG8*+fcs z6c<1DAyRW=IihHCc$OU+c8Pfy7VtVtRD8=YKa{CRm*exi&ygw*!LB9mL6D zXQ~@VCs^uE*+TEeHG4w5Cy>_Ph#6$hs#6vOJTecOM5lJ{UIu(-O^l3*GerBGPv~@8M<%^K@VmUoYNLDjnEz`{%Qp?@sdp&?X4F%$rt=cEo8>=N z>>tba4zDtWll4VE>%I-waSe@w^hVft7~mCclzlqQHA8xX)6xi$qtypyl{)(w%%02= zo`W5~*UH`;zrp=c8U#^ZyyQOk?LIZsL_#;`M)=Y0-01&c=_-9i;IaeuzS zXKDVW6G!N#)s2q^`GQ0D`|CtK!T!yQOKn=KGC(p9bj9o|>UGX>^tx^-FO9&lFG-bz z7=U7?rZWhZ@C_BrVDndd=k|M0N~&l~xjE}GI`j3zi%F-eWvpce>& zN8+;%vb>b%LmFGAHfzW%DNsoCwn$z$HTie^;uqh|k14#ORU2_#{ecs6)e-)(GCEbq zoO9mp)X+Nx#5~Nj{SC}+Kk*%fc=HPL-*$J#cUwp`@>hguSb9)LYAAdKK!sGQO^A#^ zcMn&N6oK8};e`?|W?p8t>bDY3`sPb2w>%PT!OXJL=#$RvA~Q%fLr7279KU~OCEpYh^iywL46mUmQD(JFV+`(ahtBORS5ojkQA>3oA! zC*hiFhb4#!@fP`X>h<~W%|13j=%;otn#;?`hHY71A11}qDJ1^s?B0iAE3xdD*#8fk z#suH5oqYB2*JTH=c-1FTs=F1Lvqtn)Pg;+m-RV<6NZZodssnEG%-0KK# zje<`?39XpmGFquc482Y|kKoxrDPSj^XDkIgnR|L4NXZuJzYv&+4Oy}D6iPLif+a-IvqKvp2%IiGGq9SmL z^gJ4EW}-sEhoIg3nb0&Z@ZWzAk4~QEj{i*{Dm=cJR+cl9BxR{I@KG0VM(#_8ME!{_ z*c(@|V{mN*i^>+|WK7ghrOkb%1DG&BnF4^$7e9;kBlS)N3fm-3=R0$V z?c1ticE%qRVziu+DRt)K@LBws1wDENsAldf>n3-BD_|#LEhpsfhL{xK%ZG#0O>H>& z<)p}Y@Ks$qYhIl3wZYoo;P7gnx$l8fPH$zn#sng&*A`f>%yxs8qV@hi{YXNSYbkcS z^ym2|{WHXK>Ce`(w#ai3U{7l5g0Ytf{FA8LR@d`EO9E@pLkfhQb8?iq?n_;>!q70! z)-XIR@HjV-NfFdG1rag4NV@IW$M@CuN8py>^^krQDMA`5ZkZM4xYtn+*MGo*Gw8f1 zJ^o#k>TG$B?3X#pqP@pkf@Ig6O4O1{+?<+g&oJZ6BCMX|HQTrK<0GaoP{@7!Eyr^c zd1slH0FB1Rh@Hon!!^@R@*1arX!k5hSS^qYd?U;L#j()bO&U>VB=$L@b0Gk z)0fa6)m)QUw@WeykPMZnwJK*2!rjhwUaJtI&xX40*r@KJUs|6RLaava)#8B*{2H^p zcE2?2*xj&Lw!glY)gIvB15;?KwQ{O;K09nvvYQeLa)}4m0=U|`%EeIAgI$w?QAJ*- zI;fU6a9Bhuw{Nd;dfl#LZ{tU>lxmVQnv(}zn+>ql=sq_@m(P9yvL6e3)aaXN zkA0vBw4ZLjc7UnDI%)m5QVnwmnySoG4FfCE#7g5pQ61M3|1^NPNMh%E$ZVAL;R;zT`D=g9sT1LVM|#hk76D9- zz0`t*LVS`E)b!lARgAm?9_}Mxcz;gI-E?!;L(@o$ko2M#k@1Gd(d@&`Mg-`lZt2|= zZJ>aF<7td8iSgtzH@){z_Q?e6uhSR5(AM6`CMyyT7Dt}0+mw+BLmFuo0gUXnyzVZE z#mD@lPzXMc8goUqgLtlg;#c|l`D+&V!}6jQ>9lIkHt1hSPiN68NTV!Xu%=*%&#}ST z7#+&_p^hC*Uf>^W^WgLw7hn_CMs?RA9n`K32RVDMK3Gpv96s^fZAAZ8nTo!q3Det= z$sR`+NGI`QqTjLc8lI^(IUV=cBNEd){3(O>?>jj`20?WIU`g}&nGnftK_?@7r- z_uyv)@p=Njr+;wR@zfU2T{vWk!f(?hO5EL%-efmy$id z*f-qJLPZYxs8E1wJ92#f9C4B%4`Buz=(8=v#&1r3hoBqy>-m$XapLxVjbrM0Y1lgb z4|_UImHE}52nzySXe-;Q>ga0d#yBF5di`|Wp)nd*T1n2XNya#G1r%&GW_nEsLLDwd zhuiy32z}#kiF`TB8b?7Vu=Q2f_x6*c7Aes(1-18V%>?BnM^2;yd zpYxj^#tk1ewEnjs)evb!irEktp!q&OAZezjL5Q~j`prm0t21)8qw12B)XFJcVm_SA zwOY4vx$Ju|e;Z2Ab2gJsqa$-OVTl3`w||M4aCTns<_4a*{~30D%3vh%WPz9a@5&fH z?Hh18BZR$Ee?r(j+E6>Tx#Yys&BCASEg7(KB%LNNE*Xd-! zJ@1rdJl$)07(U%XxW=usuIGH#_*giE7BOA2NY3OI4;y89&bS#8 z)+>lTqxiV38Asaoi~Z?WBO_G>D@a4zqnl2Ed$a1*TOHhUeIy+8+qiTGObh3&t$0=Ltp2@It{6l(-6{rkqQTz)S9 zl`hh5_fzH~nqX+w!3)|gAJI%e7t6@yQxujm_-RtpoN!GaVo5=yv(hyiB)$O-fWjVj zm<(U)L1y>4-=Be1=OALDEZ%V{Ue>&1OtB=C=1LY7?95c#i7Z`$7sdF_JTn|Arn#%3 zg|VdkC+7JtWsTYBin^Ig3SY{Qg~bi!)Gxfe+?-4j@*xstPfvbw$^H3HwR`8Dbdb08*JWNdy%e5Zzgn3Lx9)&9X zwcXR-bqlqbm7ApW;>*oG>r_%ayi@Qwz&8{P&>)bYr2?RgjQ>F^nEa;dpORju?d;jL z)!+%gjPq|sRxYr3!UNoJ)gg4Mgk2fZ3G~HDjJZk7 zg;6x&WRltpe7AO{h32}OL3fBmQ+B6y&cvr(?NFgLJ?P{S^b}uO_;!^Z2tyEyg^`L@ zjlX<{r%h|k!h?KM!s8^o<>{}z!SNkGYv8o+B}l2MBk=u{#wXDJxr5VA%4X8~f&RE= zy9o$3V;veQLCs@PNx{ZkAYi1%1M0eY#&0YtUuC=K{w5nc`qJl)Ns&XH&`OaFy2#BP zS?v_27dnJ>+*#I~vf4TAplZeXR`*D&Y$o{^(EmLr=^xCXq4`Zm_ggi@@_|Iby6wks z>R+6aL}JrkDrRS!LwTlh<-(xL6nQt(P?rPe*(B`VqkU8Y)$#@U^&XMkR_VLR6^^#W z98Xy9pBtH!ERjsel8tX*$^w^KersuIS(W4 zbpXkZZL2Io{v032uBPy|XT9I^zv9KPr{;6=3Op7wyehvS4APVJE1vA=o2RDrm`U77 zqg4yCIA|=-z%W)LZ&L^h!mBk`r^%lPJs(>kc-P&*T z5v<4DRDv8wNcK(FXV|Qu^v2qb;EBgU$>>JyES`^6#+a4Iujp|$%Ts$Jz~^|vudU;7 z&zNb={Y0y4FsI*f@vN=^6)wGDz12&C&SUUkSFuY7XEUgOKFL((wq@oskwvg2>-}=7 zL!^V!V^wCm$*HjE<&rw<^KDb0avh>B*3HpwP04a~`Q~<3v~$OOzG`ty?oUrO#aubf z+<5T_YHo`+c-S8(-)9{Vw8w=_p>HW?t@&TYF2Wt>pPu~3$bPZnDH)+rD|6vNPEM;2 zx43UTxG&T;<{lD@flal*rdD84DG<~N1T|KH3afJFW>RyB{3@f&S62gS_LJO|QzX2L z4821gwLyy7Irweh5Pfs7uH&q#<&vr^c-3juqAd?4U0ox{Mk&YNETbmMDQmYXP>ar|AMOd~)jz1FdIYa#Zbg zv=TO7*=`##+iBCwtfmn-YL6I`%FVgkCzdV0#%5ZW8pmeZme@(i7DTgN#sapIPV+hW zDZcpGw0x{}+|HEhiq_cnfwjJgQ*7ju%XHsw9*$&uNfS$A3}k1-IeWBIj>n5#OV+NB z7Z*-R)Ce7S&@7=vCWru;Bd z0*Aju^DoRHY@k`3OJslWf{mWv0|SuTA#ZbX->yd))A$pMn3_Ppe5;e_1zLp1g~px*|7nsdwfMY&)OjFw8|B zM(*xuC?E1vTzs$wjvF1bXN_?Mg2r}QCf!+i@&adG3Nt)qe+9eJ<5X+jqTyC22tQew znAF!tdn?oZv|?L-yc%o*$e}Ax^U`i*cl{9$ZS#!XnBnr30gPV@?3UbtD-Z~s_Jb`A zOn6yL-V$rM-$jOqd z2vD5p{ofSm4?HDqw-t?#TU{5j51S42N5#R02?Qb6NDPO*=J5}pNfKGaCaOLCaeGR7SSR9PdcFmyq za+I)&h2_y?wcEQjmkvMKPHtC^&~W6}@E)CJy^>)&6i9Cz^t|94TUXPW*WJl>=i|MZ zC6Q5=X<#69H8$kleAd4%VzcqsBh=ai(Y+hFT2Fy-gb%2e z`E|r4FN_A)k2(K1=9oU@nm(M_*n(^XmGyAA>I@xcynHY+wUu&NAD>D?$EL$Siu;8~ zd*Hz>lRzg3q?jr6A1H(H7Ch~Z%sJ;43jgGq7~0@<-DxR`Fj|1zMS~wO0Igjv_d^JD zq7x{xwzUb?vLn{)9`-Df8NeiP(GM6c*(H$dR}1Ds(ib^BXWOXDf)x`4um1J`=*~+s z=he-`$<|o(>YK^V$lTHRy|^yI6n=E3EQ-;$31RZIt@1fGc`t1_Oc63Ul@*gSnQ1e! zWW=JR>xbz})*6c=Q0bjQ>_7I7FObKpWDCT^wO&f zINgSUrR4C5jIRmE_*b0z#fXaC>OH!ay}iABrV8 zxsTObI2zY2ugp{n%-qAAd%tyQT!f2_R^7{z?I7BG=jnvY6P3bCCbE&5N?%xzn7#eZ&?CaD4CC;uf|-_Hb;>w9NJdIm05oWAa#g zvJ3v<>nPLrk8i?Y{ zb6oacc`4(F7dbRuwe&FuG#m>nOuf~DI8!t~=h&{9`vSehWlksi(g=`! z$tb8ar>L(6bmVC{%ZhV$JL;OocRee`#GpWnHD<|pR)#MITe?MBw`QX*Esd9p~cXQRO z+l9d8FN~1gQ*Y;=4N9cwT>{#4WiHZiknpm;t>2mKo20mS`tj{2R58gs| zR-?_6mwof{QzKPm*FG4i*0^z(2o=^*}p@1#1!HrLW zFEJQ|R?KrbH;_FMVR*qq%?M~tOm%03+$mIcV?osU$VB^(C}8TFX0#LthIRWJF?weG zGCShNz$L6^O^1mhF~&e;T{aXRSpd(N%wl<3p2s)V4h+3$jAK{BmjZ;HaQvE3_vT2A znHtB+pyp%CiBncvhal7bS_?F-KR^Aw+MYxIq5DuLS|F64O>2GGF-8)8B#{ilUWMXm ztRvK*1|6MxOo2xxA%EYb?wiG5S_hTFj0_> zXLBM~xA+iSg#KS}hY~D=m1qZ7gAdrO(I54z1YcDr~4|T(tB~aou}Kkteis zj?GzJBHns_AJXX{dsMfP3(AlWd90+f=m-f>2S1aMT(fzSr}WJ+m5qMdJVJd8(|GmrA-XI!FBUjx4P0r#)4CyZhuD zB3LDG_c8?X;9QwEy?e&hJE<7rxu3&;PJ8Gz=Eqq!m6OaibuBN%As*I3IV`# zmAPrp+VNuy1(S7P5yx@PL=S8=Yf$@K@rbhMTL=nRA_+$u29oL;3-K6A16IdZL31>v z$?*3N;;UL`acgK-YNRqx@zcHO;UBli&q)`NrQW?)c#n~H-hS~~`|dK=KkWVAufepSRWkF`IO;DI#PAGQ+l&VGi7r1IbBupMg8zfp&diHEe- z!K#xFJ>G)!pF$Vb6-g1cm9YL=X;knj%3?j~IdA;9MJjh((XNH9s9JcS$&6W!+6WI` zO`-D_;%qR>QX60`MP^lV);a=LSOBk0^z;RwclbUx?tk=VrH4vzS*iGRJ)HN&mo&v3 z5oY(YvvZ(5SGh2=?Xo<~l2S}fZJ_^y^P2y6KcT+?T_y#;CVj=`l`~Fe=2xGgmxwUE zygUYIi95JWM7{DDjguMC?Q(<4^~I3flBVT`4#lNcFSBUY6WC2Xy3AE$aZhIUKmo?2 z0S+S#Lt5Dn8@u#*!X!|CXmJ}UJI~sr2*GeeTpe^W5Kk3Mpu2i^2O`W{@p5{JdK;hQ z=PIS;8a`N{E3=-`x+=-E5&Z9XN{Iyy`-*{hN{-f$tt|NpcfnnrE=EhQ8G>DWa-54n zZ^Gs53^XQ+euAy*qf_V~vLEBN7zfy2Fit%6EQ~#aRBtK1U%l9*-_ggsNgiUpf}3PM z34}Ip9dX*1j8wBWTZ3Btz~{LQ(CEB*32CwWC~~LuNJGyD43CHF8v+z* zgPWH1qtns!o`01sI#neqMJ1am`WZ=C6MG}VJEu3J9r*f7`A@gg%hm#M8{2kpW91)b zi58t_q(>_Ljj;LSeL-BO;zdRk#O9WD$oeX4`wVTU)nzS-RT`J!KUA&CK)+;1yGGBW zz2%6uE>WrJ;mOw8Q)e>5R>s2+&%SZ<5soa(YQbaNBrlPwufpdA0a0P7izt;=Ol!va|++HRg)Ea9?*=$BH~_ zj7^KF30;?f_Ko}$Wn}h4AB+>33_*w1r%g17E_yP-4$}ngKn#1*kdnJ|tbtW`@3CG6 z0J)_VLIN6^G+L^^E59z!`Ib(n!xK;#+;-j18l@N5b)$`b`)s$hHI$y?=P+1qtb_)q9c*1EeiKp=1% z*!65YXsT`lex2EuP{S7BP=oVdp#4WDPsC6>qW$|rr>#9qsLiSFI96|M|1PVvyr;W$ z|EgMw(3)BBVNB@tRNeH7&!B4&WFhWxktYY(J+L{b^%hX`o~M-rvSfPDc)HfYY@N-W z*SP92?)5JTon$^1e9G_2$mFbsMf6}g4|R7ab*5(NsFV{ z$n2T;8Hw>3{?HaGL2%+zGBkZ76U&&Onajv?;J_a_v}N*9#6Y0wj(OD$sb z2zMK`Q}}M8;_!#%Dnw&MPM}sss-9duqk7$7eC_LABMb$mhiiJky9n}cD+|F`l8Dzp z8s$(TeT3j$8f7x$rD?eFmGps3;j@m6QttZooEUqeoly2sL$cqX!Puh0wI$ zvR0!fJbuqnWsxSZ)4ZuO-r^?1(|ItA9?6Jy`1iZ2PQSI&3^~e>k{as{*A3T0zH0MM zk98&6&^362^f>@M=w-LdvFGt*-|@=Gk~RQ zmZ1bvR}Xta?^cMn`!Em05bDAu@DuA34<4COkKtP%(M2RbESjhk@Mq`<5T;CRnH(Yd_cYE_>Jy%(?%>`|1S5letbd_Rtmw#MNC*n4)ROe zn6erc*aT1|9RWtqdCIF?(07^SP-+06XgfW2RF#ROdEdD_0`#Rj8%N8HZRCdc$Ks$H zUwWe(eO&g7;c-R6+kqMg%k)GG^Xdja-E64lbw1~U0OO^Sp7!dn=*jq!pqVxe;purN zGQG65#wdf%v6mf+o{_=a*LI51Vb~B1m$55~qF)V%fT`E#HVqJ`y-HN;D%f^g`GU2m z4EK?+E;^RWxa<9h&$Jk+U%+>*^%CsA|9Ww!h1=yQy}-t?2eJy$KXzP*Uxh5xf!1q0 z&tH$KEGrN-;-u0_Se}zvp=8zn{a|{Y@k$QGbnF8WO*PVk63XB(3Z>^3;2K^u@|5ci zLB0rt?sqBY_EDHriAzpyg&2-;c-<7|myg4`uUgCUD2ivwvMHrD%ITp5c!u>=`siLa zDNY4mD2jMY?c!@z;J3>mFPX{vc(KvfV?pLk9M?5fED@~H( zp}k-kg~XW_K5cmlopl11oR&&nPUGkFal zZ7XLa@xLAJ#XSE}g5u~Wcns@T119b2e2-Yhve%Vp&wUnO2t&GwBRD2bJQ&WfDvDrz z{X?u8=60Vw3+de&=Kyl`S$&Xfdp?oH`}3iJCmGY=m)<2)sAryHbZ!<4ZkC-KKz_zLs*OtwR#G6ZDp*!HRMgw@hN7h(@5Qt6hHSgP`x;*)(*W2RMkQxd= z15X`c2J=Kdi_h)nC+`arJz*(-3i6SK!lr^nymgts*6oHHvFlwqDbM*^(Qj5)$Pa1+ zJGfUUd69GlYB1vpa1W?W^jBIme=TeKQevtx$F?{(9nGNVCWisQJ+|CFW*J;Ch^!Gt zt`Q_Nbp6`+9W#?Kd!Hw=L+-Cl;S+ZAoLwT1+9S&M)9$tMRn6L)MQC z!y~P^7P;otyafBx!cXT}-IrdVm`n+`2dJVOK$Y!P?H|LkaDjw(<@OY&*1|#^Ldd>T z34s`>PUYz36m}H4Uv-%1>_hlRa{Bd}0auZuj5KbCcI?4ovs3`|%9w$=z@n*j-}s$mcifptl$NiTl& z;X?v;Eq~}Px`a5CjX`io4>g}bToUsKeggowmD-ir#^_}xP+yhxGc?qK?rwh>%*SL- z0B;f-DNNQz_p+=v(H8A+z#R!e>T=kj0#nyTnb>A_=Ap~*wWqB!bMLIr*Kjcmgt$~?z;^W1KpmeU{(#uPO zr=4eHFFL$FIZ1On+BOE;YxKoYLk_{W^Tdm$@&wSV7oEM0YC)5p`D5NWFH{w)@u_UV2CNSv$B zDb8aIU8ebm@*b%#q_>yy&rc(j0@W{XX6BEUBX39tkJQY(#_=O7bZnvxSqKG4sJz(3 z*Dyi!4lW7myOdJyC~qbhbspn!f*WO1Fp1M$`kmRFSMt@r(&c@dH$Or)&|1qG(Kinxhng5yIxrTTue4eS`ACvYTa#!%>{ znqWRqw3=87;LpqOFnNky{I;BoPneBBp*F+-Z5}r|@+J@set3Rg$VIqMwMRgjm1H-`^L}wNlZ47~a`h8!MQN;_7xJ&KK!CZgY%5a##o zcg$)3-bw6g_j9%SnXjxfNcFI7_m4ie%0HXYmqvaRc)Oe*wsiUG$w+qUC*DfL9a^_$ zd(l4j7G9<~ZX%`gS(~!R6)aNBmbEY}5UN#l6sJdPhKAA*e0cV7-}BnGh4nG{=OlL? z>AA@au2rdCfzb6CgB5+~Kz2@6ZcdhoP$?TlN+~(k_en1fol{PN%)ix?6L<;V_c4`9 z@096ol|+G`a3rN|kcG-a&lK{xza5m8$8SlOBn?*4G)p%R#Sm6Eryr=1RyyXN7CfI| z*hZ)CNEXuG!Q9Y@L_wG2ih(>6o6gPp$Tshh2e~#*+r4LLONMDdUn_2WCrub^vgYXX zaF|3fg4&M`KeC{Qb&nBL>x{+n9*-B6AH{d(raec^bNphZ!>$4%yGW>CAC_Qr%KLvz zn_YoMIq3`iFxk~I1CTrE4$@mq8iRV{x>_Q#jTT^dx7Snb@qhmdy$2h8sq!1m-wQWk ztD|yzl?{%e^q>tc};?(VMS8wFn&&V~IEk4*5U*Og<=)Lek-c3yKtQ3N~c0e+&wCnaC znIOYb)iOr7y^o5$~N|KqqAiI>|M4t1eJkEVb4 zq)s&n{9g`MU>N%+Jfz@NpB1|~xuz-RkC0ip6}xN}%Us$(dhZB{8J2`h&`(9sg}2VI7lE6r6ii`N`e_wSsnti#GO-9SZPYq%G*&Y@*?LwQa_6ud0c`JnCNRKQjJ zt+SK|ljD~3-SLW|!sE_(h~Wgf7ITorGF4u|Inx@|iQQ2`gY4V*0lsx|k)ZGN9KQsl zE8cRREemt-%_R`ojP#|2YXhV-{zVJ;u7tCCaWHh1atqtpU z4*4*0H#pa(F~8NX&((0--)mwV{7;y!NHr-)wkXXsE5ziPmF>Bathb3Nt>fj;`S70X z9zRNwn1osgzglp-5!p~uA4@lK__aKizK?>@<)mQ)beYRMh^ulN56|#Wal6oxa;Wwd zTCRmyp&^4C&T$ftX8juJn`OCO7;K6rZOS^cE>q)WH#q3GzgH4zt!j;L1!=9hYw}un zw6!j_5c=4B{UXR$+MYlQKa6G%x`d^lkj|9W)E>i(Hr4cD63sBZIfE6MRfWhq-h^n? z@5}M(#SlbjC%X_+r1vU%l>Ih#!)MvNkF7}2y1JNkHNYmlS(DZ!E4n94y1rOx={5^T z|JuB5d8cQ8u5(HdJHs!407_EzAY=8ft-3S#8>4X6qzLcp4dsO8#T{>#9@kCGIZjtt zyQAIDtX*;ket+Z-z{_Z4UL@Y>80_k$lkCdUa$*nJ;IWC?{E0w@^ZQ=6AVFuk+m6O1 zhGDI_M?>;ce`<=r6gfWQk@lI%M$+si(oBwn9K=iK%P&$mr;|?th3aU5WtQ#w`vIng zQ0)X`ju^3RV+2kq$2^i(_$8uBBU=i(pm~Ci@dLI#R{R8@tA(T)DR`IT&oOQ(hYQMSMn-05}sAOl^ViA zVnjpHT9uU#R5tbHJ3C9@tnnV=gcN)^&$sPTm|Inz6A+yf5}kWWt$ui|3!NH}k_Cp% z{?6>a|JA$Cs3ZRf{)fxa<)s-)Vw9dJ)V=v;KK-ZR^$YCx&2QnsPgJog?`_sG0(XK& zXYcM`pJ3lTn4F`~gM=WwTo)VIw`zQv?P-{uD4QW=b>;5V&Sx~PRj9?O-gE$FtZ$Tq z{dg*c!{rwFDgh`7vSu4p7ECESllgN)w)1S8h&d^;=pnmrB?fm)wfI?BMb*P1NnPgA zhV)f9zxl^P%`Ntu?29J>_Qqen@C*0qY1Jzc_q(4QS;Icg*<^m6sm1Gvycy2=s?!Sf zJ$rW!T5Pw*`X`cymG?w0_?q?I$d{ht>IB-`;Ku}Kt;Z${MOulDc+aQgMwd$_^eO&{ zDHip&9{WVT+nlfBmN}Hi>IB;Z2*2%(8v4YKX$pz)dP=R&LlhRKb44a0TL|;$COu+G z2`ZcI00m=*Q=<2V$7}#F7RJqIjf%gK(`EuZ`|QPwC(n;B2N_H2%IO;V_)?+x$6$BA z`bs&&GH(JenBUOFg&q1z=n_|NUfAx>(~Q%Q7tx^n#$+;QEq)*7V$)k-uxje>e>vd3>#C<9|o3ZyUG>$fWeZ=vd?#slS`Bv(d z3y75IgTSW#hVi_FYsC@sVUd+b?ERuQGS8dN5aP}^#{$dquOnZx_ zErYS+)#QlUn2rvrH9l2>kRn|IFGJD>398?m*oYe{V>gx*cbAOZ-v54);k>yk=ch<= z4)_j+C}=)GcRVYULW8Md6v$G>iWmiOvt&##LceiFfzT*_2C%dzHknLPL`e?(Nq>)I zFMM8E8;FDgmJjPXeOoKw3eI@wwNyCAO7@u#JuIS%q zeKD=C4zVN6`*$UtXOWw#xg`yeG$`l&v!VI}Rdr~YLx*Ya!$p~2!b1D zC1#bAb&blPF@MWUY0OrK_tEY*@6{03=e@t4hCv~g0wPhCB)>c5W~`g4|AEJpw(WkZ zz5iyb5Y}wokg7kSbS`Zxa;>x>?V6XFKt4$KKu)f_Dw1+JqA@yzdl_6b6u^o3kVt&L zD3*uSob%mVuQW7X?Y-;vk(hoRZ|LjZdJ`A1(z-BQCf=`Q<=h?baUZ_G7qwU$@P700 z0{`&s5@9GIdAQ+L^D6*y?K zNb!Q%)mjie7viq^Rw(l1eqK~g_?3t(!NtL5stDSXHDh;@WG!1SX>2O@?`Q8h{aF1d z?y%5tFsiOuSGcl+}I;H)h0e%5s?npdeo{M&B!4Oym@}_kYcdJfXg8Z zLWr3#RHhGtcea~$E*`p)o^m#p>Q;;ufUahYvgfn~)=Am2k8L&Nrmnif#H4Tuchm1| z3C3#M(wJs@#VnWFNG9SID>N|!nOQlx8HH056XOkZx^o})IL)2B?1EGampk|f{GZmY z&FKU(a+;7R1&*V|C@9KiY&6jB&r$zzR$_cVSTx1P1aiu0~Aot}!m?|knD+%`E_MmyWzZDhtXDuqimn$;y z=|DbhBB#6}oAQPPEkyJ@i-J)Wa$bu~*-49C(9bGk&%(ii65A}b|KZ$s4e>+|j^LLS8SG*NbZItS)c{Y=pFB?!j^J;&uU#eK{zhc0HN-q$_XF}@b(j$E zrRm%xvl1=1P!H-X%-6%0ieBA}r{_PCgB${wtYqIo_Vni}5_M$GA|@Bx*$Xyfhjm~L z;4E`yJ!tr+B?|m!2rEx1Z8vPXA*ts>UKd^oqeMa6I&Y2`!wtn5@b^@p-WHL z^wHUGH1PmMEK-i-pJkRfM7l`Q@?$n;P!|tPZx5KL#=5AFCq;25YgZ$Eqv^fD=Z`aD zBDgAvQu)R|Q`<$^pFc)}@*h-vYwY7BCl1Kt*ybc@T(8z1u-nHX;PZIr=C1@KtIy7y zi42-SZ5{9 z@0#AB-?k~l_+5tiFyvs%vvJqDUJK!rFj#5K)|_tiLXLP3omjh{dnO@AkEfhlhx^ilZ~JHc@UNAF4` zNY`JGV_-conMF!q{i|2IrUE}8BtBo@6Viv9@J{4UV7AY4e~f>9SO?Ts4RZSsa$iPJzZoj;=0rwPk$086vIqVD8Tp4uT|+ zU0DV-B>JZ$#vkx+_n3T|$|lhX_MxExD5*w>S%~+qLhy4F!z=sh{5&v4>oN1xH>HhM zg_Eg%P$41uOjZTnQhdbrA3~15Gdu&f3kbP*yZG6(iE|LbZF+q0n)9Ww6?<<~!y?zX zGG4_VwR`TnVJBQ7=0BI6PVpw7x(2(b{zrtP>eagwoQNL{w$q#Xqgd|O=)KD_wb#SC zYN?tf71AQ#`ot&YhLf6t5$f)G>g_T^NVG8qMuIp z98iqET$4TdbJ7}Ph7e5@amtq>*;MuA)L1zx8JZ??Ihvav@AHXlK6L(w&ws)c=ttJ3 z2th=e5IANSc6B|cMSzi#c#xNRNgyyq$LUW}eX4k^NiX&n3nLBtlaWl`h2Pa5U6dL} zECEjYT5iFbfY?U7xy!8(BD7?|%sM1z^r~a7QL1~5YumEzzjppC17J*C*dWl*R?^xo zf~*9_^3GbxiG$dFf!@?ZcH+p`pPH&NYQ=Se-*sZ8es3D>Z!m}u$-e$kaAymhkm*Y_ zc3gkNzNv)!YKWUYtV#c@47{#T*`iR{nWbXNb#BBx!ZoQo!4he;cw!Z7q2OX_|E-c4 zPh~lf1=}`G)EIO4-*;V9N9_jm5H1X)swCdgygxaR7lAHVNf(R;6i5pS7!U%r`TIIU zuUGaCI~L~LVyLQhW)3eY;9i*r}Hboy@RFUWO_2WVBIIh-) z?JxR5Y~%&eutv(?A=Yh32+REWfhfV-e`Hcg?$o{Q`rp;gNr7J*ZLxP8LG$19Qg9gT zQU8qT6to>#Z(J)wA#C&I&!YXq{1>Y2EQs=Bz42xji-w%C%1_~Q@0)h9+0c(yJ+s$K zzO3#M))n)iZnk;Shu^9#3;-73e2bai7Wj&Vxh#<3S3l@CY5l2}@E6}@{v6ClKS1dW zE;&T~_2zBu;o|2olZQb<>EeAE>s>km3o~`4&FX>7wL8th%0-$DhgiN7%}gV?BxeliaT_b=k@HO@hcq(S=r(zG8v0PJ)^o*8uFw)J!9+Bfup~%O}b( z1NRF#Z{f|W`o=0%UM3zJA)X3+-k;1UC?Pviov=$%ti(}#EfrQrZuQ8|7{)vH>aU=4 zcbEOfo6~7=@ehqc@1qjF{*l@-?}Ik~yK;?Lwq7-GIl3L5|UZDJvYnB4cB11l%#pR`dN34tU|vONEf_hRUJ zW>?>)aK3&1MDT$nzZ3=M;rNyF|1Mmahj7N>K4jCMTN`HEQfVo#Bg9sm2CS!m0tq~~ zR;7QKVTjhRNuL$BGG5eQ>Teg z>58S-k7XS!t;mxS7X(J`P(41?CUUe#_*9|_yQs4rSlc>}&wGkhGW zTLk3p(uVa;&z>bF=WZtF&ffM0`)Z1!8Nu3`@N{q@Fhw0yWi(9vb%eQZA7DFtA>n&W z7vq3mx4mc{+H!$U(08$@(gZZGIA!XUjJKqX!VR@E8(;pDoZz5>v&0qm?WBbBWB?+g z1IL{Z92fO{>=)6kVMaS?du*oFhX5uoJwKBp`b;AMQg*L0>|*G9Z-SI!yTJiAb^VnL z5&`Sio2Wjh+#!bfuWefU*l;~wlZkmF|Af~1;P^FI_w;Y)&lh6*u<_QVkM#P1-l6Ab z#lo0LVd%vVW%Z>L;>0~zPV=!t7w3hf>lfkv%R!53EYV3fb~uwfji`ttW$PuozOyhK zM-1-kbxK{*zgGQPW=a)nvOKx?`CaBaIq}E8R~~0Wq&%p+<%g~3>2Lx~o>x9@Dr000 zNI=oI(;qkqiZj1ZNQTggqs)IemHC1jCNmEvzp}@4{UKeVoSUe+C!MRkk+Lz3OtYC5 zgF-P|)%jB?jq|Si_5ah2LjRbg^sbg9+Ep!msz}uG?q75Qfd5NWE>6bl2EMJ4@E=RD zYOnVBmJWzAQ2#G@0f+t?JeTiEBv>MZz|t);EHUrVD2>XP=F1F##$n77w|R-}8%4FUOZ)27m`FrJ`+!LnW3?6?Pa<%~^E^ zKg=!-|D=8?ccJUX4)$jin}`cJ_2~KglAOu2)^0MJ9&#I?myBJ2g6mraFhW6XhpA)0 z8xXmO^@vEYM7&I7Rd23!%nWgcFvV`n%pi@aX6^oG9H2tH3_0kXtmIxsL zze@1Ogu1bVg0{K5mKpdL5B{pSqG5bR-T1Pak*umAI9o0$>t9mRy9l_hd*Ry6^H*=2 zzp8UiQTwcd)){%t({dW8uc)88takFU>PcCZ6Ee!jF9DQ}UAzuBdg0p9^H-0YS3G=9 zfz4Tk-_OVc4xN!>bNY(loR!zoxA6x5{6vwzs>nsGM?``p;$;FZVt^}802eo2z~ycp eaNRQl&HfJ}zO{XLb4zgm0000?9s literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-unlock-dialog.png b/corpus/protected-sections/native/observed/onenote-unlock-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..491f9dedee4c0cf8e1f9468d84718f0202fdfd76 GIT binary patch literal 49704 zcmagFbyVA5@Fq-K+}$be?heHriU$u~ytqRNR=hx=#aoJNaEAtWcP;Kx+<622{&x5M zW6z$$IfUfq&df8<%$=FfCE~rR92zn)G7Jn1nu5Hv1`Ny_3K*Ez0L0hOckpoW=wVd+-qTxk@XY|RETS@ zD|^}OKGD$F&r!l+zlN3n^hMNyIs~@2^;juic(>$T?=W5JQ(@83-hAW4u3JLU#+C1K z{hR)s_REoQ{K@=Bl1Bd@moC2kzQL?j|Lyt@9fdGg6XM z623}Oz@2_2t-c6FTqpl-5n1RlFQ_U@SN0RL?ho;7x0&3Dlfm9n?WDGFPm)j+k0fw7 z7r-?3`b8ybZXd|Fv~ETk`LC#nW&4J|`{iwy--k1wPJn8y{&$xn;!nzNRceflbu!)f z3X4kiTpl)KlhI!@e#!5w-g9&JC)?lL8nC3bq?MtaN}9T8yxm`#8PcMo%4MBUl*?9c3M%-Q{SVFi^aaZhQ#GF*V}SfjXc=>Ct_>x=XWJ~ zRbe8Ed`4dk-hb7V&e@agL3<@#)vJ^P+I+*x#zLp>v3ehR7O~AvXQJHlJvAwFYH7)# zNDQl_nX8n>wY6$uVQnarkJv@J5)KK{Y$FmCRS$ROg#Lojv}JMdzTCtX3I&4GVm;@i z6gO1CXcfjrFV>1;6DD8uw$`O5yl^Qep*p*AcN$N}+a5K$%v+laC6Z&qr_I|?18EMC zK)ZAZ)#aaE#uhVxvCi;p5|KQdd(!;iAG2&T{j%CGl0LRR_HG9$1>6!n!H7XUucv;V=*h+Ka_2NOj`eBtlHI{t zm=SUtBkarN{JA3>BZ}TeNLV;=m@cJ`SyD+8rO?V&e0nI2{})xZ273-Z0bW*&xKi}q zWQ1mCnVGp6bq96aTR~#Hw@LBIrhDzT6aa?@%o0A)1Q6}b7R6`m?AV1?f8X?zr>ANQ z1pAe@UzXax?zF>T{QRc+U1-6#{KKimGH(L)8$WeK&@2_yqtm4Zd`?-MOb{$3;-9el zv+J#GkGIS!Nu=qa%$yt%$qyQtf)Fk*Z3ZLFXm3b@pDU&`(oe165GRskhB!2Y z-~Dk&$3Kg}J*6CCTf_~Kmd4;8CWu@X4bJOf8Tup1~@)B+zlQR<-7}<`#wq z)i7Toq7=$9r4bui04%h;Cg5Q3*u;+n2faIx`{Bb(6DeXZ8UrZrXW%S>{+l_ zc836>{%H^mg|5kKEDL$5K50YJ6>x7weLW-rwQNW}70ptsd6$0dRaE19YgaaGP$&f# z8Yew>mCnXr>onwPvUu}~CA|;2p68&89~jP|!Z(vv9^20QSIxV)+nAG)5({Y~Yk!E368MhPcP;v!Sdg^dt??MPM|@(iT2SKr^OMHh&BY z0KxtZwJ`;&9`21EfxN4%7(0+J7bcDl-+*;K30f((vY>Jdst#wWjVObql&eHZLqu0}&78Hf4hN?yGMa z{K64r%_j*jR>r@ZoKy;FdStiFBY*Msh+W*#uVd9}p;Tn09dBe|sQD>;_loU$O`Qr* z$9=W=9(2+6?1KbZqg=LrcH066peb3D@0TxWDRz&lXbBM!u@MoGjEqd2nmx_H8a=+? zt^kA44H_MCYp|`Idx?>$KW4mhJ&x95jAAV&%VpAGiPMDOyMGMI5DGY2-1Hlzb zV*0~NfWI4Xa|BQW@DBpl*S=Uetvsd#J>XMbeWs0h58Ax4cCv+MZpjzE*($jU1YD{$ z864Ir#_7Papg(Rb!;#0_1azC=Klz<)pSR5A%$EhOBPDMTY<^$h+2IiiQbj6IpZVUP z5^NzPTtL1Y5&Jn7F^a<^aYtQ4Ka(aJsK*uDg`AAmCetf`e}EkCd0i#kOe?OGjMxy+ zVPuCx9B=BOY?!YLSqmI{U(d!U_U$S|D#Gd_Q6oVqBtfb@))RKjdh`;Agnt093bywk zXIXjL9vTJ?-7G{-9Sbbg`}{iiU^)DFzm#>Hbu&ZW7GO0Lb4fCYI$ajHFqCO;m4-F; zV{vdXuaS-$!0A7=I7y0whvUZu&@AONsnUgTwFU2?n}9p{Td_y;MFC)D=}WA^qmQDp zE<~#JeMU5FehSno7#`ncubZAooa#?Y9qo$8D>Y!Nixwn%&FjgwmW(?qy@!5&3kpv~iBr=nfZBIrK- zK5QPoLf@viT5ngcOQy@8tgK8&ZkX!~MbLhO0$}yuQ5ojU0GWRZ7qtpl(!;C(rrczw zLyIS9MZ?hcnGmmvMIL#h&|Um;F&|Tu3of3La}A%SI7Q;4Px*f(KnL$v;NjiF+vBIx z#k;Ib-^Znn{ko&Kzm}Hd8XA^1w{8OsjUMavkDf*>XP#W;I_*5%K?(iZO2>k}vO7I8y-r zm5+R?S#bN-mpXZMPAjdJ=#E1{ghKxoi$LQB>uz)|(1`b8Ik$zw3aKNXG;f6&tsGsc z+~_mK8|n^{Jx`>U@+t>I{bnH}Ghk)>i`r|oR$rQ(45_)$7?aB3ibK9d5PbAA+ZBYfU zn}j$AL(!xEU6?eyY?vIp;G`4ozk*gs&r)|uHHqD0B%@g<0X!?(b*N>mqnBu5sR)i$ zK3@=C?l>$oN~n)rSQT>2-`5o0X-C)iNM!w|kF2R@OhjRo%Tf63D-)ryi+6%%An8J{ zYLN=^USVMw(zEiIEH5a8F*R&>*_oQ|6Iu#i$Z{)^126;E;c|aJU zZ1$O(Ib*C_iaW-v+UMLhigU>K@)On$SoGdD9~MrLEBaF%9I$vp$S82=<+p(DvfUI-Mo+(M*4#jQvY@ox-K+Giic>FMi^paTeBAUBJuLc~qFM zO>L@R%D<6%3Vn&fCfW8W0HJUB|AZM{9O_K^ za@DaBqnrIhroxgTUaf^`*(9SkHa#x=X<#0%($0GFDD094HSc4;58>-A=zgR~=;jAx z-2wuO10ou;E7r#!vmTP~_!nXXHJ8kl?V7WeW;AZeemjd2BJy_9C=Sy663^mp=C@N{L3uu75aVBUid&P zp!T@b`G?khWSEag!YbPM8fQY4g|le8^Uf3g2A2qwEp%cCampE-;qQ>w^7E)NTd6#{ z2K7VpY%UT3s$YRBh8=00mG8jkViuq9S(@(n%877Fk8Fkj6_5D{d?o&0tV&wJR`$3L z*hQ~7wb$dW_Jrbs5EHCVeb3 zNA}IO?e-VHjb3P4hmc(cx?uh}u|BPzdK|g*=@yucql~*WI9_V}E7p``o?YalKk=>H zAn++K24mL2@8g7z&swC{R8d8|cD1jAA8;a%bL=*vY;9-g%AvMxCSae?*E|hY%EZl6 zviEoINiRjI5BCrvzOeOg(aPx&CstSar^>&eFF?fGke($Vo@;qZw1V3G|$y?NtNVgJz}XgWRS-iK4dTt{fq z>btgKew6;Dv@!a7XyT*z9X+9VPBiVR5Ne=&*x$2q+fVHbNP+W`B35HS?_kmm&nbbA z9r?}IqT_MB*J`c3ao2ml*+Ik$TdL^D%j8F+yG+e(Mt!NlyaB@|^yM_)R-xg$$XSB) z*sfNt6ao)f8#3Z-Di?6oMO6@i+}=N0-esLHU;I(+5f^m4f5qsVSwXprJz@T)j8M!|w~ps9z)h%7WU?_x7v%PhtqZ_p;$@_fIf_ zXc!WhA+f(Jd}@k?C$UWwSn!6x5&3vs!>b_tvr4a68lPzJ#to_-HVe?uC>-rfR zgrVWPbkD^mhn|N84-J7szb~c>u@$Q5=7%$}mX|<>+0#+0@HYFU({Dq!)Xe-P-dgN{ z1FMp(fK&cPC z0|Ov)AJ9|TS$6b3ZIRI%8xg;%*qGk@@Mgj2?c&kxA9TtS+4koo#HRg-~+GDw*gD9!&0pi%?m5gQ>(4 z@<4%&p^yxsH6+~7A=&Uu;z!?I5>KBgRhXWw#vrqpaD{vFpbk z_5<~>4k=7n(++`TS`YW|Mir?E=$ZPu$&3$J;i}tNmRI(38et+b`iW6<$mgTXZ!eSM zo<-5e%89d8qs+L2Qy+`EnO{v;B72qFS!Z1OsD#I;;O83i|*fT#d!o&xsQa=>yzZ%#*4oLYSeht`txLPbA1ebFgG7$J zZLc1!7e#sw=P$1u46;7X-U>i6n>VgQ*30NK`hIobpsNOYx;!>b90l561@u4s;m&~@ z3070TPTd0$vJQkKtb@JRMX_BmJvn<=e9DY)!VmDF`M{ z_EVVa?q6C?^PC1Uh1V;cFw4b?)E)m3V1LTLycTcS9_9AM5MTG-&~tJ*>2+OxwSEOB zqIM#v=;i!0Mo`#8&F*s-b2Tr%JmJ|q^OK+jL+#`;(D^uMThzb1=`Q+emVY?|{N#<% zM$mkzi6AOJ^k!YOk8z{Z+zqA2csB4Hjy&?O*sFB~b}=o_5ue1eJ{WY-mT%7#CZ*{} z6ZM#S-%|QgmqwpV^3({!X&?WetAALw?tt7wFVXpi8|xbJa*7CJD%w^BWBIoQPUc9G`Ul!8mf#caB=!m^GSsC zzPuyfL{Ks_tW{Bf_;S7iJoCEUSRDUvcg1J^I2mQ3x15X|r={y5pX=UGuZX?p>z^L!Cir_w4RO?fwzxByPFKVAdv)B zg&7MN3qr_~h;o>8X2Pn(zu~s}dj^Q&cWnHN>AuhWuc=p1BhztlFQy}Q>eMp5x3y4B zT|N$OByt{SM*6c0JU;xnX3Sq-#!&d~BD5O(rAku@J1?PUGz3FxIDk-*A{6%F*Q=so zn?_7UU35zNgo$-=fsA*&?x{Q^O2mOzZY)z{h1|#KG)9T9q*aiqg8!XA|JAVBKMGn& zn@;b0IIZ)gJKG3SPmBTWcc#|)A@l*50Y|}~T{Wo_#G*x>)F*G^s1n3tMV_23PU+Pd zC$crgVp@N5JfN+JX8&7vH^D@TS0SMobJmdwLC!% z^*Gt?S2q>-kCzV|T!dUST;Q{;&i}^!>hBAju=4x^F5B~+8M8Wbl%pCrSTEP|D+uy? zjHm`bt39xY9lD+pe!KKGydAu*PWijbjlAm)C&cS9w*{L<$B{4pWVR~o=>18t9#8M{TY)`!%E z#v?alU3lJ@(tN7n_6q2dPw~NKu*F4rlngwo3!}@+{`t8N+gsBMXu3%fXEh7FXr=V4 z02mkw-!Q+iHw+mbuP0H3^xh zIqz}4?;}zVm0b3krfNth>dj&vDiUgJSkh}4cm%|0`9XG3qdMPq9x}ErAxSfTxseea z+hh&6;%%n;XP_9j5p_`juPf?ML01@d@LZZ^-o|Vn+PR+PlADBe zwS0E7#mg^KThmpI@_w?h>Ke{uuQ+Iy>QMne$cw`QH@V@2Q_?fd$8q?W6K1uh?j9Zi zN4oFOb@)6k?``L52+c?!^Uap~TNefhXK|T`I@%9IujqOtYG&Jhu;=4S4;}6^Uhvzc zI_k`*$GYEZX=!>a$F#Ta@9zFa<*%$tJ3|hZ8U}L*(o3$px$Az`H)@)m8z1-HRP;4z z@TvJ#TXv%*EkcR{^ZPeWNkD&?n~&31=U1&*=Tv~gq{aDuOqOA|Q|n3}ry*oWc3i|= z{lq$UaoWyT++;l`L(H!tAN1_00n9T_MhyWM{o2I{htDcnF2%h16wl;5*REM2y&x~B z1N>lUZ8H}$ShD|3BgnhAsZ&VDOWDQ8!`avODv6ow8+)Arnjl#$91L)k9ZQ2*r5(d| zT{8J`UB5a~-oG(C1kB9^!a)_YaA6#zcsoOr(H8Beat3b>8V%d5!E zt!ii}&B7ci8sp7E4mW=V)0wt-5kP^BSk(K}yww0VLnb|i@5~h0*}n72kb1`mtc;6F zMu^bvAmJyNzWP@+-o8g`ozy%bogcdyXm+E@qs16JnZ=G@B11*_mAIc>v>_=5XNJbV zl{L2_H*wzW!d1=EoL*4!N9^Zh#GzU3IEO1BR#WQ5MZ2EK@Y@h^A1c6RBZ<`*S$a7E z>>X^8eHPG*(KOCBz=D`n79sA?bZ<~Fk2ybaBU=JWjOw=S$I(Ht2(Oa?A z3uY_4C_mMsr1x`3ZO+-!cH&(-CHqvh%!HQlV>30@s=sZB)b)`}k+xo#OGsNN{bjkP zC>GX)R#8$hi_M;ot*xdbBtlbNw~t)b)j(6Tc(Y^yEORPgg8-$$2fhndNsn+$>)|l| z-HwGc*6;7QxErWA$EX&+cc$R&tAGKa9HgsPjwdL)H>^j}Sf0y+AE&ZCl=+W_-4z>A z82#5!lB+{ge9G$y>gDe-Iy;H8zxFKc7M9qg*YkWeb$!Pf#E3wXOtf8n&1tDC%7@D$ zTM7>;OGN`|>-a8_c4ntn(PqgC71z>zk-XGd6C0E`Wva;4-}*zX3Hyx0nXQPL01a)%$Fd`@RN3@GjpTd#IJqv;9_A2LtUGor z-0$A*NeAL{bPAnU>sXg(P2!-gyW6ynn`OF?@v9kn2p6|V$ACW$%WCr7+hD}Man9R` zEOWt@TmDt{5${EUyXL1ne`YyF(!{a6;kuMbL)^o1{g6%couMbBNf;+^= z$WKMyWte$Ae2RE=(&S;>O^WM5LulaSMxW2KxgjT;QCjFwR_?T$q+L7{-;+C_8{ZQe z74WrWV%AH=U;(!0HISxbWh1j+8_feQ=4xyx;Hy$OM1c(}6`y7G)wBo;E{lhToC}`X zA6rq4v_SzmuYCDh^Gauw)-L+_&Xs{W#5-012y5{t0mAlmT-s{eB5m!yhpxG~wV9Qk znU%k_Qhs4Wv9UP`gv$0}H9GEJ+Ku1xDbFGODK^L7vpY}~yYpS{cIsfLNan7p{A>UU z&gMa{UXkd}W@DC;X#^%W{>fty?b*ia8g@vg0%_fFt}A80--Pz_6X5Hd}TD<|q&U@dJYq*k6$ zQR7te4!OIt^8Nhz3d)Pmvdw))^@-t4EL}#tJj(!ylU=r1SSM95O-o3d%S;;dS;%Je zuT9o_qH=jJ!2@HL$6B{Sj~w(-Lv* ztGJV0)h@Z@C*G3q+$*lMWH16qGJ(8C4!W?>Ks?(r14%9iEv*#!k!DekGyEG1Zg$Is z!cNP+U=T8se=srkl$+QY?9{ES;5xw6c_uqs*w?x|+}8Hmxv|-^!uGH6di**%N`t23 z2Ca)lQ7|8qkon)qlNRM0uWPN2-Pb!4qL-;3cEiyl)(X?*Dn) z#Jo5g>iqu*H%+Xsk=*@8QTkSXF}08sBl#FG+eRCTq$A;8Cur7;%Jv7(On|UbC3imA zvLLZWq2_~0Em(ObO{LWLty|@j zb#QM~L*}N-e565Bd5DCNeqGP2q>0$C`vB*)_v$*XEsAoa%(b*M)g7cqZ;KdBAH(t= z({|_Rwh+A)YDSMZ>RP)U``Z~czX#_WQ~-bekPKh2lClerC>tw}Trf3BAcZ%`Q$7D^ zj!?_7WT7&lYr&bpS)r05h=uhxN&A9WrHaO6@HSE;K**oY`~KvYOlAn1Y&Lv-FlQkh^ zbj}y=TL`wSMY89vGb2UU>iX&%uUd*%5wEnD8^YjkpaI-bxV0)drSO#LpTteG9$_!H z_zDI7nEdjsHS1}M3b88zn}oHSo2IOXw3nZZrIEXP;wPf45i?{>@%s?QX6_q*XWm!5 zyx$_sGZ2H#UvYpw0Vy9MKyb|Yl>=tgzT59jbQaP~Zy33<0ShXm%px?Gwxbaqz*iYq z@iEorNxGATQz{9{nfF13-)P2c*>&xp^?Eb~1wcNK3I$@@JZ>8nHZTLr0ZK9&<8@&e zchkl05h8QF@B-d(jtXa(uEr4Qt(rPpZn|r0$M6NYv(%JH+*?D-WUFh0uqP13blCj^ zn2sA3M7yhTF~rK^uAD{MmfQBi>d5{j7X&7Yq-;(?>g zhxDqvd6w8cOiX2r%*9nmP}4grUQ3xp^-m=PWa|5VqeHj9j9QZz6(*)3N2wCF>R5T5_dCzJgE6R3nBiI_s7X!E4x z={eXI^NiR&CI-5|L>L&LK|Q(OJ7-LH%GXjnVZBi0DKS~fj1I;9Y_pysL<4$S&`Hlu zkUp+>&bpVk4P*v4wcNv|4;3^4COH!tzN}~f)IG1IX`EGng5d~1RGxl+{F}u91A_{? z!HvZLx5nYP9R7I_GneQ!#OzSSyWzmksV3@6mJQz!Z!D+=wKj1Zz!ZnPbDNo8M++!y~A&V zlRPlmi8HV313s*h9%?O+b3b_ST-!#57mMYm(U`4_g0`%=pO2KGzQ4UK86}-I0`!Zh zy5BK`PYdP5?t1Ad%=Mur#^$~clLQm9*}28wP1VSpd%hupm>uk$R6wDHwy7McUCu0s z$q9t7A>-v3IyNYZ{SR+CQg)fGjw0_xr>1$I+h%Ig(;&h${T_D~Wi!So2|O07aA9hI zWm0N$HkT~;^Y^TQhJ^1^s4p$HtqnxTwIa-!#kQ1V8=0=+YbYKlX_XVAb(sgC0}R5K zEVgUtgA0~)rAH!iq`=VKKk4g(vlEKV*`~U4r=T~T234U7X%HR|l{DrRmjE|62)IE> zUwxBy1moQhp&c{KdnFVdFAYnrNIE+09%VDm;t))hTn<=}wx*hYC^*M(2pPXhj4*2% z=6@7IR$_@$*6A@UqRomMWTJ#sk~miaD@y8Kx<`D$D_J`&I%uY%de#l<0B4&EOctn+ zAIbP7U#fDkwu^@iOH6f;CMx@jc!vau1gEBkb_G)@2@rvqkBB;92o73|#>~OYJNd>$ z$Y@OiaXvcaayNZWX+57L?s6UNGUJ+yu-M8hZ@UF2f|Cr{@JSZ zeeP>Yvcf@8Q%jl%c46a~b8ryp)$%@CPXft6tG=N+Bfv2bUSd%&@Oes7 zQw_|BWQC$JbL={@F$6TSX>Lc>neVEOOh9fm&n?v{)bg-NAMtgu_-R);)%cFTKrL{d zNCI_^&hrI$Ao4FDtuE9Xsd^I4O!U-p2DzoBWtMRJW~VY{x~PU3sbWesLY-ltTyfEH z>z}qdA2#0a4~$k?Jxuc!*GfJ+8zz(zpXF39J1&B(AVLNRq{pnZwU=>y+JuZNMA^wy-pEP$K?)7c*>2uW;8NE zDu18gZZQs5!yOgJ=w66UmoUcCrA*A;Qfhs|UsB~lV8f?#jTKLc%x-s25JhL?#%J{% z)OS6wTX(_VUsz%vkpr}}wm>;3Dz1r|o!Yz|NB~*Zjs{S6W{j6(dbYfc&#%JglEmMw z8UqC93giwt1VNr&jO*M@Jtl8#*gF~Ub@L-sbOF| zaxTd2|7w1*3oY)I=d{J)qFN;0{M(ckx~T`JO0$4GtWy413NA~3vR1KFeIqp>-`tJK zp~kp$G44b}Ve!W+b4_?kZbrbVKG9dVlGZusIM^xBV!Z5@5wK?B-~INP>A&ISk?|`S z%78V-HkNtiw#9ZTDEPwR7KU9oB@^l>p!6=tl*d}A2qOg9d8Qms<1o#H3iqU`TVZ@xNF?hD+@PhXuRZ+##hSmgZ@d;Z89syT-J*hU}%jz&223s7% zQE7nx8L!d0wu6yoZeCeI2@^BHOPI+6Wx?N@j3eTcfa;zf3Foe;595G^!QaYJ+4x0R z;{elX<`OS*lsISs2PzA+M7G5oEX4iC$-4d6C8(a6>gwW`>Hm_~ZA=a@UTtvWe)=n@ zma-0El=&eYlKLlL?BslH*;p5e5<1y~`9%8;{1qLmWIEu>(Qt#Dl#A2Fewu+>jP3`> zI9`&r)h7NwrgK8G(u5jhkK`qOe`8Ys6cJuD?nOsT9^Z`v<~FGTund>`?YpV;@Uz2S zLi7Ovl7NZRLYZNso=8RruJpws;9gW@c?A_?PXQQ^ zocsrO*z;D}AlmyF>-$-5=vF|bX9uiM!9rhKAV3ZJkA44t>F6)&y}m+ZkMe7W$0)BPlOY(#Qhp8(S2CNRc+q$Fem(5 zWPoPcS?o9+USl=blKeQOwt(??`;dUKT^9aAq3LH7l81o}M}j;4JePE$mNLyuyeCp? z+TUUW<(v1`Dlp1tLX8FZE^PO7zp)SLt^WB3&+VIMYM8+#e zHDa!5XYf*X77JD9?+=fR(+=r_mk-yS4s{%aX&iIPc5NLxEMv+lvKwo`)l}U1FfY{m z4COUh6l~N3zNyl@ZnSR3+!Nd1q7PYpoyFOgDvmShvFDkFiPxc*2Lxxj$G0`MC@pkkkL-u!d0<<1kPhd^Vj9r&oUrrnsM7p*IE;GZvKnkN)srMb|dE8MWa+g;BzUWB7tAoQ{nl$>Df=Q!#>onEG{fUaaP^9h*E zZ=jrTQ4Qp}*ms|3tyoy|K>ervGmoL#*VrD)j(qwsUEGgqtc`hTW6ZFrt(Py>CvfAe zKPq=Ttml6p`Jj~8_Akf0INN_A*s{BrjqK^9y`r%16}fV1!@oWMm#%%4Nyc*KgI?O> zs~Ff1`81?{PgA>5Gu?szBJLj}YY_&bb-Qj_396o!pm?(fo-ZLBmA9P?i~Mgsn(v}c zd!huKpnm3C*N$IKq`qv$*}AwqJ01yqTymlz33|aZ`G4>fB6fZJJPLK(Zc8Ml;@P>d zt8&dhvb_X3O9muW_;~-D_^o66q?1WHSJuh>-C3sZ74w>gT8pUfqJhcd`Vf1jm-*I; z@k2C+YlY|wtUDOb(N_qZgZ-x&67yzoevfNXxE^9b3mzJhH_icKv%!8kDX0zWcXj*W(Lh%a(|Cj|QQBmvt@NR+#HMHzn|Od1&2kDYch5&sLEFeVH}<`jx`9S6 zb8%VuD38_@kM@3Q&BZr6lFwx|Jcg~)ZZ(H4N_SJ!!*+*84jD@hWJ}WE{-SDHOKm|o z+QJmUf0-Q>O4I^C6EP2jsdN%INoQ+=z@-1vi{r7MRaOVvlCWXK0`a~TqbM=CoJO(b zTEBD$Fwe)RIc`bn?G^;9B)hT*lyG_=LIu#nWZ_`(#+SfN;56^P{~H%bdKzf?iSQZD zUE=a-KFp>@Lrs2pkoJ3x6kV<46iqKqG!R@E$p+4T&5UtWOw81-n>D#X)!OR^gWGdsw`4AsBDnE{{R;m%w6lO+ zPANP=LyK>ck#vkriLgq}5Bw1E2~|bz4yuGQhUpujWwJ|lgYV#XPN~OoY#{WQ&4BhA zr;Q4U)7>OiVD#Y(jy|z5E=d1yJ}mR51|2L4D#>TyQoXbJQ;H3xKzm7G>(i~MxdVz#V)dYLZ$&rTskO+)6Voers7{>7$+9!Eau6XNyYb`? z>)5MZF^O9@65!wRp?+K!=jYemxIyvV_u6F@jNYkv=nInbG_2f4e$dMf&SG~>$W`|L z?fMhCS@b`3li7UMbM&BB{*vn5$J1d@z9B;KyM`bpo7iI!+6)@+Df=)H3AK(Z8Gh!#gMoGe>35RN7}IKDfbybgy* zkEfzzDi>k(nE z|C!In3acaw^|NZ56}aT?xxzwKB7_L}l!4UF{qUf}M@c4WJa{6mw__aW^CYq#j_qaA zC?A~$*2cr4%L5jTmnLl@jGUd`O%Lwd>O5)#ICY}Ax_!KaZdLY4Oj zCio|D+V&qbWY8e24ZYuPzb&anR^cf)Eyibq+bLn&3{QYgIp%tUY&dSR z(0_c=N$ip=v1X3zwkTBkn(kcR}+K(Q|1Boe69#<-G#I z$?`=5Ga3svajsgN6PpsF{{Cr>8FLd9`XjpTTsmMob@gfuIlUwnC!K2QN5SJcjJUJP ztMdr0WB0mBJl1sU*OXT=WI-#6VyUp`)pK-2d`2HS?;PBt1T=(6| zrCP7Acqil51_*>!>kVKCO2%s9^+xb$`R{$TCM1NIv2WbD{Ff^N*s%0H)8G-ODbx!K z*$XE_>2OKWheQYyoT=#8^XnT6vULm$On%uBp01*CLs8Dq@1PF|vR%&O&cn#0)L1*P z_3Cqvv4wED;^oAh>pxY&1iG$|tsnEL)zGz$h*oYImv`A8_iyeeHC6Vf-9v8*Th_Gj zSM_D!`jjfaBr;62q7!%FtG{j1_lY7x%6H$Z^(;UCP&Q5yiU&bq<};RO{4ZTR@iiFS zKqnH@pK#&D!c^qPFD62$Z-%5&knotrf3ZKv4pHFRD_Vc;aT2>NwoWJTW8RH5(5 zr9fC_p3-EscFC#xAx628Bv+kPd*l4?>31Lpi|bA-9t?zB9v;;WAi<`>*c+i<6!4oGKOgmUcqB8Ht}JqAyY zuPp-aEXpr+YqeTWH-l34sd3mh4R!z#Wpn{i4vK$)2f^S_u$3Roqr z=oO?B$fYZ-Jd>31^mF!<4!DXaIqE1}f(Y`@nhYYc*EcW}ob7*#O+gSAJGBYysdC6x zS~y!U$ht1P-Hp5QJ0x_a{56_TBiV(BKe0ak=RSz=6A~n{-v*XChT1t)-0|;CKxxxU z(UHP-NgjRsCw|+w&AQ~jG9)EEP87iPk6DrQ3{3lHNkQReOl--XG~YaX@Z7^U-4QH3 z?(#i+={*s0NZ|G@hKCyDgv8GFuRogH8N79PnqRt1ciqRiEX8nWyv%p1%uGKxaAwK< zQ80Nbdh9ci-5e?UK_3jCagQ@V_YuzSlPT=JvLg-*@@A>X;D6_0Fi=KD1`ZBRP*_+B zY|(X2D@Tf+M~h#R$-W=UxQ9M;D3&?qe}Y|;>wh)p7|v}(FjZH+^2l3$v<=rIY<*oD z_-9G1ujMeSX+G24*57Zxrh=sW!C7S>kj1HCd#OWB<*earvbuV11=y|%q)l4=HD!it z@GoK>^x5`}d;Rx<-x=cTw&}+CJ1m0gEZ?oD2bu$9=&6%HTAdJc*-%gf zD{Envt8(p8PZuu34lt;7?`$_Jn}9kIW4?7D>exS8!r=DXVX_E5pO`Hu(ZTKL-nuOnp%T|U0Zp{F*L}KfgjNE0&xA1L`jGQ)(oy76OfU*U_ zvIVvx=G;9G4DrW8e&gBY+Z?HVYLA&CqZyZx{^S*w7M~f6Ay3wVw!4MYrtRXuJM}^G zZYO1BMK;#*%ABj^E1-fvj2HaC_=Us~)ep|HzPwBQ6fBl8##tdj-Rm=X``xg>4sJNqMWjB%s-g8rBXI@pJF3z07F*SPUti&h;;^tVQQu3VlXivnAPbmc(8|zWjZSyCxBnk^Zy6QW*0qTy1WC}~4#9&5 z2(H1M;DuKR5?c!QG{BckNA1&Utyi`}OFr`}VlwcK>0FV(eOb z&AFcWtZ8c%lD8nN9gEj$oMYm}&jp=;qM35YLE)aAgGXA*_9l?>hf8bd#6NLr=O4(| zDZ6kKHwvPfhUDWic+W%7-Q^T&yc~^rC=`A!J3m=|t=~p{Ch!#J6in6)q?Il2W9^Li z8NrM8AW3Wr5IZ}&els~Uv4Cp~c7AYUxi=W)bx%SXE?2uFwf*+@y*Yx}a*q5hi9uX= zy{So_yAL!JAl{{-JKh_gH~Q*;4Y{0gjyeqFRbAzU)i(B$o`{`h4-84jH98Iq3o@4R z#>FLRdS%CR>>>qEakb^8O zEnBnkny1RmqJi2A8d4f8y~W{I+i?*HJXUfzzAeX>$*+1k#6#uhqR{I!Vm+em^NB3C z67}i4!V#;5>z0(0ceQ52sAX(krjHn&Gl&j)g1bx=sqW7Z&=-}{2{R0LuFKi-LKWqkeVq;_DVz86To*|r! z?Lr~i+8YQw&XUk@R3d04^x!1)6u)6dx&EZ_Rp%{y|6N++t8?GlHxP2oKs~%`uL;%m z?2Tw~IT?~0#ijL};n@TJ$gVFmjV4ETbCA+?_Y}<)R2e0Bp7_DMw8Lm=^KrRuif7m5K*DSb?Mw|1L zPb(TX=1va_D~uB~NvCagno-6ln2{S6r&4kAA$iA9_JAQJv)J3YA4?cZcnD37TFvoT z4^&06MPE`WlYM> zTiJSe+So&*?>Ub6Wh6ZC1TVeW(&hv3__ zh7N?zEYAJfx~F!}{j#4o+0hYpcd9(#=~z@>yq`>>pvUd{VA@J22~R$_e*b5l*>a;7 z7zKvC#dMOIUCn=G$sLd zs_d~%^8VGvqn#9wUKGyjpD#`bxvX|goo!ui;`__3Ec239-g29mO{Vv?g>$SnmXkp* zGIG+gM1$R3fi=IL zs*F(O*`Z74Ox5}`O+7x6i>-ibiHYbxXgYoa>1IbU8#C9d8R;LiCPimZA5Tk4dc&~0 z+krnb6U2Yi`vp3G(>{_oLk8l=QYx4w{b^eV)eUHtOB^A$3()rV zxt)#D6YS}EU$4BR1{sb2AuWt2ncL$_P?fjI)?&`hz#M8@OA+N1@ zf6n>TKSf|>*PL68!Nbu}UP}DcC_S}Q{vrthE1}1w+fMZT6R$1Ix^ORb#$+oMp+C5| zWB_GsUIH24U?JJODkb&*JY8NW41veDu;91OUn!e$h)%%cwcaAtow(fFOC-3_;5h-r zv08ut+|{S`=8n60^-Q6t-gu__tnm~XC4kRm*VR&BJGb%J*zfHgf%xFU%jmf$RdX%; z{W#ei-;>@*mm#bxu#{H&4MW^dzwac_0&RAsn9X@h%>hWMJ)uN+X>Yt1@xNMBQ7&g3 z%?mbH|I9pIPS5Y|`?y-)5I)lnWLM$u>rTbukf&6tcCCdkKqaZ-<8O1uFjNu!CEcO5 zEq8406pGpNf~C6-16DV)NT`j3jjLw^mQ~Okc8~Lp62Tz7yD3?Rd5Wxo*7huIS$YPh z7PslEU=)sOwj@JfkNOhzq}jMyNTUiHkNG(fOAd^A(G10ia@yx_)1lhruj$Y|_SYoL z=!mQ%Vpf*Q!TSP>Ghqwb@08(_ST2F^Crzj$+2pVQzlH^-6@y zu6w9nAPW+z7b$Rmqu3D{~p_ffvo3h z8JA6~^zO0Cn-Lx|o!3|LHfmbcc@Zry{`e*0%|q)1WS|!0_A(By!nAKgA6BDYd*7l#=g(cb*XLM)f~-JS)^4F-p)bJ-eawG3+T zJe={8oSyQ0z=F25azeeyjD@MuoRmCgote7(ABd{}$B4|f;$&|ojvhT#ld=acAkzlQ z>Ui=KAN<~ugx(PgejPtdAcFbJO$M4DBh^9Du=M=AXn?{nTcjZAyM$z=LJ;#m{(WM~ zbD)-!-~}8E#xp{uX%-d-|9KNom?F;S2g)w1)jm}C+!we?Kxzj(@#ukn6j^xSKUe&r znc(d=dGuzwmpPsEbbYL?=33aK>zf<6Rok7c_jvEnS48_)!?(qV9z5{Z>|LmSGo0sJEi-X!s zao%g*v`z%oWTvOqWS5cC6s;>cbKF;LF7473oA+??->Z%*y~=Fsj2it&n3G?aL0v3OZ+jTPY`Aitvrp0UqB@_|$82OW zue+(XuE=2)L}FBQnz;SMGBo~2jCDAfbx@fR&{X*IrMli?xe$>|8ol~BR``U@j6!@Xw0i&S6SSMLuhj=iWpGI*LyB3{Zr4^*A1 z8Inc;w8wT?i4bsC+ve3pxk&9mcR4S=wxhMTW1K=oAK+1g=fzI`FYU2q8q&u|F^EGB z1A2f$#|w}@^<8Vpv-T>QAp}ev8X&WwZT7OXBjY8iCQmbamn?3*S_nFaCb?)x%CkS7 z=@&2xQ7>f_P;^rBfx`9`doQ0xV|xi zMl2cqXj#Myj`dp$TH=M-g1+W98szZOD^cejETDYfP}~Fk9D|LP(y!vl1xknip!Egl z#~z3R6c(=Q+|2q;{SvXA8{)MiYCdI1K5asiMMkfOmvii(XFjmZVl0pdXA`?nkV0@Q?9MHu--5;zMKzJcO92S>F5 zqK55BUyRMRTGMQ`JD2$aqw&&B>APXefM^L!W?(HmQj%Pl*}h@7fRJuCyd zOKnmbwK`_GsO(4?!a0etEo`8BuZ>w~Wv{hja1g3lDbVRc{Y?43*hL*y6vksREPGL$ z0De{iGn?}}(5cme8sh4dHN?pqJcK7%!|u6t8${_rZGtR{}* zt&SwsnV7d>4c&-E8kJ=NXgxTUFtR6(8H`WaP6)TA~w{drfU9(tWf=A zK|Tpz>$7Rs-w6evs&DQM9Ja$ReW&A>=*o&1J{L7L;XQLXV}v42k-{lUC~ixRFf#nRiN!IiL=XnNu01jPy$+6gtBH$!E z(BDk*i2P zcn7@JTqc>EGsd@AjU_7pE8@7X>3L#|Cb$}#`Yb%H{X%rau=p&N-R?rJR7G>-c1;yI zeRW@e5TE{QDW}2pV6tz>e-=^%cB}h`qVjzHAiJ8$mNY%PlbE52Mm5mVU>=eJ&Jo4m zL?=5$dGPHQBEZr4o}oJ#?nQ<={l*phrz>K!ODbt?#?tASgHJ z`6RH#CP0zo(QhZ_F_;htfn8ym3E+P}27C|LXjd?wj=g&HyO;uC0Vd+80N$Rs&)lb_CGhVU!;Hm{+mM8kZ`;nkp6Gs z9`NaJ_5Bmh|E-ca-8a3n;pWnvh|kp=H=KskvB^Nb0`(fR$%rLYy7Oil>WEV_Lt>Otu#>k znW@XvU$B9;k0VEjB^c2emfyg#pg#~SrLofFBkSCu^mOL@%A9?vaZX-yVfM)zzv*$(cwqGNhy1s$T3WSBE!TU+&k(yjv3W=b}}~bRdPJO(Q}aO*Cv>d z@3gufB96nG#PG$pYYE<;sg^o=`ZWB+b9ez+hxcsz^pxRISIlLB4Od{stKu3{oI6T~ z6>Q&5&!$vDSe#)p$RkP-B~F($1DuY1Cv~I>g-vR1u2SOn5-ZvLGbip34J&axu=ik!4G(t0Lwpe9(InTy297$9uOpv(gzcHf9Q#A z_S%&NuD=|cWQN0o8ZPP=Zk!7EK(E*irl;R+YJXX*4u_uy?SYIcr{K`mRHm~2c}+BM zZ+a63bhHf=6WZ2OE!$8PFc4cEioOT;9Q5kV-%0_R(v{*t{q3&nK^!f$a#hObmCeEx z9V0i^;`0<=uef%XX9LfTIooY#efX5}s{`k{*!T=rN`j7#L+N?1eM1Idaap1HUb}rEZU14? zQG?7pYj8q=R5PwQ%Qn~lJ7`y=L({xD0V9Uh6z)Q#;#*OrW9{>cdFe$)Gc0;nM)AVK zU$$S>#m~DB8@ng=rjOBJab{mYVo*KdUf?V9ce&+%Nv&uhhcP>j0)aik&IhnBJFTJA zpZu}z7R;iolLbH^mG2+b6LM?NpK%-YJ(Wj~a!?W`H~Q!c<3>dXY1c8l<$Sw-_x<=5|OXig@bpWa_^a})bf7{ ztL-d*UXnTD1SUsCM`VcP3NW2(~1Byg4rWp{X!tD}PXM zkZ3KiNqH7J$=a_dsjIUu7XM4IfQa3r`AlNMnzI3WC3EPTgH7+O#5FVfp-O4-nEpty z$}RBH67RkFx6ct><}*DW8n!98?>o!oi|J2jQp9R5P3oPF`wtDbg$U%z3)#JT%=8Ry z?1ovS2IavDqS=Dq^?rU}Hcvc#n%5tE2F!?R?M)%VCFeCJNw4NqaeFTa>ENNf@CajH z)?DYK)V$Qc5;&l~*P&Js-m9+iAUGFd{^s*9ih1J6e&HlPOq6-6sm~}fn0-Zw=&m(0 zEw(J2)`akfq(X$i&l-tFvdy>-bargMBgx_89}Ils_1I1H`&vjSu%s&9FWxD8u}8^2 z=iM=m0h&N-PaWB$~<%>OJD?)UJBT%1M;uA3yiqvCI*u%H`40ud4b+{M{-~eA)9$Q+ zHYb~wF0Y%JX`r88T7Ezr+$_sF+JsTXRn>HZ5buQk0%B`6!eQ51T1B`x!BV)=KW~~= zB-THVFAQbAZ1z$hsxHHHOR=6OZ6L=#;zuubOg#e!>Q1c{e{Gtz6orjy^2j9jD?Ds{ zz_8!1&_UOnbRjT1UaEzf&vv~q)Btb8ETV!>5%DPPq7(Z}z7B;tw8gw(DpLKdu*3ZHA? zQ77Zow`C0qhquoJgzDl^j+jNZ9nna56x>FLbKb*6t6k$_IJH+omJNT-h10@CK{ALB zep%ZS9|&sg&&>+oiO9M|(g-{-b6EihC2wX8#gpX*Xl=TT!wl&{FJab==LSY=2`Xc#j(jaVhw2op_cqD~VbE=yIK3DUI1z zU@Spw-mS>V5oJ&vgY>~{GVRc!gc6?4^;(|WZfX~%G%Piu%z-Kc(2p`%gd6E8`^6g) zeknM5-@Qz(@)XO!zLY+E$XB0|yx9*WXTZ@<8%tTUAm6|HHa0iX$eiDti<6RLUE%b@ z3=rSgP>_(D_Uq5iIi9n_$%~4ZOM(B0p_CEnuou5{825817sx&2&!n!DZLf2|;`9mnk4VPNP{anJdDd?Y+-2+GGZM4f zu~rx`GQtn$=Sw-z?ELiWIl|38)O(oi0rFlzs9DbK!G5*4h*^4a!w;|mAP;=}fAHt# znWh?hdfUV|zg(#XVmfcXMg>AtE+oEA&YOI(@7w=oBa5JkLL>?r7GDTOkIgf zRdyXU&BhjDM`k8EW;SCtJ~G70%9>kHu#-sZeLqr(Zuoih=YQ=J-YK5tnt~q{^#eXB zs&D-@dguv(!|dwH%I4-~O>HgdF}aNSp8+xMFdi(ytJjbvwyex$5zFXvQyk0RKCw80+Vbn~uH#RXM3z6B-7cgz4-gQhA$NUh z$=+~W6+d{ASL=ef)vx2zOqRpG=n+88-bp|PF@pc&u6tK|mcOjcdox54JTm%tyso)u z7f;%{v3q$$WG>rE#x;Z;Ll8oJhLOM?!dl06yh_}%IFR+)(Q42D0miId=#S%wM+DN) zIl&+ag;zq*wz;5QsUdoS=|~FKK)>;3O!B%ZZiN1=8My(SRWdQOc1EHa4_Th|TRI6g z_iImH!*lKyh1hNv?*~Gy!H*4?7;eop6pR&0<7 z^HT%e&-qU^h|$p&3YpH{i3C#s4jbdX?54HI5hdF5!!bGY5O!g3AM(F+x|KC@3ey#I zZZ=)17eLC=rJy4{8!Q_=<-QYF6S3fMzpj3ypm3+hWb|CG6CKoWoF3h^WDme4b>2Dl zFEofLyVwHD3V1EQH-hH%rtawdePs$a^bSt4pkWm25s6)OB~$k>_rXP$lzX|qYc{)@ z7Wh&JY3nU2J7U5av6{AH5BORgdm;cnu2J zvEI*rJk?iR5T&V-taqXs=F7yFN(TgSWqstP`&YVjN=hwyQlI`>-5a`VddUJZ<kV`Mmxm~cAp{9hmZ$gS1DNP-GBq=E`GrKk_-5>>Cp+8UfdDc}{^+Hrpy=EUeGZdh zCUOarL13qIVC}Arjm_%nDhdh;nsX=>M`uk4JNXv7pU1Pmwu?j+DX|?lWfe6YkW#D` z2sknn6A_1v9nj$<9Y)E6@ z`2YLoeHf(ADQoE}gBdR-`I+l*$TDl+hX%WrmS>8#Vd;S#NQX-=qSZ z)wchO5+@^4JU?ceB2uO;Ha z0tc%K{y(?i z|C!i1sU@3NnLpB58?*U%8!7pD19dkPO#_Y0Ww&?jkN^-BglpW-41nDhyLBRNHT1; z0ZMGP%V9(0slSa%_}}R9f5%*ZPwIb$lmC;K)^x$DIm@%a04LkQm%t1ye|m~-N)HTi zvI+D z;?~nWwX#UzMX5~y-EX;-zc%UDSi_is!9SAM_x6_YUKZp-;czmFJYJQ$3NLqctbB*L zH|r)WfORYrnwC_sD$_47FXJ^q2GZ&ZXt5t>cQ}AzoT#Cip#{Z-+Iw5V3%vLUzb4@N ziWo#-*9gP~-8?zfEymIc{y4@xq7>8>NXrp=rl`UY^VM*8E33NwYxn$TCr3Gd z%@2>u)cCu~H%yOoFKsuQ8Y_Efe)}yx5Sk4835c#wPtHn^Z|>G}%x&z9&sr+mwQa6% zZ|&{v?riMr(HG=W1ddM3^gHzmHC|GU*D~@OGfn)~2=!yYLtQ2!-(KHbo_A~8UC(dq z;AWlZ-dx|<+1l8m&>5X+r%qOxvmj57R^>cCJ&9BSn%(oNwpQSNFB#=MViH8YZ1>Mi z`Eu-bf!y5OZq%3(+|=bPwhNOQ3X|pv=jQTL>4sEK5x)37f?uWbi9ncq8{*nc|F^VzHgXp=Kqn+g7nm&^p_$rX=q~rJCQL z5y)DpvwEva);xn(HXP7^_u z?NXQ$MXEmf-#aOQX`W1daW6mPlZH~WjL7WvZsr1$cPA>gg!Dznmh^eGxrIKm4hM*M zX1@0td1MV}Ri3V~NDfPVI}{VPI&K=;jmY3uR60zg#YPyAM*z5x5LAAZ_O7?S4jCyUQck_Y5E;3n(#O35>otD5XF4;9sU-xu?G$Ao{O+ODTU8mtR23|1m*#FQpJS zCuBy%wvGbvCat^k6y39p>x>-&5cAh3^i*tgOtG+IJ7q2_q$#46MX&+AR7IpgfM1QiKf-g6hEtn~#)Xv0B+D~e6|hg%>ktnfvIF*izUYIC zoU}-yCsGk+pyk)3|2)U1hvQMN3eqiz_v)rvf&b{bG1=7!lXV zmE^HG2~BoCg$sh-ULhY`2eg(l*Bx&oF$$+^MjvHeZ)!m-bTh$$H#<$iMHS$B#1{!Wmx_B5ayftlrJO9?)PM(aP5$U<# zJ?n5?T4w%s=XQN@x8{C3J2Sx5*^<6=w3$gx)+kV3#Zr2#Ywx5i@1*Q*$o58nOfSrD zMQi1;vg@F}tFI@U-&M(7Y6%^=z6r z-p#6Aj?z62>k*7IF4L-9LXEajxiyY{HgMPDN20^E=J63x{7N{XA#wQ03FzT5IM~S; z`0<~3sTDOkR5t7UhN~h1iQzJ{b!{3xESv2(_Y5)0?xr5?b;!-l{$O>vxwxwY1-(cP zVeS$=WITLy`05aRh-Iy7#z2?ZPZzDN!d#n+Ze+Q+wo9PS$6n-YqTy_&b-50@+R!~} z{K)@yfcot`$HanocFGN7TKr;r5IVJdXeN_lv`!jxZCgxjht7d))n?>}#YBURc>UFA zqn%`T#uv-Z;7qxX6&4?ZbR-LPKFkGbIh|G>?zA9U`r^W*h29Acj?T7B3)@2A%OSp; z6MQ34@mYSxA4K{mzf_`H{M5>pJO38QIcbimD*7a^BqcGeq24R6F6aY&+KdG~v69lX zbVvth1%zXpzgg>WJFIrar;5EP7r)ypMHH;a{CcT;6G1P)naqpxZYgdoH7?34H|jcf zt*(1*2C@H+xSOt4;#TjixYT=1771xZ5u0}+N^jis-?#}2K-HzREp^OyXJd$h*0-m! z8G?8<%0pw>Bc|~ag8eQ|2Jx|hg;{(j?!FkVceN5NI0+kq@_3RcBoJoubqEUVq-;na z+@wJW3c{poNZ`}Sh!7OS$^4K&q{-G06qL!CkU-SQ;}DeRlgOcg=#!M8D43Icp@CSF zDxoMiljfm;xRYN(QSc`dLIbB%D*X0^%xCCviAXGrcEF}4R<5J{3x{_6%4Ry4GCKh{ zalYy*%-RA)?{m{F%=eZ`^^YDG!)#r5wv(5CYT2qt2pyj3Gc77m)ODMapQjk(%y~(k z$I8B7D!^3C;+S*$Kl*_jd|O(Ob%{!b{tb-R&mVs{9DyNwL5C_{7k09t}NIkvLSB zSl~;q1v~>cU+;6!iy*sN14-}(o|Y-T&giRG(Cv~TcGV$PfxLI0#QWa95!*{Y^udIF zVlYpPwwPe^Y#J)wui7QKy|P|*nr453d4xo_B`M=W1BIhnIqxvK5I4RQH9i-$7Bl{b zKp@xtJa=FC4n+??v0}2)nEUbPLU$?YEvD>cVFt@e7x0QT+p%r~=LFCFSPzurfK>{=( zi?tPfCIrQw_8dheFuXcp$QA5<>FVMPJDhIBHI5j{!`pwTB$L?lK}8J>5<5leXgOdUDyRr$nByA|`&rgk$Tx8eE% z$ws=S1G_vZagfhO`X(&nCd{t36@|gg%nE5-E7@F8&~h_LLmN9b4oV!kMi9D<7iU14 z0LI0#BE&PseBL9{K#AE^+4-cirPI4hxf8Q%xJwqeL$nh)hdaP2VqX9uYIMMAgpb?BfUb*>rIh}h)O1~`XS!P& z0Q5)4+AKG#)JIejK{^tjEb-lA^W9x`sex5k5pCNy0} z7Y8_ew2`O1yQR~W5B2@AqRy_YIXSC^nzYEs-SuYowg4wr(ElQc4wY1wNH!ej_BDP2 zjmM7&6a>WbJ&9H)nPqsy4UEEEEs;(>RwTb^sA2QX=4L^;anVIbyCF`EFVz%WyXJ+s z&Owds)LCvqpA*skqz<1S>UtKwD`H&4Tj@Kj^M zRQ)yU{?3hr(0~RDu(=l|{X32Fvn$;oX-;npiMyBZwRx12H!QP)`;}f6%GU}R=iM3S zNs_1Bp(}3WgIXNTTaI&xo%$LskV`6H?O=u zSb&mw&(l3y<@;V&xPghQQ|A?4A|tUKvsi&;w<04%pXYKFY71Dmm?VD;9hxVTd_3>5*Yf8@Xv&>_G`if|NxydsRc3 zZZ=yEqV(1jPFn2SUQ00Vhw|&K;%nwuKOt9xNz+Z19p--C z=$-C)fA{}XFZx;C{5mz-!KTdk>6@}&|FD7>XzXr=2ziMyjt1rLQ^13qG*Kb zR2NwFgvH{*VdKK#;KJEr*&;{bTts!<)vhn#<3%gVVz*Rjf@XPx6QO{8VC8aDO_G7$ zUx<*hm)qF}qf~3GP_3 z_9-Kftr(qbm*p80p2w8hIZxviy<8t?M0Gs(LESCkNpq6amD7|rgod&ao^}>aQ?;bM z`?y-Est-HHUJ02G!Z(?ObM&RbYE+Va6~&$D%n@7IHXpfRG?uaD;;V;7c!DDVp{Wf(gh#Yf6|n! zzJ0w0T{WeSdUFta&=wf$Fj;_-@+8&+S+pSrH;W)b%ZgCrJDpQ05vV;=De8f4+((SZy$mDJ4LIQD?BsAKc;8 zdH-9ZHoVRqtLqj}ig&1Ay>?K~_2#!6EQ*RwNJx8Tb#ZF>3Q&2RoMyi2sdl3dO5_U% z=>$*)X-be3H@HpEE&VX8Dib?z$V<5@{Ibn~HfhKG;VPraA{wRw@9NHQ`z*S651u0V z#22`LxUN$7nBUxK%gbe{d;z$wye@~K%f(iZVh^-a-%L+7ilT$zr^l#XBBpu0F+IC8 zTb@&%fo@naZ^F|*ZXa8;ye~*R1iBE|7&T$PxP|LZPEbByKMv&v`ivr{+fnj`?^4O{ z$ag!IQXg5G!&&PG5Q4-xXJFEl14?@0S_gk_PT6VuRIX4emvrxxCkUT z_2*LAxEqtYFICCj55{V! zNX6!bfCD@hn*^s)c?l=sv?kgPiRc(c78{(_4Mhq?_%q=7h zP-`De&md0CB7wfBTW49BR2nOORY#xB3)#`=JY~|qQadgx`S$C$2jsxG`B^NcWH{oq z*X`Aw%wdv>bx}=gEf(hdD78ji53A2EO147H^x%xtW-evwal6A*|B)S^d({G;-uNyr z+$0p5s2bz4woY{6w%29h0fnW3xFR9B2EbncXjInpOlV@gg^KZxf99q2 ziOo1`9h{jf*HR0-$K;R<0b5l^Cu_TVly8MQVP0BoUTI#b2w#GPeNgM&BUXBQb+l&; z^k>saq1A7?BA2CUO=Ex^E2QJRO+8G7KvDfNk(DE{u12%a&MMZZMd_p_!?avRC6C+A z&Rs<(acyLj`Osv=mN>ZfZ$?b`qR7qe?2kFBOSL#NpmP|{RhuuafNw@!H^7}75mCvW z@fBH+wazF%ozPdy>;-_CfS)hKH-X1QVb>2Pnkuwv4)|1o&Xf`ZW9%~FQUaikhv@LNM=$bi|U%#E_ zr2nw1I6j~M$tgOjPgm#4?MuZhNuOD5fBc>r2S0FgrgK|tZ&YtW-50L$7m+GpVr6!Z z-9R*T5=G#&yX~3S{IXiVXV=&c_u-R4Tg^1V@@IDAHL5wpA*oCFcHJz;F*?5%;};Q# ze>O&`UFlEW<~5j%1TPU^wQ#m%mKlqcRXuN+fs}HmWR;4@8^a}cBMU^Lr-zWdOvZVU zyy?LzD1K(?sXLcDAf?mR?-3uZhJx+)OxLD(msQcSBl`w~9`v<^2z9nZ5YI-0r_<8o zN1uS+7Qg)C#o?Pg(`1Rv)dJbZ5r4vBs?5cUU6XRAu1K89Bj(Fi-NV4@ZCtZmTo)>? zHjd0rvWAh`&#R&HYf0mqNz79Wer#WQ`CHIx##+}1kmSNX_X zEvn<6<4idh8Ow*u^{M>REWIhYrz(-I(N$v9^4%xN_uT!^?dF=xa`BnSZ@WQBn-QDH zXAJ!$`DZH?^(~X$stY=x1!bX?tB@hObk@9Ijo)0imIS|>YhPQ@;J)>^;$XUMBA1z) zn2OaLd6gaGT~kOMD)1>#PFO@M_&B6Bw5jA%!2Y-1XR^6?xE`6`8dvyM9G-ileb5K39i{3Lv94?8ReBFvt$eP+ttwad;{hw`A}1QNj)dzLQk>6( z!DO)XfNM6B?LtgaUBg`*#U-nmd@fUTJw#Y-PXT{tRU#saSfEPj-3@An@{p;KL50EE z3RUZ*A600R5{I4JX<%@}+(*ZQ4f=VKO1@7Tj4Ws7R;Qkx>%p7LP*ULT9A_4T8!>2K zJ0~apL;;JnmI;2z2({@!`MO@woU_I7hLze}@T?&0My{_C^b#ZBGK?N()1P@9M?1S; zt+1O~Qa- z6H*tsldQWF^46X)bAr8kDPa-?jbf7TMhs9TF-&}G<3MFFLvU=Uupj2BXlvQ05>&%O$2nF{E$O|YyB;{Yr$QMh>u*yl-L=aiU zJhuuF60m{UvToU8xjVU&o7 z{;1F7Fv(tW)l_E1OX9I-yQv>#6rrzR>Vm81`=3eX|G^urk9ViTDpOWi;nJAufb>lv zwzK)1;M}icrbW99mFwxrpKbmZFm~l{nN0jlBe?YP?qAnRUiNMjH)fkj?&NnXhqIIv`x|-h;uAFq4clCD3gy0f56l9Ws z+WSLE-AdQ1nLRwr^4hhg%jGq9yBN7=;%R3+py8V_MIIBS#&hzs*d;YcsHSygsvCD@ zIt}$02N{OFP@KW!7>RxsL^qkyje|W7VlFE?Quh(tmVPxuyolBW`k3+Y?2(by7CtIBYA_U85|`Zy~C8;!tdc z3{u6N>MpNmum><`dkXe}!WxWJQAWo48pPr2W&gU%g#HXj#1%A%cW5Os&yIuAv+yFl-f@_dV$i&z{uWQ5P>~vH>zY@5l9prh1 z;GLe$&@cwM7Wa02eI}eMD~vof6_) z?J0&~+NTj+4ow)R!0Dth>(4seG|kZM@JC`OYPFmbTnIT1%GgZX+$2&}uMUtm zzH_EK!u2`Ulh0&|kh#4O{po(>Y>lIJpVs6EhXL;WLIl$GG6K@3zQ)HE4n(Tdq@=Ro zXR$BWNb(nzqv3eXA$g7&RF>eI3g`F>yDY|`ERLPXX$Z6xWH7Mt4UwUMe%DAoMUZ5K z*Vx&%zV3D?jVB;@ohgh(o6`7ln5Cs9zLKiYozvwkAyt_)(!@jC?jn3@D|x2=LMriS zM#bAF05zcj-{mK*dsbhfU9{y*%3AsQdZ1W*(RIzphs8=wB(?0KEBCzXFbd6kYD7Za z2*o95=A88`*Bksec4T#Tl;zEwul%-DD_ptcYodLbpzCgZD{}?$jOiN24p!7MQRp5~ zk`-YL>)uMFx*Yjj4beq=#&nTx-HDgwLMa`|-Bjx3Auc_`S5z$dK9vRlQ)RK-)>b} z;GvK2F=Bm?h&nvLD=WD3>b4QJ#mPMJOlw59)=p>omtY%39|ynORk?QHA|hIMTK7YQw4A zN!nOYz@;eHkI#I*)@FKM;9%Swf77@!BbR-ce_BtV^C&xc@8E})G&&29HIQ4XO(_r8 z1L^D9ysPIre-gmpq{GG=<#HfPZuuOV3wz)_K1x(~@zMjl^XqUXXSrB;+^w=@)1-)66NZ+Sjq(;U@114_z78}4M|E~(9Wkp1P)K_j4xR)Ug!^Ui=i~*FcfB+XxTOCX zz|nA3Zh^Knxx;5%w*p!7y4jqUF&hxf7u0KC>2cF+-@?tZa4&j$+M?7~t!k7|X1ae_ z#j>!R`74--)>4xy>v=@Zc0BnOMkDkx(XO4Wk-nNSs-eL#apR{LydX1A@y*tbzk%;P zOeKzYI*|fhB0ls~Cjtx6yhM`f&8S@uM1pOs@rYYn%d45r5xzASfM#1cy->H8`@GFzxo%Zq>%~CS8#LZy zXvvAd=C7NOj04^9OI{r6%gknz1|J3tP#z;C4ru=RSVB+F!=36ZPPVQW!+xWO&?+XJ ziUF0Lu|_p+Il1T}C#>JNyC#`7+)n_?rvgpny(&(y%m1#kSQ3YRiS)T8C3E=9^4yiZg_bPk-!| zON3x-5+dePv^Pk|x&`T;MpZ8{zF(v@+p%7%sZB_nmU2;tlQ5=()bLJK(^Qvolk!f$ zxIl37;tpYYW~h3(`KD_cX{Q>?)dHFA<$Is zN)FY3{zSyMHh>sJUx^np`K^$CsnbMGalE-^36Jlt3C<}zKF`q3W2)%1&vKOc%+$?Y z=uX)rZJ^@ioaULvY0`gd>Mh)&?7r_|MUWH}=~R)fN4ik~Dd`w$0O=lTh87Vp2$7KP zjvc{hWzVCIt|G<6S=Q``Gz0Y22pDoFbMjKk-@`n!M1Kwnb zD1Dr#y4EpW>tQ5kiiPLXWduJLQJ4|GXtdrTM}DK0YKzpG7F_hS{p%F}+X5?dKJ(+~ zKTIBSkgtXJA~l>XGvJ%Y-LO5`lMYrXv9i7V3ddf#@vYmw*Eqsv4(E*ZhbYHZD1KmLfFI|l+Gq&6Z+3@IvqplNXi zs6CQ)!+K22UVJLJt|*(5=I8UVfYFihi8^X?SZeos`=G4M=hUN%rFyAMA{oZ2kt`O0{$+8Z?aLp&uRT9J09weyb zkOFI~I>#l|QSz*@^Ps`gR}Z#RO{dcbOFcPGkw2Vz zc&lD*0A%^55=zcj6L-V@{^pipXVC@eTiJhB<|D>Et%TvA0Y(grlB)r{wSLw|&ss8F z!E=vRWDOA&Q>GUk@0zqArSbG}GjS>LN#~Z4m`2*}R4YrY;Yh&F_Zd!un|&fW&Ch>h ziaQYnc$<`4X8DDbUp+JpB3H+D?RpKHrkRgGB2NeGD;pVh0llhaC4@8=(Iew?%D|u8 zMS=TcN&1c+0zyMR1|D!!ar+7r>%f`d&&&OUD`k5krw~vkL{3Qg4emNVU{SXEnt5gr z76W3EuJUCY=br2A5SI{$x&4+*^s)-VWU#^SXYhbmCc`Tx=?(qlM6|^h&~0bNTeaf4 z3=M+Bh@fv{(d`Qy`hAT&C!(rU6wq>2(Wrb8pOrUhN3h)}N zkV0!@r};s%p{CUu`RA9({6F8>(LqfL;?d1(lbg-C0)D^DXZr#Gf{l~pz(bz+X08WC z6>AT-okHFpzYCS}Nc20t6OCL7A5I+_Z1e4yDL-X?-=YxR@-GUlm?(`f4*_D>cv@_) z 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 D!$W&y literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-unlock-wrong.png b/corpus/protected-sections/native/observed/onenote-unlock-wrong.png new file mode 100644 index 0000000000000000000000000000000000000000..7becd2e40ffa257161d4ad4e940fa96958a2eb3f GIT binary patch literal 50432 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 AmH+?% literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/observed/onenote-unlocked-shows-locked-append.png b/corpus/protected-sections/native/observed/onenote-unlocked-shows-locked-append.png new file mode 100644 index 0000000000000000000000000000000000000000..05abf6355d52ccea882ce0dafa91b8cca1a13d61 GIT binary patch literal 64768 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%0A5d*kVFOd4xk!WUqmyO@6 z>tjG+L;3=)!`zh>1%CYX>zhYVaPT7ij?$J$j5*5Z_fzRX%gaWG*@Ki%Qd=KHSO#IL zA#r`tkPO7;NazWaze?1yu;8rE3!;dix3`bD!@$9b*8yOebb=wuhTrtxzI|(t6tg3@ z$7IujtcQVFteO7cFk+sb$Q9K+pZ|1{OafVtd=2~6w`>A0EU{yTsB5XP;6vqdao@o_ zuCEyBAWQ~-fTg&;d#$;PIm>p5eu8)ZCP`Ra4Pj(0eZ*->9vOGg9^eF>w)kbV!zE!| zd4Tgg_yYc#^t%Q!-ioO)aQZd{9DioW0yO!$DwTR5-oo@=G9Y~^fp0d_L%m$0m0qAH(0&D~P*2-CA?nKW0GRE}Q5wXiwRM^H(@eA6 zslR`sWS{0iWt#<_gB-TPkdR7ReQ;|Jx99}3D^m5jA@TM(`>o@-V>`ubs(@a&y78#v zBC!tZz$lVusUYea-c3K^&@~j>agGk-wC7Tkhor>nC{ozhRFz&FG*Ourp;^u|okUJ}SziS}Mv` ztgI#|Yz@|5yx!|`?lNcS-S`PULV8U(M+E(8U18(zX(V{LOP>M8XBUTf9Y6Zaf1+7_FB#mI}h-^og-rr zyW`4W@>-VjAM`#n6hCk0^1U@gH@s|3L^r%yY4HjF%Vl_b)#A0jV|djg*nBc>cgwbH zb$7O2>KpnuzSQ@cZSi72vqk1&f3oGqkM?HQ*XQ~I>r-8+4lWW>58{NZCHIn~-S=)A zM2tspyV`>O=I-$L2kjjKPJ0&yfeIACG6#u5D6V@s{Kh#1EoW^fs^+bC$?2m&YfRej z7wFmC+|ZHcHkz1dX(L2Mh55Y~=jTjnJJ%QZ5-mblaAQ^3N3n_6V{tn!!@|OSlcTDg z4+yH)tppFYX~>^8i3o3CX1mxf8YPj_g(=KsJ*8m^Bl>2mI>#6mwn$zl=diQ?tpC@G zWkqqLKZ>*p2SZv13L!MDI3c#lC2(cA$^M(p0hHIhfZUU)uOkxG#*PZ;h~qWM5;T%R z*hss%oC6Hql2XgF zMl^pQj8$>@W8A(x*27?-F3qJ*+nX<%u1w}xCw3+)q4)83a9;aHY1@`hwR9Df{?$Dz{cE(rmU_Of&|Hm?=Kpm#;_EE&P0g&u z%oRFAF?JIJhYM7+2Ho@qzB~+235;|NtoE4DvTVSWvn8l5Qsid1Z6X>ids=;8(RXh- z=4+B00{hc`ho?#4P)nTdjosmnS1vreBU3Y@hQdC?@#Dn_;KY5u4(-2@3Lle}dE;&9 z<6T-1L0?+E>476AvkLNh>VBmE1d*J$h}qvY5c<-Khkiry z0zRdG9kCxI)M#VZmmoTv;zFxc)^o;bZ~v?Vd#5 z)!$kT7T+ExPo-@htI8&qPJCYDKf?#kg`+fNYg)at?E=IBgg7TNlsDgoPo-s zj-ENwgPu>#34fU6wqF?g+cold(bFAgI%?+CHdTdSM@d&UMLz_<wL!+FG5;7daeJEf!ehV6-D@>|6n>qSg5jl=cFm(n%JF*$Wotc%Gv$ccjF{@Vrg& z`w0_`;5x09w4vo$?#kcCIReRof<1t4bIV z8*W5fyx8Qm7m-s`69}E7@J95-ay4y1z&7DxzI=4o!%KfNnya@|9J1@OBWu-MEF?UX z^(}oAWDT4h4b+dElN(w8%c6wuc^63Gm`aojPh(7zR48?nd}h{Ur_b<(BJsa~Fzs&RP&vsZU@(!vOoCT6U*>pfQonzlS` zBNsyufq%nNTeovLzly%FlnM(8O(KQ1G&Y6V2wS|UAX%j?#!i)u{Gd=zJ<_ooRe1AR z$YWyaNQp`H)`I4_)k>T%g@1%&Q^I5gGs|;-Xb5L{4bms!zd+0SYq@k!ZzGS1(^HYG z3ENP;Cg+3BN=@%t+s$(RSqV)WtXsF^tVjWl3wsIEzTi&7??4BQ3r#b=H|H_PNdQHf zQBC({X}q9bt%1Y7u5bZ=}NoZJ5;n!X&c-(-yQdttZ?p(lkSXbShNUNBcwC)5Ey8&S%^`y2%A7_}G9E#IEUJ-e^20n03tZ`|NG? z{SXf;Pjh&<>62=#QAzUDSvN_XM&OSZRkQ&Pa*C({ZWs#Yxzy!@|0TX##5P)iW=Zi+ zSq(M2rE-3ex0-gk<&HbXSsH8t-Y~BlPr1n^qH<VJx^`4j;%4Ya0~!{G&Kad(@EL>L-S zI{TPSZN(dzyVA788GiPt{L@{6wW##6YJ2p=_)vT+%)g4MEVBOuP5NWUVfh$dugY8C zuWYP@ET=!Qp_WPM+(XtA(OoQ_!yp>DZp6`@nP%B^WEYp+={_R*&@ z(H3jZUXK8sa4Nx-yItXwIAxXDR<^z&&h`^8j9UJehcl3P>)v1j9yZ<$x_q}X#ymsa z3ZII}U{P0=3MfZIc`PAuO4?M@&p9{=MHY)~Wvb^JiaoNgZt*`X+i`0MNlPeLsSD z2_GEPZ?rkcl)gn2I>Be~o%g3McQbBnOsqZNOseh6Si%IGJgyn_jW?24xh7Y^8#glcY+IbH^T2nO0C| zpixdD&8M$@W08x)^K*Q>-+Ht<>BcYy+jQrKw1$9qb@k1!99vCYAd~1&vVWERdlfm2lDIz>-kF98hgF(Ya5A&{)smOB>G^`m6vQR$>7!Tx( z!s*^H1(|B$eBE+ZTV+a~dl|>~$|EtYZA*~jPz8+8l1{EZ(S{eBeGq8ufq7eVtj9@l zsPuxYFyf&vaiC$#QGN*f$PpWTO}t^5N5OF4v6kKvg`2koXUlxd=O zOYxUzoGoQ{M~&WFrBVhS{5&>_Zrg0jWQG_@?kwz=?ek;?bI!|lo+@HN-E-+5ycn}@ zFXEpl=^QlyS%h9$I%Ty8-RZPla9d7bE?<3?z0^S4UU2$RdO}fgC+*zl?Mx1H+8Ga? zPiz1pwboM-vfrV0yqy8nyUixS@_`|W556_aVri&aIyqVL-h8r9%r;|7i{a3LwXUpi zt;Y*aRxhai{`=>maj6P07rA3VygD|ro~lz8J8V#HBmKSLM;8+&W++yuEM_PRW{B(& zRwxFQ6H$?V`c;LK=o6GrFMFVsCw8Qz%s4bu7whi&O6Q@GF@Om|n-&fCo z|2q5X)Z9bQ=E0XfLdyAIGq1rinMoBy%5WC^c*XR0cwoE8t64Xv+S!+V^OOY8=#<}( z8{U$QWbn<_`lUJ7Pp%7l2IZpjgc47a;hw|=YcyGNFZeVu;&Q+PS)`z0{RhP?7X%&r3Wq9bA%RLC^-`YJA90?9|}1tnjtc z%k`1VUDaOm6V>ds73ts9+>$U9>>6p!+){FDkQTT_%lt7cE%HG(P~oNKkZx^+KC?z zRZpP_(%$_Z5E1OONy`V?TXC~wUp36QyB?M`K=p4dj>AEMIIqew z4}wocfpeL)YZ=~EqVd7yG|-G>?Q-I{sid0ff&nPYX1f*IKa1H}=2 zR7`LkGIwT9mQC>usCcZ=3_dk2h0Dr~P3OY2qxJ2?s;_RH-L+wQ%h71*=FLWml#)-; zZu@~+|D{3y9PL>1q2IPSEAazpB$2-a* z22$H#ZPz92X^v@OVgF>$C=WRpY4Pmcr5)m$7fS<`_Pv*hlI-71-b7iv#S&c?@dLD) zqub-Dc>n$+YTc2Z31)-4zhm)IWm~jf$u|q#yN1mTw=L;j*I-%HW2KkpZD<)E-PN>} zbC-_xub@iXCD8n)#w_O5-`in$MI(ut209wi)zDYY7TFfMrS8(dE5t!A@pnTt+Eo;v zxHx4o`<1l3M12TUJL^5R{q9X|y4!){T*FqGo#9IX@%6tcd86g#R}6Nym)qa_wnNwV z94;qP0>NbJ-E?|4kR;v}Qms z4FAxBnfcoIxZfQ2V;=t^qPMv>y>d-j{F>I$Y-UTBle@-vd*$~+63d|=s57wBj&G3> zV%BXddb_lt`bIa{B+VlTxc30D-T`^63EG!;iFa0K8v8&3JqT#NqArA(H4m983J_7m z23zoRCy&R?$S=$sx3os2DfF}O^R{?9VQRwO_oCU&bJ)?qj55LdMKbx7izcx!hhE$j z34=g%4SB@)@#HpVe5FW05zDsjz*~(eU${JR2qAQSG)!OnDu2<=pdi_PYW&?q$x9mD z(X&6>q?!8O@25%T2Z8IV_di#y|DpxTF_>QPa`n7gEYv5=ET(xDpzK6dXZGsmcBnj! zwv>rR>})W5WXp?#i>;r6WTmM!e`AFY*b|AMc#{W?^je+~IqcKU+oz|}E;LFyu=SzF zDzpvg%w5m+<5FmZ&r7%20&&r}^9H*FvGcU#N#CIhc#9y%P4xOIt*+RmaN$YmM~t@Y zhIrfBA$YkHGlYOxk-^>f)%VM)7O30OQ;r^Sloj>I9OhTW!#5L;k+0aVJ^E%FEHzy< zO8-D_qdvNupOz2wyz0$<|Z@SopusqEkV&V$rXT%@Ion#>zseg)$x*lr&`cfOlsOxc&mH-7%;TBUT-eVJUx-@7WAOXQ zY;XgYA%qXy-pz_&)mE2Of2~L;DX}_NTpZV5sB_kBs2*dfjH@PgW!eAd4=$V#7eYmZ?e(R@H*Fa7f$S*VUbJrK;?V$<%$PyuRuZ)M&fCLNK_ssS8WS zryuol20#)nc_jQ7qLVhKo%LH)rLgtVi)O@BV8$Ai-amHj4X2}JUJIWC)-}Nd=dHO8 z@u2gcv;&@&ArsHc&V9s}^%|&g$U8cfePKLkjGblRLcF6#pUsi~_?O@}=QA}kzH=3I z-kS2;1zD)*SP(ynFONB{RhycC4?b+9Uk5BNMb<>xQ&24nsMwQzvL?%blB5kZOle*m zXCNadx+x@?DwGC2^%^L+6kmlI>X-X|=0YqKFJ(FHTkM=L)YIwunh*`2x#8u7b;zGC zQ1qU?4X^ehEOy`Ks6(pSpyGF{wp2}!HOY09_@?4ruVRyItPt|n`>M6s>9%}>ldPuD#FQ&*K^Bgxt#NN=Lf$Og7RJR3iD+(R6P+URbmIq| zDGdKOHwrCzADS(-!-tOJ6DG+e)sREi-U8PKx>{3QW9jvheWh<<4H>%;Kiic=XSE^8b)34)U}R3FK9VkzaGJAE6~EQN(`h|(`8zk%BjVn>#~P=RdsYt>2sEg!yli+$FbLQua{>Y z4UUjQ(B#2a=u<|>AA|ayJvt`*(uuvqedG3-mS#Lu+IjVZzK|N4$ItSY3MM~)TOcn> zke||r)vgBWA4(|JzCoM&!co15IcxrPi(l%TJhR~>Ti<>1C2+%b`gFL3^J62J3rLmY z=jqd|J#Ofxdf1+DYQID3&AHIEokR8AZ*Be7zBW0r&!DA3mw?2Nyx^-%v>@^ zp#BpzBv9Hr@b~2OZz0GZFnOFmOg5z!xjnW2&aS1sCabx%r?I#*b(?Q>mtC@lSHD!Y zRWsv}$T!ZFA9+Uqnm3c^Xs&ZDoi_ek^KGYRbXD|ea0ttA48|c3%hTlP0Ooc^_|;So zFC$$=WkI9aC#HvkYmcof$(fGvJUu`y9!Wq~)5+yf*%H3O9kRh6yuu&8RuhB|!zHW4 zA#y|~aKI&X#v(k%P9*YqNeqi>+ozlzzN{YW@%oHE=vJC?Qq1moHGTF7PiH(9XwRh!L$M45{&- zYr9juFV4?yYWn!76#307FTcgiGL8-vC)kESvjCbE3wN?>_%il*Rp19t$6xHST$7Yo zq(jUi=SX19!B6zXALVyg-%@6{8JQS5IEfqJ%r>li)AT>R!{={iw{_5-*_Wncm<0(I zO(|7(rSH9XwYVdxQndUXi$R7Ae`}L!Y>K9bEoaQKU9;;O9HsGC%VyNp>fIdiX>+%w zZ#ewO?uqbzM&0=9*Z8C;iLk$q(R5tm{&Jx9a`K%c4zNEP-d;Y<_E#Uekrfgt)bOES zpELc92W=FTf2FcPLc#y{{WNH^YLdsb#bW!>Xxz;c3{QUgvqt+lul)fm{qrg@Gd^=G z{2|d%BBs#`|MnmdkzjaeTI)L{Bl^6*FXn`xbdx_`DQEH-(2#;Oi5XPMnbK%kk|;T& zshQKC(kBowCeu7e4owXDysW*02*|c)1(Xw1V6(7X4<`)`j$}K>d(|{Fzqd+(Hug#_@DuY>cllP%kz(OFJ~a z`Q)zSsp(Y0^lALSuAIgk$ue@>hpY`15%=ifytn;=zI`hdKy{SLeD=WVe_I zz35%G9{-13JqjiYS{4dT%5m@=En4J~|4B@)ilcg;868GK7$?*5S7r7}SqCxq3Aj`g^DTG=WyiK`V7Dq2_U^u0IRk450s6`~i=N==H@Hz7L zzz)2=z)FdLeG}F<1icc{+ANRaTkq!$r1A5t@lODpbLn(^w@^00O7rr29sY=;Gabor zb}LQa-d5W}{%O!zDdV1dk{yiZ@)ru$l`7~a79*5{qx7@mxjRGgSNcyD7Rvj08A2k1 zv(KT7JnbbvP8Kr2{ozQQ9wc;IhgqwB$DKGVPHP2_*zGqTJX#j?VBdw=)4V>-lDvM~ z9;HFep13sDOaC#%tz9ed-Fq4{w| zjcvU2>qG{&sffF#4sA@?e*fV%f`hl^C7 zbrWQ9UCdmkTS-_`*tx5QwU|v@E7umh-;n3~0;BYlCxBy`f@o?vXPniCf=nD5VA}1*KyH41Qp;5S^N%$Z*d|-84Y_HP& zCv6<5)(p{Th?$Qo#QCzrue)IDiHZWV<6h2!X72cmxUM`EG9i0@#3v`m&<<4o;?V6G zGXD3p?PC7hsQdvHJtO9EZHg?(Wg?EWvEDwC9+}`bH5j{+=0>gsngN@J&HHZ-Env)_ zep+jP0Uyd*sq!39!e6g1-cNnXoJ{+aj7e@KgpQA>8en>AgAbs^Z&2ZJYF zIVL@me*ckINqVF0KElAZ0us>9KJJIQ8!|n75)Tge`0e9FCy6U3RzdPuin-#O*}RBh z^222Pr?I=3tUXa0r3$@kqIT_Mks%(1=V?A^!f$i z7ZVfX;XxKC$6)FD^Af5E13JCPL=}o9zvu5+Dxg}GjF4PDc{;+To?PU2+LQWTmz0`T zPsmm%&uoky)y1$H6qW!^nsWcLh;Gvsk7HY5&&8r;K#-I-?YzE+ye~&#NIG_tu6a(_ zGK@+WItn3;%=jxW_?BOk&4)|0O zvFMES5wV+y1ePHLuU&geQO$kaCUV4}+5EgQbP1UGBHr(*GUh{0SiT9+&=Ym z(#IDsqIHw`^3crjpp|Z`ib1@kPoaH6Oqgr5EGJH{05_r*gBT@`1V-~1&J+rm*_7=? z5Qq3TK4SP|yrp|Xj)9h{A(c@a%G+r=fy6LpjN;>~=5(BHy!N9m2;?|+2ohli+LfN5 zF&Zzq?C73;kpghu%wr?izHcj>I^)yIVY zgcvlw*Fu4q4vsI*5bc3&QzO_1{muV1G0&2(^}S5$nzKZvkG!&z;#Ez8;g?5m6K6)b zgXkKfVtJ>PYM}x|72W_`j$l<1K|1+GrBc#W8^eGy%9pe(Sv3c-02j47o6y%3ChN1} zL*H+ZTVc=4D4}mLBrI$such`K^{)yj?-hSuV%L^Z2flG-@)|YWn|0@kf?(f#^7%&J zY;9BNV)9e%Jza^;ws>}FX1)YwD4WC!PW_}7wka-dByx8*T~~P5AG;S_S5}~!iHhcY z=S4z5qCsKgxWClMZAJCzBpH`?3k~CL$i`z#Ul7!4ggT|+DPsZk@*Ibh=tzil-Whwz zMyo@fJKBsfq(1FL@len!&d5vB?MVE*-gt>4j$$2%D)HkIcE zW;3itfaK?*h#Lz<2h_-e<9(h99R0!)ZNxMs!d%t=&To2YSfofQ+EZuhiU3_0Drizk zX5VVCO-;zKO`TqYz2ncwa4RytXsN8ImJV$>MH3fkLVcHS9GM}Yq91c|(|u%xvANpG zVwJB8(T98reRX#W#n#Y-t1PPz9Splw5|wDllf(oD-C$Ns1=jJlob$?+^u&&+F!E?Ol6YMv5a1}Fcih*QPxLbzvAI_<~kp|NP zztE+3lX>&VQw_i3wd`K*PXZ$aGSx1s`)1tH}M4YTx^F{3LUrq2{i=@*(Q67B4b@zS53n>LsfM%8a- zt|ewg-~92M$Nx>bNSD5BYs7mDjL?lKf5+`qyYmyq>0H!8z4qIT2Kd?3r`=p8D#(o| z!I8MYoHD{`B71ZBG1G+|{GOKfe?4>fFW7V0s&lO7^*CabtqXlyBj5cRv*)ic@$WR%W4||)Wn+L?fOi|wV6V<6Zx9Qop z8B)(!Q*~U+M$*H)rSC@7Kl+x$f5~$W>2Ww>C?w@7r`0KyZsX?G-@!M#{u=Vj@g5I3 zTu&BfEgKY$gB1P_SuY(7?}YiGUrl7Q+EOw48iG2#0C&^TLU8?S|860ARwAkbqnAt$ zq&!mwcSmbsN3n?2N8Y#wCGeyCILkt-JQLA0i6G{Crr;?Mruur&ca_05Pu!Gy2Q8Ax z9{&k(z!uM2y6G&?%CtMJw+Y$OYW7ic9mwNt;I7sAz|3xKG@>;&F*OdQLy{v}xM@2R zusdCP&l?s+HLN`&Sodk98;Ztg>JmHpgMTTNi)9gsh)}&uN^8})zh-josQhoa)0y60 z54*Pi91%MfL$m?pqUT?#e1rlp{D?}@xNZrMZ(RQZRnds^t2EZn<97@C%|oAsb<8BD zmMDmc#_7ssM6s`qez0SDWY`c|@vF)I_5NvATBT9LahaW+68Al*3+eQdMkwcIq%zuM zU%}^)eyAZySD<5fNKvPTG*b#E+tGAo(-NaKCTAtgwRQDGWC=lpY zpkfiN1C#Q4va=E8h34Kym9Eg4MGQOOQyaEKjW$KOeQhA$s==3tR%3F1Su&VO_mPAk zNlUT7;fxXaC7poMP91rem7bfyU~u`%_a-1VO`t=uo39@&(vz%Yi)5ihi)*u?glntI zmCNR$crjKWC;7Fp0OGZwz%fttnmw@ARQ$nmFHK!6#|uY&uZk6xZT)@euF+8!mXX7o z!8`qWKHR`3>T_mKA1-qS3m+WBy3kCHhD57=8x!`gdswPZ4)|=oN3DVvY_SS6$i!XI z4ISCA7ZghmG-$);#5{reODq!l_|$tqk^2}eT#e>&3b#I8VGg>DRaW^vEYJU0%mp|l zu^~%b;qhY#zvNu|!K136Zn7P+#`h348+kKzO|4(U z)`(zaiS*tQehD)Avo`>fS_pcxZ78=3RD+WsZ&rMeAL9Gx( zIE(+yipx!4{Bkt~gV_7OWG42SlD)$KMdTo&XLwc17(pffu>P@I5_Xu;A z@j1=6oSVT)MH9Ar!NYubENSz>$&_avVbPN^=T{C_6yw|M^qFK5VwG6fcV0 zfw}T9!?|+ia4dB9BSHUQ^F{_TXQj`FRh#+uWP44L0~sMh&_E-TGgtLNeB6=<>sz`wPnV9Uz0x$#0SlFCgqzBm|PKd$#VQ{ zQce4j^PW{#tT?arr4WOF2M=VU)jan*JiJS1XN&wMfUUu3e916vaU{TSbn#eX8R+PN*NFFi1|IK>!c4vkrA=+CWNs@(DniH6O zcZid%4m61eieu*Z9f)7dgdA57;uUr{QB~Z5iIU0E^iipz1iSPNl7xF@vs>m49jf3} z(Pj?#qrn^wJc5Ve^gu|4;Cs}RddOMVnr-a;Up`xpb2TZ1TS-53LGU*_MbV%Q4!fYeeo5khnSEqv zThPCFS+@C;I@h#L2oIRHrmbLd@D_g7{pXl1CX_q%Z+C(pzRm|3#6Eu?BW7y+rK0tq z_Z5e9o4StkX{P=oL$fkn#|lTuTqWk6q`xStuXIo-Vbd_`oQtLtEZshcN2gy*=kCdC zZ17JWH`nl<>z}#;+aJZDg{c2nhX-mtg!LW^MyMWdwI=S#YTroq#5 z5AQ7Zs8Oa?_!sFjJLmk@ap7L9nu{{s_o`Aa;N)?Cy4I=XSw)(I5KqPJOh=gyIjv)t zk!wPYF7P_ZyNnIsHAg5Ifd3(~`vygSCzeS-P6+3sU+BvQ^W6r8|K`5G#X+;B!<~iW zPYZ{6253%{ffyQlD5dr_OY>iI+Bnv{-Hs1`#B(2Q5#fd>*hr1s3J%DM4!3ym9^p++ zj=@6&U+C36#;<2`lZC@(B@&32KE}@icl9GD-3o_o8Ec#QrkCIH<_@05XO85q}mzoXWdlDCqWV9kv**?r%yJ?NsAzcOwp~{P#_KV z{u8}sZ?b*;8*B}#*$+LNMI2ckm=vFx6c@gK^ z^J*KC@zO-!rEZ3apRaz`@tm++&ohS!_%M$5k~?%m_)nirgl%$%*ENuC`&INZGv2OicnS18W>~lF>@9S=9jU`J(7%X7N3Zo3Wd{W$qhZM36*&urlfIUL5m{ zXddNXX>z=147^hGH_3rjYXXoGd|GCd20_5 zZ7VIdmf3!*a@Cu5itUul)M$jK*zz7*vp*7tma#)_D2Mc`xBy*?qzLPbSQURh+7mYN zL0KLpie{l12F`vzTNKV{Cg}K%1_ELvEB^MN$KfUImPxPi{UeOq_@fA0OZQX0bKVlb zhTe#yR-$MyZmdV(Emv8MIV0aPqS9e6gA1Cj;CwbK2HdZ%YN|dpm;|y7R|^BCZBH z4eGP(Y6)=(i-CTLygo1IR0N! zguwVe=+{hR9+54i5_8yhj&3BiT3O&=FL7jJgYJwC&D*^agHwJ~dBKAG~1%6-tDc+GgRbBW89zTv#hACs1ySg*BM8nI`n zj@q74F0TV5*{yU|*=rZjA(4l%5({_EXNuL~i!38M{L2q{Cl1a%?pOD=V9HGTDqz_Q zNs7&)lNmzbY9b+-jmO&U^7~=FYz*V7w0lTBL&r3tgL>CM0!ty5g$fhn4sgL~@fdeC zEA)G3ce1mJ(^}doms1+s)&qX-AAYWDGVOH)?R`@1dqVAfLY3Vq{q|Oyqy?MWzCTwd zb*KkFWAMpuGC+tb>k)m`scz|gPdX3~a`|s$$KSROJx0SVspln0Ra$-;suUIVoqLSb z>cIIthHCaW(PH7sQ41&$Zbfqb@2F^FLP8&Kx@;W8KbVBRsriDa@HkhVGRmli~ZTCBPJkyjG{($iIR$=Q&`ijkt&A{Q05)N5ZXRj z7*sGlO*2*}+KE+bT)O5f3ne>7Rb&QhqqgbXx9i-uK?2($fo+hMqC!0G>H0N-BE8rQwAS+>4v(Ks=A_XhR96dM8ftPrcU+Z6O&%Tt@`&aj`2 z1?VlID#KQ;VY=g4RlEyjbT2iMv0mOe;jKnw>{-qq``l|XZ`0H!y4PeE?#FgqcRuJ~ z=%#8nsW3Gi8*6Hn-j@R(y}MdWu6W5>Tm%c;w|?45mX*ZET4N(=HD)!>4H%++I(*V+ zjLwFJTspKAZZkTw@~#X>YV`|fJ;VV$L+kd>tp@vIN2Z#0br^DTC8sA=Sc%$9#nvs& zN;oyu1o_G%;3HK$4T6&axJ@Gg6qjReprHqSZPKWu$>yj#ulhHGkmJx}`yJHQYed=$ zM^=(}e93n8GR5}B7gjI_UssGD-O)JGR!SD4EO{N6TYN(Bw*QqGb&canr9r(qwE}mR zrtkPs0rxZEoV!0<1W+y~Pl>M~hmxNpe1_Dl&rypbs+^YbTT=sTgK4Vecfleq-RYl+ z)TEl!q|?--`7gC$+exKkXE9t}b|k;+(ClX-8(hdy=lSDzXy0e}Q&AO($!?8*WcwM! znOoug+ynELxZ@vVO(@JtV{#*CZ+!ADQ@=B-333JMXs}<|t7fj4{PA7EEHIf{Yg;RwU_lo; zTmSi%@uFo+YyXpaVRz%BJT2O+38U{&kk7Rg))+|d_`UV2n|z0of4H4tH*gQmqKzGN zfCFmYlJcKIlai8Pup|R;ic#yX^bTwy3Mjvg;4&q$4>6byHYmJ1lzBF={tPG4RD+ep zv_~Tk(NCAjYaveGhW?>uG#ilkeymV=tG&HiosD^%|AUYAT^|kCcw2`Oc3#n> zX;e{Mrc@qAs-8FlI77{8h;{bXbVF2SxcZHJgm+0f1 z9sQ{DC;idr;QNp-G?rXFF#?+9*dwJKSxNgj{$}crqDbCMey4e|OD<0>&gj;e^8~vZ zp3B?1m*Zib(K-t9;8!kfAr>R9LG$Ach0H~kZ=iu~)|jY@>q98-i5bO>erBr}I)6&9 zJSPhyzPq%EiX)DSv*{bLxjGb_nxr0Qiu7fl#FM}tpph-xYHIxT4s{q9J+uHfyZcWH z&>>Yr{*ivTl@|j&ga26yJye9v&o0guNBdN#uvfXTm$mSgwXl~ga>C&CcW#e5J};Sz zN7VosHk8#$kh`iwehtC2kKQDIGm8uAQ8!vCU6uPPd_&(~{s6*@I%~TMngv5x#4eTb zE!EoEE#%xUFYtB7Dm6XH)?+)feOcBk9YIPInBekbOtk&Ot{L?-ldzP0kQx3oIw8=+HBt?{Cgd9w8Q z;+g4cQD4{zZFs6ZZn9Mn^*_2%K|M0iTrSA{Is7*8o7oUoN=!sK%(fxR=F^xuaTeWn zZuWq%tdeB>XUQmR(eO)gk>ksv+`h^u-tY%qd>`c~Cla?i($}-%*0|R!Kgiwz-c1<2 z*0)lyFqeO?oNXHlV`!!_4H*zW-K)dkyxj^1tO%P0bXT+&kFMQbKBe-Hz51o{0~hmy zMh1?igSY1C%sOdZqOEK+wn)RtMEOeZSCyN}TXhZZ&KnDZu=98Rhd=@IX-B6CRr;Si zrL}7vZ9=V%BNfe}KWxRSya#IArW)}l{%FJgn5=5#V@{yBaX8P6hIhtP6R0{(a_)QE zle3e{mf8GhA`uTY9C~#s_#v?S6CIj;Wt$UQx|{JldlG)0FJE7617M>*`U!|{<+7f%?Jk5n4HCqdwxGl{bB7Lj$M?L&HxYXcT;cYjvW;f z@*=%}1o4~N5x?dv)!s~s{c-$^ZLg`ve4D2W5%;=6UtVX*Y*H7GogGSx|+WpbLG z*5KFQB{l%GmZJ94h$+6Yt9{cbI}4kOPRIwYd(ARRh-q0H+uXBSwamm@y@|I`kWm-hd4TTy46 z(7bAsZtD8@%Aewf*+=bvtBn6}j3nS$1~^#Km9P&`HC$q$Wrw;u&(>SZG@HaXUx z`J}Cp0;T&=t{lHE0UB=Sq*ce1^0) zr94nNTrV0N*RTs)kdwNEA`y9d&>sUN&ff|CC55kE9JeV*mpCh0ku@`^e|u<+#@97`cxJT2O^t)Y;xy_+ ziOza-J>+^l=Biw=uQE2oHPt-F?vFAYx?8k6Xe9q}a-_Gbjr^dn906$HHUp9}q=_x3 zW16dIw&_LM!Bna-DKN)fRTgl~KB&MFbT4`?-U+b!cUo z?=aZOrhYGS-oonO9$j29-m0_apG#i^1$AhFfra3kGR9-Up(RVbmhp~&T-7HH&0E2> zROi(z(W5$7QnEB-i81f{vfo!SKR1g2!)sn%hOTU7RMTm40q=9J#OHZ7-OD6}i*MLe z%)x=+EnS$ zsDTd=K^=&v9km-Dv(jzA`Ex1dYqmXf)&s0C?|YJ_$Yd}1IqbgfBsAx=NMbds6*u5j z-Us)R5B{C5hMgo8{RFd{ded7vJOh8TlIB0zc&TXGNlRYAO%mfgUys(JDP5>nhEA#7 zT3;om#g;eW+2x30W!)^njx+K*u7ou|}3wO;?89^jKt0;I6w_b&{ZebxiIuWHq{d!Jzy>ymlIImJO9ZrQ?%T0fp zB2vSzJ(QV_4*#p;K7uN3^(WwZ*O&X-l~>&vYhnC8~9{rYf776)+RDuUl_^#%pp*h7KK zQ9Th^!FyY$7>xk-j@T1syqMhnK0w3*t`E&BuEIP0PL%HmvH&^RIN8|SS(LfjmDkJh z@hM71Csu@Awxrmp=#0;^@d_o_Au4zq*9Y?~y1@Pl#u^-v#VZ)_NWA0zHzR;6A#>81 zg*+2JjDE{sY#!kH%}J4zi|nw4!KV}Le@w}^Aj zh@uCnk0OK7&0A;ieKUy<8!P8`v^$4OtZn6PstUig)+zXICmeB*GAD_)uv^+0$gGW> za!nxcBgJ=fffQ>VsIz;k->FGU;reWK#_GLJRa8?@a`3P-($-6Isi!mjL=d59#Ux(? z#;@nq4n9CSNd;WoG5-aRzlkN(-t$pmyb0Y;PNFFbBUj5M9hSl@aaR=bOZFaSYM3Xw zj*%1aPxh$=q+&M-=ZTCaIV)^didc@4TdJ$Xpe(=w29u0nNe_&7NZ0ux~0PoGd@J`*nt3AV2bmv2KQCR zgXaEO_aBwNxQri61+PUboPR9MyVN%=*f_V(EZ$qPLpk4Y>~V4m8XLLPH6R38**_;m zk%hS^xBbGe8(tr#rh4_6+053ez{>0ujY({Aq*b^0rb;;G09QletV%{pIf6NK zu@ym+?D!mEQMMJTc8iR3(Ds0{z={i>Ov1x@=<*J%nZ4Q4pr@M8D8dTq7LpJnN4Kb1saL^|kIaqTlLYJm{YJ z8wgwfFyW2=Arx?Ib4j{x{YaUZg)K%_E0S3Um_4tB+ydKKi{jDq4_i;S9+IiPRLWEUw8vB7Ox zYec>KY(GV#Z2jeI{eIg3-Y{Ah?dnIbmfpP6+Ye+A)@FYz5za4{27KZs}kxyDJ$6w?L)IM8;tyd*>X-8Wk% zldp2`P!5u?y6@ds?LQPB?$lweiYGMpI=2@P#Vy+r;AWpCf4Ig1sAh`MeCFp|5#EnX z9HoA0MoQv*&_=!9jyvR%J}T`CT~=FOmOw_p>C&meYXgvn*#u&4{D(KK&!2Wowd(i# za;SPdO!Dhi@;$qD9Fl~AFD~7$ViftGkMunI>hCoZ%7UI{ZeA0LD70H4>QCKH9#!oRH@^rN< zUzW}_N}@QvsECG)*dij}XkZwFZc0ZkRorGvC4 zJTdF9zxbl7U4I$?0Df;F=JkUL8a2i2PBlWxvAP#QM5RWzevw7jSPcC)Pr)WB$%`GHwT{Ym05)AM^6Bzo$T}hhtCJs^*0fT7 zvpX(Ag#Jo64n*bG_zZUuhnMMsN{fDNxwDT(FqXdw{=OLWL@sexh998?FTOrb;EDq& zCeduM9JGFkX!U=8si0qO&AIYJzZGilHvC;t`gWq;Y)3N@A!MU#a%G`rCiX0$&jwn` z)(8TT*A38~dFW_MUQFa-)q!}AeG#F0VnoS-@RN`HkeZ^25@ZDQdt=zlNR8OsOXJZ2 z+Qzlq##|Gg&1_Jznuga6Fk^zDLAH0AG#Q*>R literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/native/protected.one b/corpus/protected-sections/native/protected.one new file mode 100644 index 0000000000000000000000000000000000000000..b91ec65c89a34abc3a6a95ca493a219d4a388b83 GIT binary patch literal 25848 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 iszW$nJH?}&+KcVD+&#<81hTq{7 z6yKu*b#u@=AFvGfzAUiJLH;ob_{XH5|VW0``NkM|~ zHH%({m@__RJED!q&x_hWEERdki7;=}ANXsZ#|^kF`XZ9E(4s^O!PT4bxrl!fuMV& zJx1Y>cD^bio{JD0?%~3pFQB2p3%rEZeI;CVwemCk>!FJW-!?IIeOWk+YwQ0(F zte&hNCaOB~bSJU7aXUJ1Q< z(4P0)zM*5yC&?pHMvlKOLx$X?WHNSQYpak^34WVa1Gwd-}!jUn!zp`bu-JPYt_Yuca%ICx;P;pSIL@^z?ZnnuO-v_ zMl;M&#uPP=P5*L0*RDQe>E1PtpJ<;x+rAx$z@HQ^u=C4WQ z*PQG!W$=jRKMP`(Iwm$F??ql6+sRfFyfT_nzwz?5nnL8=5>n^IjBAvHB}-3y3R`uE zB2(R3Pe+*RBbLCq!&Z%OpJO^x0S%lGQVvZ#>sp>q}z&Uh(_NwzRsgft2G-QkEVX*!a;-Han2ntAW0d^JC2Kw8JGSmCu{ z=_3lUJV%8e5Zr!bol2=8wQxpeW(t#MVCBwH8;3c~ffl>BF`gTIg-%fha|( z%d z0U|&^DuTmg>->}CCPe6_mEpi$td1CgQKuq$G5+Bzx#Ep<_a`mlC@oECQ&!hDRJQCs zt<1{gw6N24ynK#1L{W{ce=3k0H7~+-GXyv>g&kkQ=8*poGfCg1kL_sUi|%c z&!~Cv_wQ(;=Ec8%&unjAJUtx!S#Rka9`{#wWq#8Z7g!z>@cR8%QZOG5g1`R`8;OK_ z8^3=?4K=?$>vw1HTE$E2yGl;9=gzN_e8xanO%Rf)Xpgfp) z!SB!*z!VNS9lqv$F`oJe7G1jG^1TE*AIRyTUl{(26CDxzLERT|?k7&WQ~)6|ABy8} z&xa7Qv-Uce9V~3qaB!m`?)P8_RsJ9`A@28J2*rWEB9Ulg&A)MiQ)HS_FhGR8HI%0@DqxAUuJ|E@q~2n^Rs&&jcJb9 z-Hm~9;%-Qf@%!5eutp>yF8t8q-Y*tlhCd-GAz-riSw@)QMo2&hGWK2*g&CHFq%fA= z6XQQz7W^;hfqz8!M+5)&G;omp1M}IP_u-F(p#7tP3t{_EOOeV*g*FW$mPWujE z**8{wxiF)6T~4U;G9ZbBbgN3IizXJ*>6XmV^oQIB`;_jCZgoCOAN~3g!#$7JFs*cj zfk?mXr7@$B*m|}6gzR|HOiil`M?FXRFZdh- z0*vpLm9@CY~H_i1r?VOp!?UIRVLAm_c&|NF`F%l@~g*)380$yd?NH;a>PXNJCA$+0_4B% zzYgkOlzvEoys)of)D@E*k-~J>7oC*Kvb1=lclY}f2mQ|mDED4`cbu60Af+A{-@*4R XV88_`{{#PM;2#bAzovnM?En7&@z*)7 literal 0 HcmV?d00001 diff --git a/corpus/protected-sections/source/synthetic.one b/corpus/protected-sections/source/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..078f35f2c97a208e9ea6f29d5505e89d82883953 GIT binary patch literal 31512 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 C_M`a# literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/OneNote_DeletedPages.one b/corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/OneNote_DeletedPages.one new file mode 100644 index 0000000000000000000000000000000000000000..c9ad8fe1c0ff740dca1c8c948d03f277a54a118b GIT binary patch literal 14816 zcmeHO4Oo>$79Kza6qFRw?4lP!0Y#)0SI8xA;13}ntC^3kYl@QOnxgrGS$Q=y{7KM? zMYmea43~;UM7z2PJ*7n0CQ3il;}7gYGw(U)8~AqYGV_Z^3ytV%8W#5HF4PXyl`>N{q z$DEqh#^}OU_%iRc;mo^K$Gn4xfPC`gN&4OYieU$%6AMP~`}5WFJEsK^ZQBBt$=ZQR=bmy$%C3w6 z0F6Nm<3v5ZccOeRb5@BaYEAEyfHg>X9=&(aiVu9=Un}Ih1C^A#)0j~^zL;vS3TAZr zX34?&UBM$wo^_|MXD>Y~Xlm=`U$wp{n`I|)!SaYGn|VeW%T(o3B@=yYG=<+WNg@qq zj^1T7Oq{08bjqAhd(b1LTFTn_b_Icw2d%kmzFr2F-M}SpP+41Cziynzjb>ciUVTZT zLe_UX8)K&NPGYH@kQaIbyvF{Zgxr`RSW#jn%DNn`GzkH?%v9Z$+E$=#1^&lZfX=_s znSNZFY?fZf0)QH}>=qEC*)Dl2Z>nADbl<0)8%_)~yg6{x9~Uovxg$7RvP%JkW8iso zO?5(`->k$pI~U#OI_mpX!d?{tswqWK7WT>s4Y)}%M}2{JL^XC$=5mQ_u&}E)$i51D z{L869NBf_c9cSDz|HFqn56#q3ld&v?J;4^Rxokc?&0u<##-_2E^sL%q*kcUbY`gIW zS(K8V+cmAn7p{yO1#R>aj-im@tLAm|LGP4c-=F{MtGjZB zj~%mVaqy+ItTiXVZN84$^%CniA#Um1!0s6yx}Gz0j!mzgBi7LfvqmYEGGq=DrX6NUl6!9l5ksF&G$)H4R#ewy!aF1^dN z$ChnhVrtxk_F>#Yo2b2P)oitgZvY#AL$UK=Jt2>!ohKQM=-i3*rt_dmtT6rO^vmc; z1G=*(Np~0eGF>C(-%*YyA2ES)BIPlZAMs@YvDYt5=uF%Xu!W?>sfr#$CsCtrD;3N* zOwG(dF9vl^m?v7gD¥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 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/Open Notebook.onetoc2 b/corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..cc7642d044a9d41989e523aa612020a3fe187d04 GIT binary patch literal 6440 zcmeHL4@{J07=Nil;Bs-)2?(@-vdM^mc@+-E6cF!Jgqx&A;pFsOBudDiiz&4u3{NXP z${IsBs`D>X%s~Up`M9BXN6(CweP>P&EIMAX;FfFG^0^y>cq+6d%vyaReBkIeCPQ6UnS;6dcKha@rYnaVC7Y*AiuNciv$E&{dXTtJAERN`_)2DDDsd7GRcb2Y zP(1SznN{kEAnze6)SZYvl1o%(9?-pgY|PPjrT2M4urM~77Ij|`Q);F#yM`~=&3(aD z5UB3+J;{Ci?aY3Sk26xA(%dQ!Yl^dvoF91yUm@N{s9+t`h_Qa`ysiF^Q3Jx)6cz8& zn*nbI9+C`LRc!rJETS!fX^W_Cry3L)d24mwGnzvEo|We<3)J=iFvdhGIjop1V%h9< zR!;SNHkF=Bs6aC_BQvpAsa3|}$pfB@ftP4Br&yc~m`fCiPr*~@#TjsC@{!`*l?~HZ zojbL1e)B7(=>My8L7Z*G8IYEEF;~|eJ!3=F#puDkU$4j605^9!mClCG1IS2HNJTmc z#DLOEm@Ska1fj6fG?)nmX9ZQZKzfkepd#@)-UnHPTWa(6eCW7VLVtQ~kPr0nT)(aj z*F%rzdP3Bqdg#eqUlFHjfv)HJl8MEG(C2VH)>5*DnqKi{z?*^pCyOfY`1bVpJb{Bf&GC&pdKirn~C&a3bQul8)ON_M2` z(`$Z7Jy^SJV;Q(eiEF7_5ZD>JFJ1-TV%Z<2Eq3aH=g!=<+i89&u;UZ(Ef_V1Q>Htk z;+{T*+YB^bOb^09Fr07uK&&MG)F<&RsUGrn)e%}@KG~GkXo?+*i0jIElw5+)^sofs2FWwvmuE2mvks<3C|xL^cuaj8%6#X^ za6BABqeu$x3rB?e_c)T*-8j;E4{{&-QKa}T90#0TrB+*3&CTm+>poN0A{9#C3Uvzt u`#tXC|I>E?KE90;h(tOc(Z=h*X5g^9e-*HmaGNj=2y+pbT7EZ_c=`|g*qwy{ literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/after/Open Notebook.onetoc2 b/corpus/recycle-bin-view/candidate/after/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d5196250b23738e38ce031814e733d582a8a7bf4 GIT binary patch literal 11160 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 D;sr~1 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/after/Restored.one b/corpus/recycle-bin-view/candidate/after/Restored.one new file mode 100644 index 0000000000000000000000000000000000000000..779033e424f67d104bde8746df94c2c532f0ee2a GIT binary patch literal 6120 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 E6Z4`?rT_o{ literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Emptied.one b/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Emptied.one new file mode 100644 index 0000000000000000000000000000000000000000..97e399a976b788ad824d9841dc68835643f9231e GIT binary patch literal 6120 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 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Purged.one b/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Purged.one new file mode 100644 index 0000000000000000000000000000000000000000..24d0385f08b82f9cb4cc7fb88e5af6fd3a80b7b1 GIT binary patch literal 6072 zcmeHLe@xX?6u%D?P!Uj{O7?yFU~lveMf9E zu?4mS>g%{K?FrZbdpbGd6AM(vU>U=<|8s?|nR8UzmTjRqt%)-TOV~ z-gC}9=X}q(-`BnJ*^*sd2Q!*lo-XQ~S##cOYm2VFxID3Ge#x;ZBNs0eez53LZPdfn zy{QeIldEr>Z0ec?zAwt<{Q%B`Btah~U6PN#R#SWB!%Jx&d~&+ucJAr>wjIqmlE<+s zM0<+IVAto_8p-?Xp6s1^CeMwuHul#YNNYOyV)?!95~s8wY|4_zIrB~|+x^pbt6Jaa z_<8WIz*E2j|4R?3LBg&GC07yAQEl-y# zlv#wiGG3U!P=t8~7{s?eJICF(@AS45XVp^@p)Fgez3InKq+Tga-nk~LzT5hCEk(sf z3DpK3*SyrT|CNr2zO;toF01|OZ+B*Z*H9=b#0YZn-UCMiLj?)|HPewq%vn2CiT-|>`{LUE>qTex zNS?NP;8&x&szjAjH|zkIMkg=N7ZsXanq^YPZg>2+bq3b((mcrpOt@VU`>qa32@rf&I7ZRxQ7o1m`=!-+4C)E=A|jAV}(LTA1%BnA7Vz08|X zAmhW4cJqW>%8{Np5_z`6Ee+6Z1~~u$4+K2$ANK&>e>Dg{!QP%_RfLUIW2nBxiZRfa z%$_H$FO|-XRo7&erMc?k)b@n-POcoTFWFGXxTd$JU`c6QVp7HFxZn+2V^+(4Bpm47dDkfH<}i8-EBUUZvI^QQDs{L~43~mnYJBj%&(-Yhj+iU&)#vR>-Mz^8CW%m6M2W&&TZ2wTeiU!IA;>cz<8Ld1D1vY9zaiWXK3LS3Yx zaNxnAor&k<&QOmYzWZj#oCr(+mIH4ADc{!z;jn8kP);OB5negt@%~LvM0hYzfsDI~ zsAvVY0jq)6LF>mT^++A8DEcJ?_7WTzfu`EM4`Ej2AWaWE>XuMht$4p7hI#ZeX4G3` z5!UU%QShPEE%lf>O1Y^aR z$q4*CHrRlB|GIdgjE253(8F^(^~$qKY(^ZnpdJaq(sP-ipq0bb5m_%zGVuUBF<;Op;2BTdWxcqpGg(Yn zItCS!6dn{nCL=V)cc)8dveHnh7bNFY z-i!Y6+@X&B?{aaTzL*0O$h-K>_ZP;ve~oLMRyfU4R%Ob5usSOLa^d%re|@J31lHJ| zCm(Nbe`HEVi_mfdw zm3hkCB7`GP{WVZ}6uzJA3kWIeP#A literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Restored.one b/corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Restored.one new file mode 100644 index 0000000000000000000000000000000000000000..a37451b4003a799f0c36f76110f99b704544e387 GIT binary patch literal 6120 zcmeHKdu)_N5Z~)TTj=#T;3_R#X(g9XOvMUk0TDT_K3cJ*3Wy;HM|qY&A#e>)Q9mk? zVtpKl(3YnlZ-fH@ix@~yUImi^(G&@>D#1oU%PSNG>+g5px7XwRO7JhE-X!zw?#%4$ z?Ck8!x96W9@$y?W8?v|U7(A=G+mh3RA2~I%aLSy_1KT&>EZXEcCPJY9xe80Ch1avz zRd-l;>FBna2fzprnfoMB63uWUMrJp?@ZRou|VhaLe*f@crW2jq5v#Uigrj2)o=uDW9^#F}3mQr{1}JF+b0}VINg> zu?WQu9%YJ_EPi|M!JGj;YtHZMUYnGj0^T~0C=o5l#k~i%21W@a08S<|O=Biw90Poq zsfNr-%tixXt|72L@Y9~fpT`|6mG-qI5n!Drl+g9%Ry!XRO2Ud8#gFb8pRso1sQCrP zZnq>)o!#_R={~RU=4ytm22*e6^QMUs)h^XCsbf*4qwR1VYq)c2*W+>H%x*USo*PW) z0&0Pw`)x-CzyzP`?bqTI-g?dQdR6qU{%fzvL}SObE!9CT8a>@DnptzTrX&;dq`i!r zC?L;=E$!wGDaw|fIMC)~Rh=|Ivl-+tggp@Uz<=BWxc^E7KE^=JO123*vqp1uiy5P- zE?NB}wJsfxeAAxy!JH@ezgym}kLUd@l)PJAvLlaCrs7P)h}dCCIXgRk_siP;=_h5q z@-bBddIM#>GH`-cl7h3o%y(o{#^0jfBCxM9i6YhIQ1>=!TFj4gSJvkECLi|oT0C-v ztjTf~Cc-a~{<&9C%Vm9TM4gs(J=E${Ovw@jB3XY%oHRddg>BuySka_R_0hDH~-!#9+$e)yDPcL&V z-JSijC4qFk`cJwLto3!;iI-ul7fsF8`q`BY<(%)-Dt0C2>v^rY`TSQdsN~%sMU4S8Lg}xfaAM$8_sDfPGs?dXbAuH+kYcS(zKPj-6;6w{FRFo&6=XH{% z1p@M#P?*j5|3i%Sug^2&y0a2R@@!x$_)xAb*D`qMT6-cL-Z+tRI7Q>4#k8nhD4&Ly%QGVlsL{ zaJLztPX;Xy*(V?4E%^B zNeu%L5D(-9?gdZz^EC5Gy~bodVQLBF6EY`qqkxG(o>)xq%xaCvG({z;!OVCD6M$+d zX9{L|HKr2`c4LE?)f&?c27P6g%tO2I3L*u-x!Z7-DS-(rimfN?_t9Ynu z@2(VnQ4@B8&-lpZmrh$Tw7@<6iM-O^;(s``w`%2D3YTfZY#2}h;rBN6yT9^E_nk?e zq{L#c!F_LewgXfU_}&W5|1^QX96Y$tv+By&9 zB)y1eE{8gI`!4fM6>1G5g4*?XcfPmu@~(VeGPVdN#A)aX)Na9h%gsXo)T@nd9+&!f z1f0kBR<8E;$;DVtx1L?ReSA-`PDcY7EDTcKCk7bLhkV-2_~8=BMgBEMc8l_%8-}n4 P!XEgScpx|j(BwY>p_NX9 literal 0 HcmV?d00001 diff --git a/corpus/recycle-bin-view/candidate/before/Open Notebook.onetoc2 b/corpus/recycle-bin-view/candidate/before/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..b51f56283169257cf8d6382cccc4dc89cee63639 GIT binary patch literal 10656 zcmeHN4Nz4@6kgDhFzuP7C`eBS^CyB=`GaFBAoP$Bm}m@#Q86S*BAyzWN_G94!Au8| zkjw~6GD1y_6#vi^l_W}OOiV4Z8FO?}a{S4(=zM$kzW2E76=f_ZV*dNu0 zL-{U?B8G+)_UwDQ?92=AYip>ydM^2gc0Shm@h1-ldCZ=u8`Z+Lc;Nr&0mX$~@@Bs3 z*2^zkzPNtosFfXrCp>ISQ7Sy+f}Sc2d;gCU6=AsvM_h!?>l9PA`W1is*}+(APQ=CH zaVeG#n$F0Ps=m7iQoA z&<9ZgwWqc`K4