commit 6906fb973a9b3c45362c6572cea29e58e7a76ef0265c11d2ea2f05450f6b1bc8 Author: Alex Wied <543423+centromere@users.noreply.github.com> Date: Mon Jun 8 19:33:49 2026 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f848286 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +.cargo +.idea diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b4d1625 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,6053 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.0", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.18", +] + +[[package]] +name = "android-build" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fc9904ad2ad097c3c1cfe2eacaaf0fc24710936fa9ed941cb310b7c6ed2ab7" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "wl-clipboard-rs", + "x11rb", +] + +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.13.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.2", + "shlex 1.3.0", + "syn", +] + +[[package]] +name = "bit-set" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bitpacking" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a7139abd3d9cebf8cd6f920a389cf3dc9576172e32f4563f188cae3c3eb019" +dependencies = [ + "crunchy", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bon" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "census" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4c707c6a209cbe82d10abd08e1ea8995e9ea937d2550646e02798948992be0" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color-eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" +dependencies = [ + "bitflags 2.13.0", + "fontdb", + "harfrust", + "linebender_resource_handle", + "log", + "rangemap", + "rustc-hash 2.1.2", + "self_cell", + "skrifa 0.40.0", + "smol_str 0.3.6", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "cryoglyph" +version = "0.1.0" +source = "git+https://github.com/iced-rs/cryoglyph.git?rev=53ba3e879539d19ed8162942126a977ec896cc3b#53ba3e879539d19ed8162942126a977ec896cc3b" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "rustc-hash 2.1.2", + "wgpu", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" +dependencies = [ + "dtor", +] + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "datasketches" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c286de4e81ea2590afc24d754e0f83810c566f50a1388fa75ebd57928c0d9745" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downcast-rs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "git+https://github.com/iced-rs/winit.git?rev=05b8ff17a06562f0a10bb46e6eaacbe2a95cb5ed#05b8ff17a06562f0a10bb46e6eaacbe2a95cb5ed" + +[[package]] +name = "dtor" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastdivide" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afc2bd4d5a73106dd53d10d73d3401c2f32730ba2c0b93ddb888a8983680471" + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs4" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" +dependencies = [ + "rustix 1.1.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "gl-publisher" +version = "0.1.0" +dependencies = [ + "color-eyre", + "csv", + "gl-search", + "http", + "iced", + "ldp", + "oxigraph", + "rfd", + "tar", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + +[[package]] +name = "gl-search" +version = "0.1.0" +dependencies = [ + "tantivy", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "glow" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-allocator" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" +dependencies = [ + "ash", + "hashbrown 0.16.1", + "log", + "presser", + "thiserror 2.0.18", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.13.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "core_maths", + "read-fonts 0.37.0", + "smallvec", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "htmlescape" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iced" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "iced_core", + "iced_debug", + "iced_futures", + "iced_renderer", + "iced_runtime", + "iced_widget", + "iced_winit", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_core" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "bitflags 2.13.0", + "bytes", + "glam", + "lilt", + "log", + "num-traits", + "raw-window-handle", + "rustc-hash 2.1.2", + "smol_str 0.2.2", + "thiserror 2.0.18", + "web-time", +] + +[[package]] +name = "iced_debug" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "iced_core", + "iced_futures", + "log", +] + +[[package]] +name = "iced_futures" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "futures", + "iced_core", + "log", + "rustc-hash 2.1.2", + "tokio", + "wasm-bindgen-futures", + "wasmtimer", +] + +[[package]] +name = "iced_graphics" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "cosmic-text", + "half", + "iced_core", + "iced_futures", + "log", + "raw-window-handle", + "rustc-hash 2.1.2", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "iced_program" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "iced_graphics", + "iced_runtime", +] + +[[package]] +name = "iced_renderer" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "iced_graphics", + "iced_tiny_skia", + "iced_wgpu", + "log", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_runtime" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "bytes", + "iced_core", + "iced_futures", + "thiserror 2.0.18", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "bytemuck", + "cosmic-text", + "iced_debug", + "iced_graphics", + "kurbo", + "log", + "rustc-hash 2.1.2", + "softbuffer", + "tiny-skia", +] + +[[package]] +name = "iced_wgpu" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "cryoglyph", + "futures", + "glam", + "guillotiere", + "iced_debug", + "iced_graphics", + "log", + "rustc-hash 2.1.2", + "thiserror 2.0.18", + "wgpu", +] + +[[package]] +name = "iced_widget" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "iced_renderer", + "iced_runtime", + "log", + "num-traits", + "rustc-hash 2.1.2", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "iced_winit" +version = "0.15.0-dev" +source = "git+https://github.com/iced-rs/iced.git?branch=master#38d19f8f5a2be93fd1fd74a2e81df680ce3c1cc2" +dependencies = [ + "arboard", + "iced_debug", + "iced_program", + "iced_runtime", + "log", + "mundy", + "objc2 0.5.2", + "rustc-hash 2.1.2", + "thiserror 2.0.18", + "tracing", + "wasm-bindgen-futures", + "web-sys", + "winit", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-event-parser" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "574b0cd5e90ee2ba03a66d0611fc9a09c9a0c28b2ecc2dc8a181dd31a53ca5d7" + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "ldp" +version = "0.0.0" +dependencies = [ + "async-trait", + "base64", + "bytes", + "futures", + "http", + "oxigraph", + "parse_link_header", + "reqwest-middleware", + "slotmap", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "levenshtein_automata" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "bitflags 2.13.0", + "libc", + "plain", + "redox_syscall 0.8.1", +] + +[[package]] +name = "lilt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad" +dependencies = [ + "web-time", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "lz4_flex" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "measure_time" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c55d61e72fc3ab704396c5fa16f4c184db37978ae4e94ca8959693a235fc0e" +dependencies = [ + "log", +] + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "mundy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f32eb0db40f2df2bcfb05c93b8f73938d4c26ce9ac8881f1df0c8d3296921a73" +dependencies = [ + "android-build", + "async-io", + "cfg-if", + "dispatch", + "futures-channel", + "futures-lite", + "jni", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "pin-project-lite", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows", + "zbus", +] + +[[package]] +name = "murmurhash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" + +[[package]] +name = "naga" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.0", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "oneshot" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107" + +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "ownedbytes" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbd56f7631767e61784dc43f8580f403f4475bd4aaa4da003e6295e1bab4a7e" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "oxigraph" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ee83ce0422e6dce39a325810a9c66af71577a0a6fb5d887764bf3ae6304667" +dependencies = [ + "dashmap", + "getrandom 0.3.4", + "libc", + "oxiri", + "oxrdf", + "oxrdfio", + "oxrocksdb-sys", + "oxsdatatypes", + "rand", + "rustc-hash 2.1.2", + "siphasher", + "sparesults", + "spareval", + "spargebra", + "thiserror 2.0.18", +] + +[[package]] +name = "oxilangtag" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3b4eb570abd4a1dcb062c31fd37b832264d9dc7292c3e69acfe926c87b063f" +dependencies = [ + "serde", +] + +[[package]] +name = "oxiri" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4ed3a7192fa19f5f48f99871f2755047fabefd7f222f12a1df1773796a102" + +[[package]] +name = "oxjsonld" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e1380a504a8571763f13b8bcad629ff90d0300d47d8a519f3c6c599625840e" +dependencies = [ + "json-event-parser", + "oxiri", + "oxrdf", + "ryu-js", + "thiserror 2.0.18", +] + +[[package]] +name = "oxrdf" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0afd5c28e4a399c57ee2bc3accd40c7b671fdc7b6537499f14e95b265af7d7e0" +dependencies = [ + "hex", + "oxilangtag", + "oxiri", + "oxsdatatypes", + "rand", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "oxrdfio" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "696223589ecbcab06b1a5df9b527dc25b0c656160cca38752fdb3878a5d3dd03" +dependencies = [ + "oxjsonld", + "oxrdf", + "oxrdfxml", + "oxttl", + "thiserror 2.0.18", +] + +[[package]] +name = "oxrdfxml" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd5516ae083d09bc57ec65ed5ee97701481725de6ffaa83d968ab42a96157ba1" +dependencies = [ + "oxilangtag", + "oxiri", + "oxrdf", + "quick-xml 0.37.5", + "thiserror 2.0.18", +] + +[[package]] +name = "oxrocksdb-sys" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b7ff9cbbbc3cd628be238ca7f22b4c31ab85c3fc1349ff452fd9fac78615e60" +dependencies = [ + "bindgen", + "cc", +] + +[[package]] +name = "oxsdatatypes" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06fa874d87eae638daae9b4e3198864fe2cce68589f227c0b2cf5b62b1530516" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "oxttl" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03fd471bd54c23d76631c0a2677aa4bb308d905f6e491ee35dcb0732b7c5c6c" +dependencies = [ + "memchr", + "oxilangtag", + "oxiri", + "oxrdf", + "thiserror 2.0.18", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parse_link_header" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb9c7a76731a2792f9b97fb34c1e774fff008badcd449d61fcdacb7a912392b" +dependencies = [ + "http", + "lazy_static", + "regex", +] + +[[package]] +name = "peg" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aad070be5b63aa72103f2fcdd70a83adbd5e90112ce5b574171ff1c65501773" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd8ef6825cae95355031ae26a99b616a2a21f22ba2de0197c43dfb05acbe7ee" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7011d97b484a5ebdc4b1fdb3b12d5e4bbbea56e9d22b688f2e79e04b65a7d8a6" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.39.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "range-alloc" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" +dependencies = [ + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" +dependencies = [ + "bytemuck", + "core_maths", + "font-types", +] + +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "redox_syscall" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "reqwest-middleware" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc3f1384cffa4f274dad2d4ddd73aed32fed8f786d96c6be8aa4e5fd3c3b58" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "thiserror 2.0.18", + "tower-service", +] + +[[package]] +name = "rfd" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "js-sys", + "libc", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "percent-encoding", + "pollster", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rust-stemmers" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "sketches-ddsketch" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e40b6cf54d988dc1a2223531b969c9a9e30906ad90ef64890c27b4bfbb46ea" +dependencies = [ + "serde", +] + +[[package]] +name = "skrifa" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" +dependencies = [ + "bytemuck", + "read-fonts 0.37.0", +] + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts 0.39.2", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.13.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "smol_str" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "fastrand", + "js-sys", + "memmap2", + "ndk", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "raw-window-handle", + "redox_syscall 0.5.18", + "rustix 1.1.4", + "tiny-xlib", + "tracing", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.61.2", + "x11rb", +] + +[[package]] +name = "sparesults" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e13362decdcbeb3fefadff1631238c835c112027221e83d217cc5779f5a81c2" +dependencies = [ + "json-event-parser", + "memchr", + "oxrdf", + "quick-xml 0.37.5", + "thiserror 2.0.18", +] + +[[package]] +name = "spareval" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8eab80b96dc836e4cf8fda72daa67ccc0244dc5303be5d4566e8fd04adbdde5" +dependencies = [ + "hex", + "json-event-parser", + "md-5", + "oxiri", + "oxrdf", + "oxsdatatypes", + "rand", + "regex", + "rustc-hash 2.1.2", + "sha1", + "sha2", + "sparesults", + "spargebra", + "sparopt", + "thiserror 2.0.18", +] + +[[package]] +name = "spargebra" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46715eb957d1fe960cbbc0b713da8f78e2cb19df315b48fb09c9467a1c84f656" +dependencies = [ + "oxilangtag", + "oxiri", + "oxrdf", + "peg", + "rand", + "thiserror 2.0.18", +] + +[[package]] +name = "sparopt" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed7a854b8ea67618f8ce69aabb0e904d7704226060e9d5a2930eb3136c3fa3b" +dependencies = [ + "oxrdf", + "rand", + "spargebra", +] + +[[package]] +name = "spirv" +version = "0.4.0+sdk-1.4.341.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "swash" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1804632b66a35ca2b1d277eb0a138e10f46cb365b9a6d297e876b69ef79de43" +dependencies = [ + "skrifa 0.42.1", + "yazi", + "zeno", +] + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "tantivy" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edde6a10743fff00a4e1a8c9ef020bf5f3cbad301b7d2d39f2b07f123c4eac07" +dependencies = [ + "aho-corasick", + "arc-swap", + "base64", + "bitpacking", + "bon", + "byteorder", + "census", + "crc32fast", + "crossbeam-channel", + "datasketches", + "downcast-rs 2.0.2", + "fastdivide", + "fnv", + "fs4", + "htmlescape", + "itertools 0.14.0", + "levenshtein_automata", + "log", + "lru", + "lz4_flex", + "measure_time", + "memmap2", + "once_cell", + "oneshot", + "rayon", + "regex", + "rust-stemmers", + "rustc-hash 2.1.2", + "serde", + "serde_json", + "sketches-ddsketch", + "smallvec", + "tantivy-bitpacker", + "tantivy-columnar", + "tantivy-common", + "tantivy-fst", + "tantivy-query-grammar", + "tantivy-stacker", + "tantivy-tokenizer-api", + "tempfile", + "thiserror 2.0.18", + "time", + "typetag", + "uuid", + "winapi", +] + +[[package]] +name = "tantivy-bitpacker" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fed3d674429bcd2de5d0a6d1aa5495fed8afd9c5ecce993019caf7615f53fa4" +dependencies = [ + "bitpacking", +] + +[[package]] +name = "tantivy-columnar" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c57166f5bcfd478f370ab8445afb4678dce44801fa5ce5c451aaf8595583c5dc" +dependencies = [ + "downcast-rs 2.0.2", + "fastdivide", + "itertools 0.14.0", + "serde", + "tantivy-bitpacker", + "tantivy-common", + "tantivy-sstable", + "tantivy-stacker", +] + +[[package]] +name = "tantivy-common" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf10915aa75da3c3b0d58b58853d2e889efbaf32d4982a4c3715dde6bba23e5" +dependencies = [ + "async-trait", + "byteorder", + "ownedbytes", + "serde", + "time", +] + +[[package]] +name = "tantivy-fst" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d60769b80ad7953d8a7b2c70cdfe722bbcdcac6bccc8ac934c40c034d866fc18" +dependencies = [ + "byteorder", + "regex-syntax", + "utf8-ranges", +] + +[[package]] +name = "tantivy-query-grammar" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfadb8526b6da90704feb293b0701a6aae62ea14983143344be2dc5ce30f1d82" +dependencies = [ + "fnv", + "nom 7.1.3", + "ordered-float", + "serde", + "serde_json", +] + +[[package]] +name = "tantivy-sstable" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a2cfc3ac5164cbadc28965ffb145a8f47582a60ae5897859ad8d4316596c606" +dependencies = [ + "futures-util", + "itertools 0.14.0", + "tantivy-bitpacker", + "tantivy-common", + "tantivy-fst", + "zstd", +] + +[[package]] +name = "tantivy-stacker" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbb051742da9d53ca9e8fff43a9b10e319338b24e2c0e15d0372df19ffeb951" +dependencies = [ + "murmurhash32", + "tantivy-common", +] + +[[package]] +name = "tantivy-tokenizer-api" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac258c2c6390673f2685813afeeafcb8c4e0ee7de8dd3fc46838dcc37263f98" +dependencies = [ + "serde", +] + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" +dependencies = [ + "as-raw-xcb-connection", + "ctor", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.0", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" +dependencies = [ + "crossbeam-channel", + "symlink", + "thiserror 2.0.18", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tree_magic_mini" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6" +dependencies = [ + "memchr", + "nom 8.0.0", + "petgraph", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "typetag" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a897b12c6c1151ad0b138b8db50252dc301f93bc3b027db05eec82aeed298c" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf808357c6ed7e13ba0f3277ec8d8f21b2d501274895104263985330c726c1c5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.13.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wasmtimer" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "wayland-backend" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +dependencies = [ + "cc", + "downcast-rs 1.2.1", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +dependencies = [ + "bitflags 2.13.0", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.13.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.13.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +dependencies = [ + "proc-macro2", + "quick-xml 0.39.4", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250" +dependencies = [ + "arrayvec", + "bitflags 2.13.0", + "bytemuck", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.13.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-naga-bridge", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e51b5447e144b3dbba4feb01f80f4fa21696fa0cd99afb2c3df1affd6fdb28" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3487cd6293a963bc5c0c0396f6a2192043c50003c07f4efdccbad3d90ec9d819" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb01076d0aa08b0ba9bd741e178b5cc440f5abe99d9581323a4c8b5d1a1916" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.13.0", + "block2 0.6.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "glow", + "glutin_wgl_sys", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "naga", + "ndk-sys", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "raw-window-metal", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "wayland-sys", + "web-sys", + "wgpu-naga-bridge", + "wgpu-types", + "windows", + "windows-core", + "windows-result", +] + +[[package]] +name = "wgpu-naga-bridge" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02" +dependencies = [ + "naga", + "wgpu-types", +] + +[[package]] +name = "wgpu-types" +version = "29.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "js-sys", + "log", + "raw-window-handle", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winit" +version = "0.30.8" +source = "git+https://github.com/iced-rs/winit.git?rev=05b8ff17a06562f0a10bb46e6eaacbe2a95cb5ed#05b8ff17a06562f0a10bb46e6eaacbe2a95cb5ed" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.13.0", + "block2 0.5.1", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str 0.2.2", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.13.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "wl-clipboard-rs" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9651471a32e87d96ef3a127715382b2d11cc7c8bb9822ded8a7cc94072eb0a3" +dependencies = [ + "libc", + "log", + "os_pipe", + "rustix 1.1.4", + "thiserror 2.0.18", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.4", +] + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "yazi" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" + +[[package]] +name = "zerocopy" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zvariant" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", + "winnow", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8313632 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,30 @@ +[workspace] +resolver = "2" +members = [ + "publish", + "search", +] + +[workspace.dependencies] +gl-search = { path = "search" } +ldp = { path = "../../ldp/ldp", features = ["keyed"] } + +async-trait = "0.1" +base64 = "0.22" +bytes = "1.11" +color-eyre = "0.6" +futures = "0.3" +http = "1.4" +iced = { git = "https://github.com/iced-rs/iced.git", branch = "master", features = ["tokio"] } +oxigraph = { version = "0.5", features = ["rdf-12"] } +oxilangtag = "0.1" +parse_link_header = "0.4" +rfd = "0.17" +slotmap = "1.1" +tantivy = "0.26" +tar = "0.4" +thiserror = "2.0" +tokio = { version = "1.52", features = ["rt", "rt-multi-thread", "macros", "fs"] } +tracing = "0.1" +tracing-appender = "0.2" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/publish/Cargo.toml b/publish/Cargo.toml new file mode 100644 index 0000000..a4c9d03 --- /dev/null +++ b/publish/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "gl-publisher" +version = "0.1.0" +edition = "2024" + +[dependencies] +#gl-ldp.workspace = true +gl-search.workspace = true +ldp.workspace = true + +color-eyre.workspace = true +csv = "1.4" +http.workspace = true +iced.workspace = true +rfd.workspace = true +oxigraph.workspace = true +tar.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-appender.workspace = true +tracing-subscriber.workspace = true \ No newline at end of file diff --git a/publish/src/app.rs b/publish/src/app.rs new file mode 100644 index 0000000..b20be90 --- /dev/null +++ b/publish/src/app.rs @@ -0,0 +1,759 @@ +use crate::rdf::ontology; +use crate::rdf::ontology::Ontology; +use crate::rdf::term_helper::{TermHelper, TermHelperMut}; +use gl_search::{Schema, SearchDocument, SearchIndex}; +use http::StatusCode; +use iced::alignment::Horizontal; +use iced::widget::button::Style; +use iced::widget::grid::Sizing; +use iced::widget::{ + button, center, column, combo_box, container, grid, mouse_area, opaque, row, scrollable, space, + stack, table, text, text_input, toggler, +}; +use iced::window::Settings; +use iced::{Background, Color, Element, Length, Subscription, Task, color, window}; +use ldp::middleware::BasicAuthMiddleware; +use ldp::model::{KeyedDataset, QuadKey}; +use ldp::reqwest::{Client, Url}; +use ldp::reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; +use ldp::traverse::Traverse; +use ldp::{RdfSource, RdfSourceUpdateResponse, ResourceRequestBuilder, SerializationOptions}; +use oxigraph::io::RdfFormat; +use oxigraph::model::vocab::rdf; +use oxigraph::model::{BaseDirection, Dataset, NamedNode, Quad, Term, TermRef}; +use tracing::{debug, error}; + +#[derive(Debug, Clone)] +pub(crate) enum Message { + None, + Traverse, + IndexRdfSource(RdfSource), + CommitIndex, + WindowClosed(window::Id), + URLInputChanged(String), + URLInputSubmitted, + FetchDocument(Url), + LoadDocument(RdfSource>), + ShowNewDocumentButtons, + HideNewDocumentButtons, + ShowError(String), + AddRow(Option), + DeleteRow(QuadKey), + DeleteAllRows, + OpenQueryWindow(SearchResultClickAction), + HoverRow(QuadKey), + UnhoverRow(QuadKey), + QueryUpdated(String), + SearchResultClicked(NamedNode), + DatatypeUpdated(QuadKey, Option), + LanguageUpdated(QuadKey, Option), + ValueUpdated(QuadKey, String), + DirectionToggled(QuadKey, BaseDirection), + SaveGraph(bool), + ShowOverwriteConfirmationModal, + HideOverwriteConfirmationModal, + ConfirmOverwrite, + NewDocument(NamedNode), + ResetState, +} + +#[derive(Default, Debug, Clone)] +pub(crate) struct RowState { + read_only: bool, + datatype_state: combo_box::State, +} + +#[derive(Debug, Clone)] +pub(crate) enum SearchResultClickAction { + URLInput, + Predicate(QuadKey), + Object(QuadKey), +} + +struct SearchState { + window_id: window::Id, + action: SearchResultClickAction, + query: String, + results: Vec, +} + +pub(crate) struct Publisher { + http_client: ClientWithMiddleware, + ontology: Ontology, + abbreviated_datatypes: Vec, + window_id: window::Id, + url_input: String, + document: RdfSource>, + hovered_row: Option, + search_state: Option, + index: SearchIndex, + show_overwrite_confirmation: bool, + modified: bool, + show_new_document_buttons: bool, +} + +impl Publisher { + pub(crate) fn new() -> (Self, Task) { + let ontology = Ontology::builder() + .with_default_ontologies() + .build() + .expect("Failed to build ontology"); + + let mut index = SearchIndex::builder() + .with_path("/home/alex/Documents/Index") + .build() + .expect("Failed to build search index"); + + index.remove_all_annotated_iris(); + ontology.for_each_annotated_iri(|iri, label, comment| { + index + .add_annotated_iri(iri, label, comment) + .expect("Unable to add annotated IRI to search index"); + }); + index.commit().expect("Unable to commit ontology to index"); + + let mut abbreviated_datatypes = ontology + .datatypes() + .map(|node| ontology.abbreviate(node)) + .collect::>(); + abbreviated_datatypes.sort(); + + let (id, task) = window::open(Settings::default()); + + let client = Client::new(); + let http_client = ClientBuilder::new(client.clone()) + .with(BasicAuthMiddleware::new( + "fedoraAdmin".to_string(), + Some("fedoraAdmin".to_string()), + )) + .build(); + + let url_input = "http://fedora.quill.lan/rest/".to_string(); + let document = RdfSource::new(Url::parse(&url_input).unwrap()); + + ( + Self { + http_client, + ontology, + abbreviated_datatypes, + window_id: id, + url_input, + document, + hovered_row: None, + search_state: None, + index, + show_overwrite_confirmation: false, + modified: false, + show_new_document_buttons: false, + }, + task.map(|_| Message::None), + ) + } + + pub(crate) fn update(&mut self, message: Message) -> Task { + let mut task = Task::none(); + debug!(?message); + + match message { + Message::Traverse => { + let client = self.http_client.clone(); + let root = Url::parse(&self.url_input).expect("Invalid URL"); + let stream = Traverse::new(client, root, None); + task = Task::run(stream, |result| match result { + Ok(rdf_source) => Message::IndexRdfSource(rdf_source), + Err(err) => Message::ShowError(format!("Unable to fetch RDF Source: {err}")), + }) + .chain(Task::done(Message::CommitIndex)); + } + Message::IndexRdfSource(rdf_source) => { + let catalog_id = rdf_source + .classes() + .filter_map(|class| self.ontology.catalog_id(&class.into_owned())) + .next(); + if let Some(catalog_id) = catalog_id { + let mut document = SearchDocument::new(); + document.add_u64(Schema::type_field(), catalog_id); + document.add_text(Schema::iri_field(), rdf_source.origin()); + + for quad in rdf_source.dataset() { + if let Some(field_name) = + self.ontology.field_name(&quad.predicate.into_owned()) + && let TermRef::Literal(literal) = quad.object + { + let field = Schema::schema() + .get_field(&field_name) + .expect("Field not found in schema"); + document.add_text(field, literal.value().to_lowercase()); + } + } + + self.index + .add(document) + .expect("Unable to add document to search index"); + } + } + Message::CommitIndex => { + if let Err(err) = self.index.commit() { + task = Task::done(Message::ShowError(format!("Unable to commit index: {err}"))); + } + } + Message::WindowClosed(id) => { + if self.window_id == id { + task = iced::exit(); + } else { + self.search_state = None; + } + } + Message::URLInputChanged(value) => { + self.url_input = value; + } + Message::URLInputSubmitted => { + let url = Url::parse(&self.url_input).expect("Invalid URL"); + task = Task::done(Message::DeleteAllRows) + .chain(Task::done(Message::ResetState)) + .chain(Task::done(Message::FetchDocument(url))); + } + Message::FetchDocument(url) => { + let client = self.http_client.clone(); + task = Task::future(async { + let request = ResourceRequestBuilder::with_client_and_url(client, url) + .accept_rdf_format(RdfFormat::Turtle) + .follow_described_by(true) + .build(); + + match request.send().await { + Ok(resource) => match resource.into_rdf_source().await { + Ok(rdf_source) => Message::LoadDocument(rdf_source), + Err(err) => { + Message::ShowError(format!("Unable to parse response: {err}")) + } + }, + Err(ldp::Error::Reqwest(err)) => { + if err.status() == Some(StatusCode::NOT_FOUND) { + Message::ShowNewDocumentButtons + } else { + Message::ShowError(err.to_string()) + } + } + Err(err) => Message::ShowError(format!("Request failed: {err}")), + } + }); + } + Message::LoadDocument(document) => { + let messages = document + .dataset() + .quads + .keys() + .map(|key| Message::AddRow(Some(key))); + task = Task::batch(messages.map(Task::done)).chain(Task::done(Message::ResetState)); + + self.document = document; + } + Message::ShowError(error) => { + error!(error); + } + Message::AddRow(None) => { + let quad = self.document.new_quad(); + let key = self.document.dataset_mut().quads.insert(quad); + task = Task::done(Message::AddRow(Some(key))); + } + Message::AddRow(Some(key)) => { + let quad = self + .document + .dataset() + .quads + .get(key) + .expect("Failed to get quad from document"); + let read_only = self.ontology.is_read_only(quad.as_ref()); + let term = TermHelper::new(&quad.object); + let datatype = term + .datatype() + .map(|datatype| self.ontology.abbreviate(datatype)); + let datatype_state = combo_box::State::with_selection( + self.abbreviated_datatypes.clone(), + datatype.as_ref(), + ); + let state = RowState { + read_only, + datatype_state, + }; + self.document + .dataset_mut() + .associated_data + .insert(key, state); + self.modified = true; + } + Message::DeleteRow(key) => { + self.document.dataset_mut().remove(key); + self.modified = true; + } + Message::DeleteAllRows => { + self.document.dataset_mut().clear(); + self.modified = true; + } + Message::OpenQueryWindow(action) => { + if let Some(search_state) = &mut self.search_state { + search_state.action = action; + } else { + let (id, window_task) = window::open(Settings::default()); + self.search_state = Some(SearchState { + window_id: id, + action, + query: String::new(), + results: Vec::new(), + }); + task = window_task.map(|_| Message::None) + } + } + Message::QueryUpdated(new_query) => { + if let Some(search_state) = &mut self.search_state { + search_state.results = self + .index + .query(7, new_query.as_str(), Schema::default_fields()) + .expect("Error encountered while querying index") + .iter() + .map(NamedNode::new_unchecked) + .collect(); + search_state.query = new_query; + }; + } + Message::SearchResultClicked(node) => { + if let Some(search_state) = &self.search_state { + match search_state.action { + SearchResultClickAction::URLInput => { + task = Task::done(Message::URLInputChanged(node.as_str().to_string())) + .chain(Task::done(Message::URLInputSubmitted)); + } + SearchResultClickAction::Predicate(key) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + quad.predicate = node; + } + } + SearchResultClickAction::Object(key) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + quad.object = Term::NamedNode(node); + } + } + } + task = task.chain(window::close(search_state.window_id)); + self.modified = true; + } + } + Message::HoverRow(index) => { + self.hovered_row = Some(index); + } + Message::UnhoverRow(index) if self.hovered_row == Some(index) => { + self.hovered_row = None; + } + Message::DatatypeUpdated(key, Some(maybe_prefixed_iri)) => { + let node = self + .ontology + .expand(&maybe_prefixed_iri) + .unwrap_or(NamedNode::new_unchecked(&maybe_prefixed_iri)); + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_datatype(Some(node)); + self.modified = true; + } + } + Message::DatatypeUpdated(key, None) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_datatype(None); + self.modified = true; + } + } + Message::LanguageUpdated(key, Some(language)) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_language(language.as_str()); + self.modified = true; + } + } + Message::LanguageUpdated(key, None) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_language("en"); + self.modified = true; + } + } + Message::ValueUpdated(key, value) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_value(value); + self.modified = true; + } + } + Message::DirectionToggled(key, direction) => { + if let Some(quad) = self.document.dataset_mut().quads.get_mut(key) { + let mut term = TermHelperMut::new(&mut quad.object); + term.set_direction(direction); + self.modified = true; + } + } + Message::SaveGraph(overwrite) => { + let client = self.http_client.clone(); + let options = SerializationOptions::from_format(RdfFormat::Turtle) + .with_filter(self.ontology.exclude_read_only_predicate()); + let request = self + .document + .to_update(options) + .expect("Failed to generate PUT request"); + let url = self.document.origin().clone(); + task = Task::future(async move { + match request.send(client, overwrite).await { + Ok(RdfSourceUpdateResponse::Success) => Message::FetchDocument(url), + Ok(RdfSourceUpdateResponse::DocumentModified(_)) => { + Message::ShowOverwriteConfirmationModal + } + Err(err) => Message::ShowError(format!("Failed to save graph: {err}")), + } + }); + } + Message::ShowOverwriteConfirmationModal => { + self.show_overwrite_confirmation = true; + } + Message::HideOverwriteConfirmationModal => { + self.show_overwrite_confirmation = false; + } + Message::ConfirmOverwrite => { + task = Task::done(Message::SaveGraph(true)) + .chain(Task::done(Message::HideOverwriteConfirmationModal)); + } + Message::ShowNewDocumentButtons => { + self.show_new_document_buttons = true; + } + Message::HideNewDocumentButtons => { + self.show_new_document_buttons = false; + } + Message::NewDocument(class) => { + let url = Url::parse(self.url_input.as_str()).expect("Invalid URL"); + let subject = NamedNode::new_unchecked(url.as_str()); + self.document = RdfSource::new(url); + + let quads = self + .ontology + .template_triples(class.as_ref(), subject.as_ref()) + .map(|triples| { + triples + .map(|triple| self.document.quad_from_triple(triple)) + .collect::>() + }); + + if let Some(quads) = quads { + let new_keys = self.document.dataset_mut().extend(quads.into_iter()); + let messages = new_keys.map(|triple| Message::AddRow(Some(triple))); + task = Task::done(Message::HideNewDocumentButtons) + .chain(Task::batch(messages.map(Task::done))); + } + } + Message::ResetState => { + self.modified = false; + self.show_new_document_buttons = false; + self.show_overwrite_confirmation = false; + } + _ => {} + } + task + } + + pub(crate) fn title(&self, _window: window::Id) -> String { + "Graph of Liberty Publisher".to_string() + } + + pub(crate) fn subscription(&self) -> Subscription { + window::close_events().map(Message::WindowClosed) + } + + fn view_row<'a>( + &'a self, + key: QuadKey, + triple: &'a Quad, + state: &'a RowState, + ) -> Element<'a, Message> { + const BUTTON_WIDTH: Length = Length::Fixed(35.0); + let delete_button = button("\u{274c}") + .style(|_, _| Style::default().with_background(Background::Color(color!(255, 0, 0)))) + .on_press(Message::DeleteRow(key)); + + let button_area = if self.hovered_row == Some(key) && !state.read_only { + container(delete_button).width(BUTTON_WIDTH) + } else { + container(space()).width(BUTTON_WIDTH) + }; + + let property_label = self + .ontology + .label(triple.predicate.as_ref()) + .unwrap_or(self.ontology.abbreviate(triple.predicate.as_ref()).as_str()) + .to_string(); + + let property: Element = if state.read_only { + text(property_label).into() + } else { + button(text(property_label)) + .on_press(Message::OpenQueryWindow( + SearchResultClickAction::Predicate(key), + )) + .style(button::text) + .into() + }; + + let term = TermHelper::new(&triple.object); + + let value_label = term.value_as_named_node().and_then(|node| { + self.ontology + .label(node) + .map(|label| container(text(label))) + }); + + let value = term + .value_as_named_node() + .map(|node| self.ontology.abbreviate(node)) + .unwrap_or(term.value().to_string()); + + let value_alignment = term + .direction() + .map(|direction| match direction { + BaseDirection::Ltr => Horizontal::Left, + BaseDirection::Rtl => Horizontal::Right, + }) + .unwrap_or(Horizontal::Left); + + let value_input_base = text_input("Value", value.as_str()).align_x(value_alignment); + + let value_input = if !state.read_only { + let is_named_node = term.is_named_node(); + value_input_base.on_input(move |input| { + let expanded_input = if is_named_node { + self.ontology + .expand(input.as_str()) + .map(|node| node.as_str().to_string()) + .unwrap_or(input) + } else { + input + }; + + Message::ValueUpdated(key, expanded_input) + }) + } else { + value_input_base + }; + + let search_launcher = if term.is_named_node() && !state.read_only { + Some(container( + button(text("\u{1f50e}")) + .on_press(Message::OpenQueryWindow(SearchResultClickAction::Object( + key, + ))) + .style(button::text), + )) + } else { + None + }; + + let selected_datatype = term.datatype().map(|node| self.ontology.abbreviate(node)); + let datatype_selector: Element = if state.read_only { + selected_datatype.map(text).into() + } else { + combo_box( + &state.datatype_state, + "Datatype", + selected_datatype.as_ref(), + move |selection| Message::DatatypeUpdated(key, Some(selection)), + ) + .on_input(move |input| { + let value = if input.is_empty() { None } else { Some(input) }; + Message::DatatypeUpdated(key, value) + }) + .into() + }; + + let language_input = match term.datatype() { + Some(rdf::LANG_STRING) | Some(rdf::DIR_LANG_STRING) => Some(container( + text_input("Language", term.language().unwrap_or("en")).on_input(move |input| { + let value = if input.is_empty() { None } else { Some(input) }; + Message::LanguageUpdated(key, value) + }), + )), + _ => None, + }; + + let direction_slider = term + .direction() + .map(|direction| match direction { + BaseDirection::Ltr => toggler(false), + BaseDirection::Rtl => toggler(true), + }) + .map(|toggler| { + container(row![ + text("LTR"), + toggler.on_toggle(move |new_state| { + let direction = if new_state { + BaseDirection::Rtl + } else { + BaseDirection::Ltr + }; + Message::DirectionToggled(key, direction) + }), + text("RTL"), + ]) + }); + + let row = row![ + button_area, + property, + value_label, + value_input, + search_launcher, + datatype_selector, + language_input, + direction_slider, + ]; + + mouse_area(row) + .on_enter(Message::HoverRow(key)) + .on_exit(Message::UnhoverRow(key)) + .into() + } + + fn view_new_entity_buttons( + &self, + entities: impl Iterator, + ) -> Element<'_, Message> { + let buttons = entities.map(|entity| { + let label = self + .ontology + .label(entity.as_ref()) + .map(|label| label.to_string()) + .unwrap_or(entity.as_str().to_string()); + button(text(label)) + .on_press(Message::NewDocument(entity)) + .into() + }); + + grid(buttons) + .height(Sizing::EvenlyDistribute(Length::Shrink)) + .into() + } + + pub(crate) fn view(&self, window: window::Id) -> Element<'_, Message> { + if let Some(search_state) = &self.search_state + && search_state.window_id == window + { + let search_input = + text_input("Query", &search_state.query).on_input(Message::QueryUpdated); + + let label_column = table::column("Label", |result: &NamedNode| { + let label = self.ontology.label(result.as_ref()).unwrap_or("Unknown"); + + button(text(label)) + .on_press(Message::SearchResultClicked(result.clone())) + .style(button::text) + }); + let iri_column = table::column("IRI", |result: &NamedNode| { + button(text(result.as_str())) + .on_press(Message::SearchResultClicked(result.clone())) + .style(button::text) + }); + let results_table = + scrollable(table([label_column, iri_column], &search_state.results)); + + return column![search_input, results_table].into(); + } + + let add_row_button = button("Add row").on_press(Message::AddRow(None)); + + let index_button = button("Index").on_press(Message::Traverse); + + let search_launcher = button(text("\u{1f50e}")) + .on_press(Message::OpenQueryWindow(SearchResultClickAction::URLInput)) + .style(button::text); + + let mut rows: Vec> = vec![]; + rows = self + .document + .dataset() + .iter_both() + .map(|(key, quad, state)| self.view_row(key, quad, state)) + .collect(); + + let body: Element = if self.show_new_document_buttons { + column![ + self.view_new_entity_buttons(self.ontology.subclass_of(ontology::GL_ENTITY)), + self.view_new_entity_buttons(self.ontology.subclass_of(ontology::RDA_ENTITY)), + ] + .into() + } else { + column(rows).into() + }; + + let save_button_base = button(text("\u{1f4be}")); + let save_button = if self.modified { + save_button_base.on_press(Message::SaveGraph(false)) + } else { + save_button_base + }; + + let content = column![ + row![ + add_row_button, + index_button, + search_launcher, + text_input("URL", &self.url_input) + .on_input(Message::URLInputChanged) + .on_submit(Message::URLInputSubmitted), + save_button, + ], + scrollable(body), + space::vertical(), + ]; + + if self.show_overwrite_confirmation { + let confirmation_modal = container(column![ + text("The resource has changed since it was fetched. Overwrite?"), + row![ + button(text("Yes")) + .style(button::danger) + .on_press(Message::ConfirmOverwrite), + space::horizontal(), + button(text("No")).on_press(Message::HideOverwriteConfirmationModal), + ], + ]) + .width(Length::Shrink); + + modal(content, confirmation_modal, Message::None) + } else { + content.into() + } + } +} + +fn modal<'a, Message>( + base: impl Into>, + content: impl Into>, + on_blur: Message, +) -> Element<'a, Message> +where + Message: Clone + 'a, +{ + stack![ + base.into(), + opaque( + mouse_area(center(opaque(content)).style(|_theme| { + container::Style { + background: Some( + Color { + a: 0.8, + ..Color::BLACK + } + .into(), + ), + ..container::Style::default() + } + })) + .on_press(on_blur) + ) + ] + .into() +} diff --git a/publish/src/error.rs b/publish/src/error.rs new file mode 100644 index 0000000..8835ad5 --- /dev/null +++ b/publish/src/error.rs @@ -0,0 +1,21 @@ +use thiserror::Error; + +pub type Result = std::result::Result; + +#[derive(Error, Debug)] +pub(crate) enum Error { + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error(transparent)] + IriParse(#[from] oxigraph::model::IriParseError), + + #[error(transparent)] + RdfSyntax(#[from] oxigraph::io::RdfSyntaxError), + + #[error(transparent)] + ParseInt(#[from] std::num::ParseIntError), + + #[error(transparent)] + Search(#[from] gl_search::SearchError), +} diff --git a/publish/src/main.rs b/publish/src/main.rs new file mode 100644 index 0000000..13d6554 --- /dev/null +++ b/publish/src/main.rs @@ -0,0 +1,25 @@ +mod app; +mod error; +mod rdf; +mod windows; + +use crate::app::Publisher; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::{EnvFilter, fmt}; + +fn main() -> color_eyre::Result<()> { + let appender = tracing_appender::rolling::never("/tmp", "publisher-log"); + tracing_subscriber::registry() + .with(fmt::layer().with_writer(appender)) + .with(EnvFilter::from_default_env()) + .init(); + color_eyre::install()?; + + let application = iced::daemon(Publisher::new, Publisher::update, Publisher::view) + .title(Publisher::title) + .subscription(Publisher::subscription); + + application.run()?; + Ok(()) +} diff --git a/publish/src/rdf/mod.rs b/publish/src/rdf/mod.rs new file mode 100644 index 0000000..ffae413 --- /dev/null +++ b/publish/src/rdf/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod ontology; +pub(crate) mod term_helper; diff --git a/publish/src/rdf/ontologies/22-rdf-syntax-ns.ttl b/publish/src/rdf/ontologies/22-rdf-syntax-ns.ttl new file mode 100644 index 0000000..fa9eec0 --- /dev/null +++ b/publish/src/rdf/ontologies/22-rdf-syntax-ns.ttl @@ -0,0 +1,154 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix dc: . + + a owl:Ontology ; + dc:title "The RDF Concepts Vocabulary (RDF)" ; + dc:date "2019-12-16" ; + dc:description "This is the RDF Schema for the RDF vocabulary terms in the RDF Namespace, defined in RDF 1.1 Concepts." . + +rdf:HTML a rdfs:Datatype ; + rdfs:subClassOf rdfs:Literal ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:label "HTML" ; + rdfs:comment "The datatype of RDF literals storing fragments of HTML content" . + +rdf:langString a rdfs:Datatype ; + rdfs:subClassOf rdfs:Literal ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:label "langString" ; + rdfs:comment "The datatype of language-tagged string values" . + +rdf:PlainLiteral a rdfs:Datatype ; + rdfs:isDefinedBy ; + rdfs:subClassOf rdfs:Literal ; + rdfs:seeAlso ; + rdfs:label "PlainLiteral" ; + rdfs:comment "The class of plain (i.e. untyped) literal values, as used in RIF and OWL 2" . + +rdf:type a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "type" ; + rdfs:comment "The subject is an instance of a class." ; + rdfs:range rdfs:Class ; + rdfs:domain rdfs:Resource . + +rdf:Property a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Property" ; + rdfs:comment "The class of RDF properties." ; + rdfs:subClassOf rdfs:Resource . + +rdf:Statement a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Statement" ; + rdfs:subClassOf rdfs:Resource ; + rdfs:comment "The class of RDF statements." . + +rdf:subject a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "subject" ; + rdfs:comment "The subject of the subject RDF statement." ; + rdfs:domain rdf:Statement ; + rdfs:range rdfs:Resource . + +rdf:predicate a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "predicate" ; + rdfs:comment "The predicate of the subject RDF statement." ; + rdfs:domain rdf:Statement ; + rdfs:range rdfs:Resource . + +rdf:object a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "object" ; + rdfs:comment "The object of the subject RDF statement." ; + rdfs:domain rdf:Statement ; + rdfs:range rdfs:Resource . + +rdf:Bag a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Bag" ; + rdfs:comment "The class of unordered containers." ; + rdfs:subClassOf rdfs:Container . + +rdf:Seq a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Seq" ; + rdfs:comment "The class of ordered containers." ; + rdfs:subClassOf rdfs:Container . + +rdf:Alt a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Alt" ; + rdfs:comment "The class of containers of alternatives." ; + rdfs:subClassOf rdfs:Container . + +rdf:value a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "value" ; + rdfs:comment "Idiomatic property used for structured values." ; + rdfs:domain rdfs:Resource ; + rdfs:range rdfs:Resource . + +rdf:List a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "List" ; + rdfs:comment "The class of RDF Lists." ; + rdfs:subClassOf rdfs:Resource . + +rdf:nil a rdf:List ; + rdfs:isDefinedBy ; + rdfs:label "nil" ; + rdfs:comment "The empty list, with no items in it. If the rest of a list is nil then the list has no more items in it." . + +rdf:first a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "first" ; + rdfs:comment "The first item in the subject RDF list." ; + rdfs:domain rdf:List ; + rdfs:range rdfs:Resource . + +rdf:rest a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "rest" ; + rdfs:comment "The rest of the subject RDF list after the first item." ; + rdfs:domain rdf:List ; + rdfs:range rdf:List . + +rdf:XMLLiteral a rdfs:Datatype ; + rdfs:subClassOf rdfs:Literal ; + rdfs:isDefinedBy ; + rdfs:label "XMLLiteral" ; + rdfs:comment "The datatype of XML literal values." . + +rdf:JSON a rdfs:Datatype ; + rdfs:label "JSON" ; + rdfs:comment "The datatype of RDF literals storing JSON content." ; + rdfs:subClassOf rdfs:Literal ; + rdfs:isDefinedBy ; + rdfs:seeAlso . + +rdf:CompoundLiteral a rdfs:Class ; + rdfs:label "CompoundLiteral" ; + rdfs:comment "A class representing a compound literal." ; + rdfs:subClassOf rdfs:Resource ; + rdfs:isDefinedBy ; + rdfs:seeAlso . + +rdf:language a rdf:Property ; + rdfs:label "language" ; + rdfs:comment "The language component of a CompoundLiteral." ; + rdfs:domain rdf:CompoundLiteral ; + rdfs:isDefinedBy ; + rdfs:seeAlso . + +rdf:direction a rdf:Property ; + rdfs:label "direction" ; + rdfs:comment "The base direction component of a CompoundLiteral." ; + rdfs:domain rdf:CompoundLiteral ; + rdfs:isDefinedBy ; + rdfs:seeAlso . diff --git a/publish/src/rdf/ontologies/fedora.xml b/publish/src/rdf/ontologies/fedora.xml new file mode 100644 index 0000000..9dbab09 --- /dev/null +++ b/publish/src/rdf/ontologies/fedora.xml @@ -0,0 +1,515 @@ + + + + + + + +]> + + + + + Fedora Commons Repository Ontology + Ontology for the Fedora data model, intended primarily to make it possible to expose Fedora-curated RDF predicates via de-reference-able URIs. + v4/2016/10/18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + base version + + + + + + + + + + + has child + + + + + + + + + + + + + + + + + has content + Indicates a binary in which content is stored for this datastream. + + + + + + + + + + has member + Links to a newly-minted identifier which can be used to create a repository resource. + + + + + + + + + + has parent + + + + + + + + + + has results member + + + + + + + + + has version + + + + + + + + + + + is content of + Indicates a datastream for which this resource contains the content. + + + + + + + + + + predecessors + + + + + + + + + + + + + + + annotated resource + + A Resource that maintains properties in its own right. + + + + + + + + binary + + + + A bitstream, with no further data properties. + + + + + + + + repository root + + A repository root. + + + + + + + + skolem + + An entity that is a representation of an RDF Skolem node. + + + + + + + + Fedora configuration + + A container for a Fedora configuration. + + + + + + + + Fedora NonRdfSourceDescription + + + A container for a bitstream and associated properties. + + + + + + + + embed resources + + The set of triples representing child resources of a given resource. + + + + + + + + inbound references + + The set of triples representing other repository resources which link to a given resource. + + + + + + + + Fedora Container + + A Fedora Container: the fundamental quantum of durable content in a Fedora repository. + + + + + + + + pair tree + + An entity that is a an intermediary node created in a PairTree hierarchy. + + + + + + + + + An entity that may be related to other repository entities. + + + + + + + + Fedora resource + + An entity that has been committed to the repository for safekeeping. For example, Fedora objects and datastreams are resources. A Fixity is not, because the provenance of the instance is entirely internal to the repository. + + + + + + + + server managed + + The system-generated triples for a given resource (as opposed to explicity-declared properties). + + + + + + + + Fedora thing + Something that is contemplated in the Fedora repository model. + + + + + + + + tombstone + An entity that is a marker for a deleted node. + + + + + + + + A snapshot of a Fedora object at a given point in time. + + + + + + + + + + inaccessible resource + A Fedora resource that is inaccessible. + + + + + + + + + has access roles + + + has fixity service + + + has namespaces + + + has versions + + + has sparql service + + + + has more results + + + + has transaction provider + + + writable + Whether or not the resource with this representation could have been altered by the same agent that received this representation if the request that retrieved this representation had been a mutating request. + + + + + + + + + diff --git a/publish/src/rdf/ontologies/ldp.ttl b/publish/src/rdf/ontologies/ldp.ttl new file mode 100644 index 0000000..1ccc709 --- /dev/null +++ b/publish/src/rdf/ontologies/ldp.ttl @@ -0,0 +1,264 @@ +# See details within this document for linkage to specification and purpose. +# This ontology file is a non-normative supporting document. +@prefix rdfs: . +@prefix owl: . +@prefix rdf: . +@prefix dcterms: . +@prefix vs: . +@prefix vann: . +@prefix foaf: . +@prefix xsd: . +@prefix : . + +: + a owl:Ontology; + dcterms:description "Vocabulary URIs defined in the Linked Data Platform (LDP) namespace."; + dcterms:title "The W3C Linked Data Platform (LDP) Vocabulary"; + rdfs:label "W3C Linked Data Platform (LDP)"; + rdfs:comment "This ontology provides an informal representation of the concepts and terms as defined in the LDP specification. Consult the LDP specification for normative reference."; + dcterms:publisher ; + dcterms:creator [foaf:name "Steve Speicher"], [foaf:name "John Arwe"], [foaf:name "Ashok Malhotra"]; + foaf:maker [foaf:homepage ]; + dcterms:created "2015-02-26"^^xsd:date; + vann:preferredNamespaceUri "http://www.w3.org/ns/ldp#"; + vann:preferredNamespacePrefix "ldp"; + rdfs:seeAlso , + , + , + , + . + +:Resource + a rdfs:Class; + rdfs:comment "A HTTP-addressable resource whose lifecycle is managed by a LDP server."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "Resource". + +:RDFSource + a rdfs:Class; + rdfs:subClassOf :Resource; + rdfs:comment "A Linked Data Platform Resource (LDPR) whose state is represented as RDF."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "RDFSource". + +:NonRDFSource + a rdfs:Class; + rdfs:subClassOf :Resource; + rdfs:comment "A Linked Data Platform Resource (LDPR) whose state is NOT represented as RDF."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "NonRDFSource". + +:Container + a rdfs:Class; + rdfs:subClassOf :RDFSource; + rdfs:comment "A Linked Data Platform RDF Source (LDP-RS) that also conforms to additional patterns and conventions for managing membership. Readers should refer to the specification defining this ontology for the list of behaviors associated with it."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "Container". + +:BasicContainer + a rdfs:Class; + rdfs:subClassOf :Container; + rdfs:comment "An LDPC that uses a predefined predicate to simply link to its contained resources."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "BasicContainer". + +:DirectContainer + a rdfs:Class; + rdfs:subClassOf :Container; + rdfs:comment "An LDPC that is similar to a LDP-DC but it allows an indirection with the ability to list as member a resource, such as a URI representing a real-world object, that is different from the resource that is created."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "DirectContainer". + +:IndirectContainer + a rdfs:Class; + rdfs:subClassOf :Container; + rdfs:comment "An LDPC that has the flexibility of choosing what form the membership triples take."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "IndirectContainer". + +:hasMemberRelation + a rdf:Property; + rdfs:comment "Indicates which predicate is used in membership triples, and that the membership triple pattern is < membership-constant-URI , object-of-hasMemberRelation, member-URI >."; + vs:term_status "stable"; + rdfs:domain :Container; + rdfs:isDefinedBy :; + rdfs:label "hasMemberRelation"; + rdfs:range rdf:Property. + +:isMemberOfRelation + a rdf:Property; + rdfs:comment "Indicates which predicate is used in membership triples, and that the membership triple pattern is < member-URI , object-of-isMemberOfRelation, membership-constant-URI >."; + vs:term_status "stable"; + rdfs:domain :Container; + rdfs:isDefinedBy :; + rdfs:label "isMemmberOfRelation"; + rdfs:range rdf:Property. + +:membershipResource + a rdf:Property; + rdfs:comment "Indicates the membership-constant-URI in a membership triple. Depending upon the membership triple pattern a container uses, as indicated by the presence of ldp:hasMemberRelation or ldp:isMemberOfRelation, the membership-constant-URI might occupy either the subject or object position in membership triples."; + vs:term_status "stable"; + rdfs:domain :Container; + rdfs:isDefinedBy :; + rdfs:label "membershipResource"; + rdfs:range rdfs:Resource. + +:insertedContentRelation + a rdf:Property; + rdfs:comment "Indicates which triple in a creation request should be used as the member-URI value in the membership triple added when the creation request is successful."; + vs:term_status "stable"; + rdfs:domain :Container; + rdfs:isDefinedBy :; + rdfs:label "insertedContentRelation"; + rdfs:range rdf:Property. + +:member + a rdf:Property; + rdfs:comment "LDP servers should use this predicate as the membership predicate if there is no obvious predicate from an application vocabulary to use."; + vs:term_status "stable"; + rdfs:domain :Resource; + rdfs:isDefinedBy :; + rdfs:label "member"; + rdfs:range rdfs:Resource. + +:contains + a rdf:Property; + rdfs:comment "Links a container with resources created through the container."; + vs:term_status "stable"; + rdfs:domain :Container; + rdfs:isDefinedBy :; + rdfs:label "contains"; + rdfs:range rdfs:Resource. + +:MemberSubject + a owl:Individual; + rdfs:comment "Used to indicate default and typical behavior for ldp:insertedContentRelation, where the member-URI value in the membership triple added when a creation request is successful is the URI assigned to the newly created resource."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "MemberSubject". + +:PreferContainment + a owl:Individual; + rdfs:comment "URI identifying a LDPC's containment triples, for example to allow clients to express interest in receiving them."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "PreferContainment". + +:PreferMembership + a owl:Individual; + rdfs:comment "URI identifying a LDPC's membership triples, for example to allow clients to express interest in receiving them."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "PreferMembership". + +:PreferEmptyContainer + a owl:Individual; + rdfs:comment "Archaic alias for ldp:PreferMinimalContainer"; + vs:term_status "archaic"; + rdfs:isDefinedBy :; + owl:equivalentProperty :PreferMinimalContainer; + rdfs:seeAlso :PreferMinimalContainer; + rdfs:label "PreferEmptyContainer". + +:PreferMinimalContainer + a owl:Individual; + rdfs:comment "URI identifying the subset of a LDPC's triples present in an empty LDPC, for example to allow clients to express interest in receiving them. Currently this excludes containment and membership triples, but in the future other exclusions might be added. This definition is written to automatically exclude those new classes of triples."; + vs:term_status "stable"; + rdfs:isDefinedBy :; + rdfs:label "PreferMinimalContainer". + +:constrainedBy + a rdf:Property; + rdfs:comment "Links a resource with constraints that the server requires requests like creation and update to conform to."; + vs:term_status "stable"; + rdfs:domain :Resource; + rdfs:isDefinedBy :; + rdfs:label "constrainedBy"; + rdfs:range rdfs:Resource. + +:pageSortCriteria + a rdf:Property; + rdfs:comment "Link to the list of sorting criteria used by the server in a representation. Typically used on Link response headers as an extension link relation URI in the rel= parameter."; + vs:term_status "testing"; + rdfs:domain :Page; + rdfs:isDefinedBy :; + rdfs:label "pageSortCriteria"; + rdfs:range rdf:List. + +:PageSortCriterion + a rdfs:Class; + rdfs:comment "Element in the list of sorting criteria used by the server to assign container members to pages."; + vs:term_status "testing"; + rdfs:label "PageSortCriterion"; + rdfs:isDefinedBy :. + +:pageSortPredicate + a rdf:Property; + rdfs:comment "Predicate used to specify the order of the members across a page sequence's in-sequence page resources; it asserts nothing about the order of members in the representation of a single page."; + vs:term_status "testing"; + rdfs:domain :PageSortCriterion; + rdfs:isDefinedBy :; + rdfs:label "pageSortPredicate"; + rdfs:range rdf:Property. + +:pageSortOrder + a rdf:Property; + rdfs:comment "The ascending/descending/etc order used to order the members across pages in a page sequence."; + vs:term_status "testing"; + rdfs:domain :PageSortCriterion; + rdfs:isDefinedBy :; + rdfs:label "pageSortOrder"; + rdfs:range rdf:Resource. + +:pageSortCollation + a rdf:Property; + rdfs:comment "The collation used to order the members across pages in a page sequence when comparing strings."; + vs:term_status "testing"; + rdfs:domain :PageSortCriterion; + rdfs:isDefinedBy :; + rdfs:label "pageSortCollation"; + rdfs:range rdf:Property. + +:Ascending + a owl:Individual; + rdfs:comment "Ascending order."; + vs:term_status "testing"; + rdfs:isDefinedBy :; + rdfs:label "Ascending". + +:Descending + a owl:Individual; + rdfs:comment "Descending order."; + vs:term_status "testing"; + rdfs:isDefinedBy :; + rdfs:label "Descending". + +:Page + a rdfs:Class; + rdfs:comment "URI signifying that the resource is an in-sequence page resource, as defined by LDP Paging. Typically used on Link rel='type' response headers."; + vs:term_status "testing"; + rdfs:isDefinedBy :; + rdfs:label "Page". + +:pageSequence + a rdf:Property; + rdfs:comment "Link to a page sequence resource, as defined by LDP Paging. Typically used to communicate the sorting criteria used to allocate LDPC members to pages."; + vs:term_status "testing"; + rdfs:isDefinedBy :; + rdfs:label "Page". + +:inbox + a rdf:Property; + rdfs:comment "Links a resource to a container where notifications for the resource can be created and discovered."; + vs:term_status "stable"; + rdfs:isDefinedBy ; + rdfs:label "inbox"; + dcterms:issued "2016-09-29"^^xsd:date; + dcterms:creator , . \ No newline at end of file diff --git a/publish/src/rdf/ontologies/ontology.ttl b/publish/src/rdf/ontologies/ontology.ttl new file mode 100644 index 0000000..9a0b594 --- /dev/null +++ b/publish/src/rdf/ontologies/ontology.ttl @@ -0,0 +1,410 @@ +@prefix : . +@prefix ldp: . +@prefix owl: . +@prefix rdf: . +@prefix xml: . +@prefix xsd: . +@prefix rdaa: . +@prefix rdac: . +@prefix rdae: . +@prefix rdai: . +@prefix rdam: . +@prefix rdan: . +@prefix rdap: . +@prefix rdat: . +@prefix rdaw: . +@prefix rdax: . +@prefix rdfs: . +@prefix fedora: . +@base . + + rdf:type owl:Ontology . + +################################################################# +# Annotation properties +################################################################# + +### https://graphofliberty.org/2026/04/ont/catalogId +:catalogId rdf:type owl:AnnotationProperty ; + rdfs:comment "An integer associated with the class for fast lookup in a database."@en ; + rdfs:label "catalog id" ; + rdfs:domain owl:Class . + + +### https://graphofliberty.org/2026/04/ont/indexedByField +:indexedByField rdf:type owl:AnnotationProperty ; + rdfs:comment "The property is associated with the given field in a full-text search database."@en ; + rdfs:label "indexed by field"@en ; + rdfs:domain owl:DatatypeProperty . + + +################################################################# +# Datatypes +################################################################# + +### http://www.w3.org/1999/02/22-rdf-syntax-ns#dirLangString +rdf:dirLangString rdf:type rdfs:Datatype ; + rdfs:label "Directional language-tagged string"@en . + + +### http://www.w3.org/1999/02/22-rdf-syntax-ns#langString +rdf:langString rdf:type rdfs:Datatype ; + rdfs:label "Language-tagged string"@en . + + +### http://www.w3.org/2001/XMLSchema#boolean +xsd:boolean rdf:type rdfs:Datatype ; + rdfs:label "Boolean"@en . + + +### http://www.w3.org/2001/XMLSchema#dateTime +xsd:dateTime rdf:type rdfs:Datatype ; + rdfs:comment "Date and time with or without timezone"@en . + + +### http://www.w3.org/2001/XMLSchema#decimal +xsd:decimal rdf:type rdfs:Datatype ; + rdfs:comment "Arbitrary-precision decimal numbers"@en ; + rdfs:label "Decimal"@en . + + +### http://www.w3.org/2001/XMLSchema#integer +xsd:integer rdf:type rdfs:Datatype ; + rdfs:comment "Arbitrary-size integer numbers"@en ; + rdfs:label "Integer"@en . + + +### http://www.w3.org/2001/XMLSchema#string +xsd:string rdf:type rdfs:Datatype ; + rdfs:label "String"@en . + + +### http://www.w3.org/2001/XMLSchema#unsignedShort +xsd:unsignedShort rdf:type rdfs:Datatype ; + rdfs:label "Unsigned short"@en . + + +################################################################# +# Object Properties +################################################################# + +### http://rdaregistry.info/Elements/a/P50094 +rdaa:P50094 rdf:type owl:ObjectProperty . + + +### http://rdaregistry.info/Elements/a/identifierForPerson.en +rdaa:identifierForPerson.en rdf:type owl:ObjectProperty . + + +### http://rdaregistry.info/Elements/m/P30154 +rdam:P30154 rdf:type owl:ObjectProperty . + + +### http://rdaregistry.info/Elements/m/uniformResourceLocator.en +rdam:uniformResourceLocator.en rdf:type owl:ObjectProperty . + + +### https://graphofliberty.org/2026/04/ont/template +:template rdf:type owl:ObjectProperty ; + rdfs:comment "A default set of triples used during the creation of new entities of the associated class."@en ; + rdfs:label "has template"@en . + + +################################################################# +# Data properties +################################################################# + +### http://fedora.info/definitions/v4/repository#created +fedora:created rdf:type owl:DatatypeProperty ; + rdfs:subPropertyOf owl:topDataProperty . + + +### http://fedora.info/definitions/v4/repository#createdBy +fedora:createdBy rdf:type owl:DatatypeProperty ; + rdfs:subPropertyOf owl:topDataProperty . + + +### http://fedora.info/definitions/v4/repository#lastModified +fedora:lastModified rdf:type owl:DatatypeProperty . + + +### http://fedora.info/definitions/v4/repository#lastModifiedBy +fedora:lastModifiedBy rdf:type owl:DatatypeProperty . + + +### http://rdaregistry.info/Elements/a/P50291 +rdaa:P50291 rdf:type owl:DatatypeProperty . + + +### http://rdaregistry.info/Elements/a/P50292 +rdaa:P50292 rdf:type owl:DatatypeProperty . + + +### http://rdaregistry.info/Elements/a/givenName.en +rdaa:givenName.en rdf:type owl:DatatypeProperty . + + +### http://rdaregistry.info/Elements/a/surname.en +rdaa:surname.en rdf:type owl:DatatypeProperty . + + +################################################################# +# Classes +################################################################# + +### http://fedora.info/definitions/v4/repository#Container +fedora:Container rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### http://fedora.info/definitions/v4/repository#Resource +fedora:Resource rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### http://rdaregistry.info/Elements/c/C10001 +rdac:C10001 rdf:type owl:Class ; + rdfs:subClassOf rdac:C10013 ; + rdfs:label "Work"@en . + + +### http://rdaregistry.info/Elements/c/C10002 +rdac:C10002 rdf:type owl:Class ; + rdfs:subClassOf rdac:C10013 ; + rdfs:label "Agent"@en . + + +### http://rdaregistry.info/Elements/c/C10004 +rdac:C10004 rdf:type owl:Class ; + rdfs:subClassOf rdac:C10002 ; + rdfs:label "Person"@en . + + +### http://rdaregistry.info/Elements/c/C10007 +rdac:C10007 rdf:type owl:Class ; + rdfs:subClassOf rdac:C10013 . + + +### http://rdaregistry.info/Elements/c/C10013 +rdac:C10013 rdf:type owl:Class ; + rdfs:label "RDA Entity"@en . + + +### http://www.w3.org/ns/ldp#BasicContainer +ldp:BasicContainer rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### http://www.w3.org/ns/ldp#Container +ldp:Container rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### http://www.w3.org/ns/ldp#RDFSource +ldp:RDFSource rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### http://www.w3.org/ns/ldp#Resource +ldp:Resource rdf:type owl:Class ; + rdfs:subClassOf :ReadOnly . + + +### https://graphofliberty.org/2026/04/ont/AudioBook +:AudioBook rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Audio Book"@en ; + :catalogId "1"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Book +:Book rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Book"@en ; + :catalogId "2"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Document +:Document rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Document"@en ; + :catalogId "3"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Entity +:Entity rdf:type owl:Class ; + rdfs:label "Graph of Liberty Entity"@en . + + +### https://graphofliberty.org/2026/04/ont/Meme +:Meme rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Meme"@en ; + :catalogId "4"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Movie +:Movie rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Movie"@en ; + :catalogId "5"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Music +:Music rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Music"@en ; + :catalogId "6"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Person +:Person rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Person"@en ; + :catalogId "7"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/Podcast +:Podcast rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "Podcast"@en ; + :catalogId "8"^^xsd:positiveInteger . + + +### https://graphofliberty.org/2026/04/ont/ReadOnly +:ReadOnly rdf:type owl:Class ; + rdfs:label "Read Only"@en . + + +### https://graphofliberty.org/2026/04/ont/TVShow +:TVShow rdf:type owl:Class ; + rdfs:subClassOf :Entity ; + rdfs:label "TV Show"@en ; + :catalogId "9"^^xsd:positiveInteger . + + +################################################################# +# Individuals +################################################################# + +### http://fedora.info/definitions/v4/repository#created +fedora:created rdf:type owl:NamedIndividual , + :ReadOnly . + + +### http://fedora.info/definitions/v4/repository#createdBy +fedora:createdBy rdf:type owl:NamedIndividual , + :ReadOnly . + + +### http://fedora.info/definitions/v4/repository#hasParent +fedora:hasParent rdf:type owl:NamedIndividual , + :ReadOnly . + + +### http://fedora.info/definitions/v4/repository#lastModified +fedora:lastModified rdf:type owl:NamedIndividual , + :ReadOnly . + + +### http://fedora.info/definitions/v4/repository#lastModifiedBy +fedora:lastModifiedBy rdf:type owl:NamedIndividual , + :ReadOnly . + + +### http://rdaregistry.info/Elements/a/P50094 +rdaa:P50094 rdf:type owl:NamedIndividual ; + owl:sameAs rdaa:identifierForPerson.en . + + +### http://rdaregistry.info/Elements/a/identifierForPerson.en + +### http://rdaregistry.info/Elements/a/P50291 +rdaa:P50291 rdf:type owl:NamedIndividual ; + owl:sameAs rdaa:surname.en . + + +### http://rdaregistry.info/Elements/a/surname.en + +### http://rdaregistry.info/Elements/a/P50292 +rdaa:P50292 rdf:type owl:NamedIndividual ; + owl:sameAs rdaa:givenName.en . + + +### http://rdaregistry.info/Elements/a/givenName.en + +### http://rdaregistry.info/Elements/a/givenName.en +rdaa:givenName.en rdf:type owl:NamedIndividual . + + +### http://rdaregistry.info/Elements/a/identifierForPerson.en +rdaa:identifierForPerson.en rdf:type owl:NamedIndividual . + + +### http://rdaregistry.info/Elements/a/surname.en +rdaa:surname.en rdf:type owl:NamedIndividual . + + +### http://rdaregistry.info/Elements/c/C10007 +rdac:C10007 rdf:type owl:NamedIndividual ; + :template _:genid1 . + +_:genid1 rdf:type rdac:C10007 ; + rdam:uniformResourceLocator.en : . + + +### http://rdaregistry.info/Elements/m/P30154 +rdam:P30154 rdf:type owl:NamedIndividual ; + owl:sameAs rdam:uniformResourceLocator.en . + + +### http://rdaregistry.info/Elements/m/uniformResourceLocator.en + +### http://rdaregistry.info/Elements/m/uniformResourceLocator.en +rdam:uniformResourceLocator.en rdf:type owl:NamedIndividual . + + +### http://www.w3.org/ns/ldp#contains +ldp:contains rdf:type owl:NamedIndividual , + :ReadOnly ; + rdfs:label "contains"@en . + + +### https://graphofliberty.org/2026/04/ont/ +: rdf:type owl:NamedIndividual . + + +################################################################# +# Annotations +################################################################# + +fedora:created rdfs:label "created"@en . + + +fedora:createdBy rdfs:label "created by"@en . + + +fedora:lastModified rdfs:label "last modified"@en . + + +fedora:lastModifiedBy rdfs:label "last modified by"@en . + + +rdaa:P50094 rdfs:label "has identifier for person"@en . + + +rdaa:P50291 rdfs:label "has surname"@en ; + :indexedByField "surname" . + + +rdaa:P50292 rdfs:label "has given name"@en ; + :indexedByField "given name" . + + +rdac:C10007 rdfs:label "Manifestation"@en . + + +rdam:P30154 rdfs:label "has uniform resource locator"@en . + + +### Generated by the OWL API (version 4.5.29.2024-05-13T12:11:03Z) https://github.com/owlcs/owlapi diff --git a/publish/src/rdf/ontologies/rdf-schema.ttl b/publish/src/rdf/ontologies/rdf-schema.ttl new file mode 100644 index 0000000..56cde2a --- /dev/null +++ b/publish/src/rdf/ontologies/rdf-schema.ttl @@ -0,0 +1,108 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix dc: . + + a owl:Ontology ; + dc:title "The RDF Schema vocabulary (RDFS)" . + +rdfs:Resource a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Resource" ; + rdfs:comment "The class resource, everything." . + +rdfs:Class a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Class" ; + rdfs:comment "The class of classes." ; + rdfs:subClassOf rdfs:Resource . + +rdfs:subClassOf a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "subClassOf" ; + rdfs:comment "The subject is a subclass of a class." ; + rdfs:range rdfs:Class ; + rdfs:domain rdfs:Class . + +rdfs:subPropertyOf a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "subPropertyOf" ; + rdfs:comment "The subject is a subproperty of a property." ; + rdfs:range rdf:Property ; + rdfs:domain rdf:Property . + +rdfs:comment a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "comment" ; + rdfs:comment "A description of the subject resource." ; + rdfs:domain rdfs:Resource ; + rdfs:range rdfs:Literal . + +rdfs:label a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "label" ; + rdfs:comment "A human-readable name for the subject." ; + rdfs:domain rdfs:Resource ; + rdfs:range rdfs:Literal . + +rdfs:domain a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "domain" ; + rdfs:comment "A domain of the subject property." ; + rdfs:range rdfs:Class ; + rdfs:domain rdf:Property . + +rdfs:range a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "range" ; + rdfs:comment "A range of the subject property." ; + rdfs:range rdfs:Class ; + rdfs:domain rdf:Property . + +rdfs:seeAlso a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "seeAlso" ; + rdfs:comment "Further information about the subject resource." ; + rdfs:range rdfs:Resource ; + rdfs:domain rdfs:Resource . + +rdfs:isDefinedBy a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf rdfs:seeAlso ; + rdfs:label "isDefinedBy" ; + rdfs:comment "The definition of the subject resource." ; + rdfs:range rdfs:Resource ; + rdfs:domain rdfs:Resource . + +rdfs:Literal a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Literal" ; + rdfs:comment "The class of literal values, eg. textual strings and integers." ; + rdfs:subClassOf rdfs:Resource . + +rdfs:Container a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Container" ; + rdfs:subClassOf rdfs:Resource ; + rdfs:comment "The class of RDF containers." . + +rdfs:ContainerMembershipProperty a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "ContainerMembershipProperty" ; + rdfs:comment """The class of container membership properties, rdf:_1, rdf:_2, ..., all of which are sub-properties of 'member'.""" ; + rdfs:subClassOf rdf:Property . + +rdfs:member a rdf:Property ; + rdfs:isDefinedBy ; + rdfs:label "member" ; + rdfs:comment "A member of the subject resource." ; + rdfs:domain rdfs:Resource ; + rdfs:range rdfs:Resource . + +rdfs:Datatype a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:label "Datatype" ; + rdfs:comment "The class of RDF datatypes." ; + rdfs:subClassOf rdfs:Class . + + rdfs:seeAlso . diff --git a/publish/src/rdf/ontology.rs b/publish/src/rdf/ontology.rs new file mode 100644 index 0000000..47f27ba --- /dev/null +++ b/publish/src/rdf/ontology.rs @@ -0,0 +1,411 @@ +use crate::error; +use oxigraph::io::{RdfFormat, RdfParser}; +use oxigraph::model::vocab::{rdf, rdfs, xsd}; +use oxigraph::model::{ + Dataset, NamedNode, NamedNodeRef, NamedOrBlankNode, NamedOrBlankNodeRef, Term, TermRef, Triple, + TripleRef, +}; +use oxigraph::sparql::{QueryResults, SparqlEvaluator}; +use std::collections::{HashMap, HashSet}; + +const PREFIXES: &[(&str, &str)] = &[ + ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"), + ("rdfs", "http://www.w3.org/2000/01/rdf-schema#"), + ("owl", "http://www.w3.org/2002/07/owl#"), + ("xsd", "http://www.w3.org/2001/XMLSchema#"), + ("ldp", "http://www.w3.org/ns/ldp#"), + ("dc", "http://purl.org/dc/elements/1.1/"), + ("posix", "http://www.w3.org/ns/posix/stat#"), + ( + "ebucore", + "http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#", + ), + ("premis", "http://www.loc.gov/premis/rdf/v1#"), + ("premis3", "http://www.loc.gov/premis/rdf/v3/"), + ("dcterms", "http://purl.org/dc/terms/"), + ("fedora", "http://fedora.info/definitions/v4/repository#"), + ("rdaa", "http://rdaregistry.info/Elements/a/"), + ("rdac", "http://rdaregistry.info/Elements/c/"), + ("rdae", "http://rdaregistry.info/Elements/e/"), + ("rdai", "http://rdaregistry.info/Elements/i/"), + ("rdam", "http://rdaregistry.info/Elements/m/"), + ("rdan", "http://rdaregistry.info/Elements/n/"), + ("rdap", "http://rdaregistry.info/Elements/p/"), + ("rdat", "http://rdaregistry.info/Elements/t/"), + ("rdaw", "http://rdaregistry.info/Elements/w/"), + ("rdax", "http://rdaregistry.info/Elements/x/"), + ("schema", "https://schema.org/"), + ("quill", "http://fedora.quill.lan/rest/"), + ("gl", "https://graphofliberty.org/2026/04/ont/"), +]; + +const RDF_ONT: &[u8] = include_bytes!("ontologies/22-rdf-syntax-ns.ttl"); +const RDFS_ONT: &[u8] = include_bytes!("ontologies/rdf-schema.ttl"); +const LDP_ONT: &[u8] = include_bytes!("ontologies/ldp.ttl"); +const FEDORA_ONT: &[u8] = include_bytes!("ontologies/fedora.xml"); +const GL_ONT: &[u8] = include_bytes!("ontologies/ontology.ttl"); + +const GL_READ_ONLY: NamedNodeRef = + NamedNodeRef::new_unchecked("https://graphofliberty.org/2026/04/ont/ReadOnly"); +const GL_TEMPLATE: NamedNodeRef = + NamedNodeRef::new_unchecked("https://graphofliberty.org/2026/04/ont/template"); +const GL_INDEXED_BY_FIELD: NamedNodeRef = + NamedNodeRef::new_unchecked("https://graphofliberty.org/2026/04/ont/indexedByField"); +const GL_CATALOG_ID: NamedNodeRef = + NamedNodeRef::new_unchecked("https://graphofliberty.org/2026/04/ont/catalogId"); +const OWL_SAME_AS: NamedNodeRef = + NamedNodeRef::new_unchecked("http://www.w3.org/2002/07/owl#sameAs"); + +pub const RDA_ENTITY: NamedNodeRef = + NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/c/C10013"); +pub const GL_ENTITY: NamedNodeRef = + NamedNodeRef::new_unchecked("https://graphofliberty.org/2026/04/ont/Entity"); + +pub struct OntologyBuilder<'a> { + ontologies: Vec<(RdfFormat, &'a [u8])>, +} + +impl<'a> OntologyBuilder<'a> { + pub fn with_ontology_bytes(mut self, format: RdfFormat, bytes: &'a [u8]) -> Self { + self.ontologies.push((format, bytes)); + self + } + + pub fn with_default_ontologies(self) -> Self { + self.with_ontology_bytes(RdfFormat::Turtle, RDF_ONT) + .with_ontology_bytes(RdfFormat::Turtle, RDFS_ONT) + .with_ontology_bytes(RdfFormat::Turtle, LDP_ONT) + .with_ontology_bytes(RdfFormat::RdfXml, FEDORA_ONT) + .with_ontology_bytes(RdfFormat::Turtle, GL_ONT) + } + + fn materialize_same_as(dataset: &mut Dataset) { + let additional_quads = dataset + .quads_for_pattern(None, Some(OWL_SAME_AS), None, None) + .fold(Dataset::new(), |mut new_dataset, alias| { + if let NamedOrBlankNodeRef::NamedNode(x) = alias.subject + && let TermRef::NamedNode(y) = alias.object + { + for mut quad in dataset.quads_for_pattern( + Some(NamedOrBlankNodeRef::NamedNode(x)), + None, + None, + None, + ) { + quad.subject = NamedOrBlankNodeRef::NamedNode(y); + new_dataset.insert(quad); + } + + for mut quad in dataset.quads_for_pattern( + Some(NamedOrBlankNodeRef::NamedNode(y)), + None, + None, + None, + ) { + quad.subject = NamedOrBlankNodeRef::NamedNode(x); + new_dataset.insert(quad); + } + } + new_dataset + }); + + let old_size = dataset.len(); + dataset.extend(&additional_quads); + let new_size = dataset.len(); + + if new_size > old_size { + Self::materialize_same_as(dataset) + } + } + + fn memoize(ontology: &mut Ontology) { + // Read-only properties + for quad in ontology.dataset.quads_for_pattern( + None, + Some(rdf::TYPE), + Some(TermRef::NamedNode(GL_READ_ONLY)), + None, + ) { + if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject { + ontology.read_only_properties.insert(subject.into_owned()); + } + } + + // Read-only classes + for quad in ontology.dataset.quads_for_pattern( + None, + Some(rdfs::SUB_CLASS_OF), + Some(TermRef::NamedNode(GL_READ_ONLY)), + None, + ) { + if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject { + ontology.read_only_classes.insert(subject.into_owned()); + } + } + + // Full-text search index field names + for quad in ontology + .dataset + .quads_for_pattern(None, Some(GL_INDEXED_BY_FIELD), None, None) + { + if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject + && let TermRef::Literal(literal) = quad.object + { + ontology + .field_map + .insert(subject.into_owned(), literal.value().to_string()); + } + } + + // Catalog IDs (used to quickly filter full-text search results) + for quad in ontology + .dataset + .quads_for_pattern(None, Some(GL_CATALOG_ID), None, None) + { + if let NamedOrBlankNodeRef::NamedNode(subject) = quad.subject + && let TermRef::Literal(literal) = quad.object + { + if literal.datatype() == xsd::POSITIVE_INTEGER { + let value: u64 = literal.value().parse().expect("Failed to parse catalog ID from ontology. It ought to be a positive integer."); + ontology.catalog_ids.insert(subject.into_owned(), value); + } + } + } + } + + pub fn build(&mut self) -> error::Result { + let prefixes = PREFIXES + .iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect::>(); + + let mut dataset = Dataset::new(); + for (format, bytes) in &self.ontologies { + let quads = RdfParser::from_format(*format) + .for_slice(bytes) + .filter_map(Result::ok); + dataset.extend(quads); + } + Self::materialize_same_as(&mut dataset); + + let mut ontology = Ontology { + dataset, + prefixes, + read_only_properties: HashSet::new(), + read_only_classes: HashSet::new(), + field_map: HashMap::new(), + catalog_ids: HashMap::new(), + }; + + Self::memoize(&mut ontology); + Ok(ontology) + } +} + +pub struct Ontology { + dataset: Dataset, + prefixes: HashMap, + read_only_properties: HashSet, + read_only_classes: HashSet, + field_map: HashMap, + catalog_ids: HashMap, +} + +fn term_to_string(term: &Term) -> Option { + match term { + Term::Literal(literal) => Some(literal.value().to_string()), + _ => None, + } +} + +impl Ontology { + pub fn builder<'a>() -> OntologyBuilder<'a> { + OntologyBuilder { + ontologies: Vec::new(), + } + } + + pub fn label<'a>(&'a self, node: NamedNodeRef<'a>) -> Option<&'a str> { + let quads = self.dataset.quads_for_pattern( + Some(NamedOrBlankNodeRef::NamedNode(node)), + Some(rdfs::LABEL), + None, + None, + ); + for quad in quads { + if let TermRef::Literal(literal) = quad.object { + match literal.language() { + None | Some("en") => return Some(literal.value()), + _ => {} + } + } + } + + None + } + + pub fn abbreviate(&self, node: NamedNodeRef<'_>) -> String { + for (prefix_name, prefix_iri) in &self.prefixes { + if let Some(local_name) = node.as_str().strip_prefix(prefix_iri) { + return if local_name.is_empty() { + format!("{prefix_name}:") + } else { + format!("{prefix_name}:{local_name}") + }; + } + } + node.as_str().to_string() + } + + pub fn expand(&self, prefixed_iri: &str) -> Option { + let (prefix, name) = prefixed_iri.split_once(':')?; + self.prefixes + .get(prefix) + .map(|base| NamedNode::new_unchecked(format!("{base}{name}"))) + } + + pub fn field_name(&self, property: &NamedNode) -> Option<&String> { + self.field_map.get(property) + } + + pub fn catalog_id(&self, class: &NamedNode) -> Option { + self.catalog_ids.get(class).copied() + } + + pub fn for_each_annotated_iri(&self, f: F) + where + F: Fn(&str, Option<&str>, Option<&str>), + { + let query = SparqlEvaluator::new() + .parse_query( + r"PREFIX rdfs: + +SELECT ?subject ?label ?comment WHERE { + OPTIONAL { + ?subject rdfs:label ?label . + FILTER (LANG(?label) = 'en' || LANG(?label) = '') + } + OPTIONAL { + ?subject rdfs:comment ?comment . + FILTER (LANG(?comment) = 'en' || LANG(?comment) = '') + } +}", + ) + .expect("Unable to parse annotation query"); + + if let QueryResults::Solutions(solutions) = + query.on_queryable_dataset(&self.dataset).execute().unwrap() + { + for solution in solutions.filter_map(Result::ok) { + let label = solution.get("label").and_then(term_to_string); + let comment = solution.get("comment").and_then(term_to_string); + if let Some(Term::NamedNode(subject)) = solution.get("subject") { + f(subject.as_str(), label.as_deref(), comment.as_deref()); + } + } + } + } + + pub fn datatypes(&self) -> impl Iterator> { + self.dataset + .quads_for_pattern( + None, + Some(rdf::TYPE), + Some(TermRef::NamedNode(rdfs::DATATYPE)), + None, + ) + .filter_map(|quad| match quad.subject { + NamedOrBlankNodeRef::NamedNode(subject) => Some(subject), + _ => None, + }) + } + + pub fn is_read_only<'a>(&self, triple: impl Into>) -> bool { + let triple = triple.into(); + let read_only_property = self + .read_only_properties + .contains(&triple.predicate.into_owned()); + let read_only_class = match (triple.predicate, triple.object) { + (rdf::TYPE, TermRef::NamedNode(node)) => { + self.read_only_classes.contains(&node.into_owned()) + } + _ => false, + }; + read_only_property || read_only_class + } + + pub fn exclude_read_only_predicate(&self) -> impl Fn(TripleRef<'_>) -> bool + 'static { + let classes = self.read_only_classes.clone(); + let properties = self.read_only_properties.clone(); + move |triple| { + let read_only_property = properties.contains(&triple.predicate.into_owned()); + let read_only_class = match (triple.predicate, triple.object) { + (rdf::TYPE, TermRef::NamedNode(node)) => classes.contains(&node.into_owned()), + _ => false, + }; + !(read_only_property || read_only_class) + } + } + + pub fn subclass_of(&self, class: NamedNodeRef<'_>) -> impl Iterator { + let query = SparqlEvaluator::new() + .parse_query( + format!( + "PREFIX rdfs: +SELECT ?class {{ + ?class (rdfs:subClassOf|^rdfs:subClassOf)* {class} . +}}" + ) + .as_str(), + ) + .expect("Unable to parse subclass_of query"); + + if let QueryResults::Solutions(solutions) = + query.on_queryable_dataset(&self.dataset).execute().unwrap() + { + solutions.filter_map(Result::ok).filter_map(|solution| { + if let Some(Term::NamedNode(class)) = solution.get("class") { + Some(class.clone()) + } else { + None + } + }) + } else { + unreachable!() + } + } + + pub fn template_triples<'a>( + &'a self, + class: NamedNodeRef<'a>, + subject: NamedNodeRef<'_>, + ) -> Option> { + if let Some(quad) = self + .dataset + .quads_for_pattern( + Some(NamedOrBlankNodeRef::NamedNode(class)), + Some(GL_TEMPLATE), + None, + None, + ) + .next() + { + if let TermRef::BlankNode(blank_node) = quad.object { + let iter = self + .dataset + .quads_for_subject(blank_node) + .map(|quad| quad.into_owned()) + .map(Triple::from) + .map(move |mut triple| { + triple.subject = NamedOrBlankNode::NamedNode(subject.into_owned()); + triple + }); + Some(iter) + } else { + None + } + } else { + None + } + } +} diff --git a/publish/src/rdf/term_helper.rs b/publish/src/rdf/term_helper.rs new file mode 100644 index 0000000..bc1d18f --- /dev/null +++ b/publish/src/rdf/term_helper.rs @@ -0,0 +1,168 @@ +use oxigraph::model::vocab::{rdf, xsd}; +use oxigraph::model::{BaseDirection, Literal, NamedNode, NamedNodeRef, Term, TermRef}; + +#[derive(Debug)] +pub struct TermHelper<'a> { + term: &'a Term, +} + +impl<'a> TermHelper<'a> { + pub fn new(term: &'a Term) -> Self { + TermHelper { term } + } + + pub fn value(&self) -> &str { + match self.term.as_ref() { + TermRef::Literal(literal) => literal.value(), + TermRef::NamedNode(node) => node.as_str(), + _ => unimplemented!(), + } + } + + pub fn value_as_named_node(&self) -> Option> { + match self.term.as_ref() { + TermRef::NamedNode(node) => Some(node), + _ => None, + } + } + + pub fn language(&self) -> Option<&str> { + if let TermRef::Literal(literal) = self.term.as_ref() { + literal.language() + } else { + None + } + } + + pub fn direction(&self) -> Option { + if let TermRef::Literal(literal) = self.term.as_ref() { + literal.direction() + } else { + None + } + } + + pub fn datatype(&self) -> Option> { + if let TermRef::Literal(literal) = self.term.as_ref() { + Some(literal.datatype()) + } else { + None + } + } + + pub fn is_named_node(&self) -> bool { + self.term.is_named_node() + } +} + +#[derive(Debug)] +pub struct TermHelperMut<'a> { + term: &'a mut Term, +} + +impl<'a> TermHelperMut<'a> { + pub fn new(term: &'a mut Term) -> Self { + TermHelperMut { term } + } + + pub fn set_datatype(&mut self, datatype: Option) { + let value = match self.term.as_ref() { + TermRef::Literal(literal) => literal.value(), + TermRef::NamedNode(node) => node.as_str(), + _ => unimplemented!(), + }; + + if let Some(datatype) = datatype { + let language = if let TermRef::Literal(literal) = self.term.as_ref() { + literal.language() + } else { + None + }; + + let direction = if let TermRef::Literal(literal) = self.term.as_ref() { + literal.direction().unwrap_or(BaseDirection::Ltr) + } else { + BaseDirection::Ltr + }; + + let language = language.unwrap_or("en"); + let literal = match datatype.as_ref() { + rdf::LANG_STRING => Literal::new_language_tagged_literal_unchecked(value, language), + rdf::DIR_LANG_STRING => Literal::new_directional_language_tagged_literal_unchecked( + value, language, direction, + ), + xsd::STRING => Literal::new_simple_literal(value), + _ => Literal::new_typed_literal(value, datatype), + }; + *self.term = Term::Literal(literal); + } else { + *self.term = Term::NamedNode(NamedNode::new_unchecked(value)) + } + } + + pub fn set_language(&mut self, language: &str) { + if let TermRef::Literal(literal) = self.term.as_ref() { + let value = literal.value(); + let datatype = literal.datatype(); + let base_direction = literal.direction(); + let new_literal = match (datatype, base_direction) { + (rdf::LANG_STRING, _) => { + Literal::new_language_tagged_literal_unchecked(value, language) + } + (rdf::DIR_LANG_STRING, Some(base_direction)) => { + Literal::new_directional_language_tagged_literal_unchecked( + value, + language, + base_direction, + ) + } + (xsd::STRING, _) => Literal::new_simple_literal(value), + _ => Literal::new_typed_literal(value, datatype), + }; + *self.term = Term::Literal(new_literal) + } + } + + pub fn set_direction(&mut self, direction: BaseDirection) { + let value = match self.term.as_ref() { + TermRef::Literal(literal) => literal.value(), + TermRef::NamedNode(node) => node.as_str(), + _ => unimplemented!(), + }; + + if let TermRef::Literal(literal) = self.term.as_ref() { + let language = literal.language().unwrap_or("en"); + let new_literal = Literal::new_directional_language_tagged_literal_unchecked( + value, language, direction, + ); + *self.term = Term::Literal(new_literal); + } + } + + pub fn set_value(&mut self, value: String) { + match self.term.as_ref() { + TermRef::Literal(literal) => { + let datatype = literal.datatype(); + let language = literal.language(); + let base_direction = literal.direction(); + let new_literal = match (datatype, language, base_direction) { + (rdf::LANG_STRING, Some(language), _) => { + Literal::new_language_tagged_literal_unchecked(value, language) + } + (rdf::DIR_LANG_STRING, Some(language), Some(base_direction)) => { + Literal::new_directional_language_tagged_literal_unchecked( + value, + language, + base_direction, + ) + } + (xsd::STRING, _, _) => Literal::new_simple_literal(value), + _ => Literal::new_typed_literal(value, datatype), + }; + *self.term = Term::Literal(new_literal) + } + TermRef::NamedNode(_) => *self.term = Term::NamedNode(NamedNode::new_unchecked(value)), + _ => unimplemented!(), + } + } +} diff --git a/publish/src/windows/mod.rs b/publish/src/windows/mod.rs new file mode 100644 index 0000000..b167737 --- /dev/null +++ b/publish/src/windows/mod.rs @@ -0,0 +1,3 @@ +//mod search; + +//pub use search::{SearchWindow, SearchWindowMessage}; diff --git a/publish/src/windows/search.rs b/publish/src/windows/search.rs new file mode 100644 index 0000000..70c74a6 --- /dev/null +++ b/publish/src/windows/search.rs @@ -0,0 +1,64 @@ +use iced::{window, Element, Task}; +use iced::widget::{column, mouse_area, space, table, text_input}; +use tracing::info; +use gl_search::{SearchIndex, SearchIndexBuilder}; +use gl_types::CatalogEntryType; + +#[derive(Clone)] +pub enum SearchWindowMessage { + QueryInputUpdated(String), + SearchResultSelected(String), +} + +pub struct SearchWindow { + window_id: window::Id, + index: SearchIndex, + query_input: String, + results: Vec, +} + +impl SearchWindow { + pub fn new(window_id: window::Id) -> Self { + let index = SearchIndex::builder() + .with_path("/tmp/name_index") + .build().expect("Unable to load search index"); + + Self { + window_id, + index, + query_input: String::new(), + results: vec![], + } + } + + pub fn id(&self) -> window::Id { + self.window_id + } + + pub fn title(&self) -> String { + "Graph of Liberty Publisher: Search".to_string() + } + + pub fn update(&mut self, message: SearchWindowMessage) -> Task { + match message { + SearchWindowMessage::QueryInputUpdated(value) => { + self.results = self.index.query(CatalogEntryType::Person, value.as_str()).unwrap(); + self.query_input = value; + } + SearchWindowMessage::SearchResultSelected(value) => { + info!(value); + } + } + Task::none() + } + + pub fn view(&self) -> Element<'_, SearchWindowMessage> { + let name_column = table::column("Name", |name: &String| { + mouse_area(name.as_str()).on_double_click(SearchWindowMessage::SearchResultSelected(name.clone())) + }); + column![ + text_input("Query", &self.query_input).on_input(SearchWindowMessage::QueryInputUpdated), + table(vec![name_column], &self.results), + ].into() + } +} \ No newline at end of file diff --git a/search/Cargo.toml b/search/Cargo.toml new file mode 100644 index 0000000..0273e86 --- /dev/null +++ b/search/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "gl-search" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] +tantivy.workspace = true +thiserror.workspace = true + +#poppler-rs = "0.26.0-alpha.0" +tracing.workspace = true +#oxidize-pdf = { version = "1.6", features = ["ocr-tesseract"] } +#xml = "1.2" \ No newline at end of file diff --git a/search/src/bible.rs b/search/src/bible.rs new file mode 100644 index 0000000..c56acb4 --- /dev/null +++ b/search/src/bible.rs @@ -0,0 +1,95 @@ +use std::io::{BufReader, Read}; +use tantivy::{doc, TantivyDocument}; +use xml::EventReader; +use xml::reader::XmlEvent; +use crate::Schema; + +/// Usage: +/// ``` +/// let file = File::open("./EnglishNKJBible.xml")?; +/// let documents = gl_search::BibleXmlConverter::xml_to_tantivy_documents(9, "https://graphofliberty.org/entity/E0", file); +/// let mut output = File::create("./EnglishNKJBible.jsonl")?; +/// for document in documents { +/// let json = document.to_json(Schema::schema()); +/// output.write(json.as_bytes())?; +/// output.write("\n".as_bytes())?; +/// } +/// ``` +pub struct BibleXmlConverter {} +impl BibleXmlConverter { + pub fn xml_to_tantivy_documents(type_: u64, iri: &str, reader: R) -> Vec { + let file = BufReader::new(reader); + let parser = EventReader::new(file); + let mut documents = vec![]; + + let mut book: Option = None; + let mut chapter: Option = None; + let mut verse: Option = None; + let mut content: Option = None; + for event in parser { + match event { + Ok(XmlEvent::StartElement { name, attributes, .. }) => { + match name.local_name.as_str() { + "book" => { + for attr in attributes { + if attr.name.local_name == "number" { + book = attr.value.parse().ok(); + } + } + }, + "chapter" => { + for attr in attributes { + if attr.name.local_name == "number" { + chapter = attr.value.parse().ok(); + } + } + }, + "verse" => { + for attr in attributes { + if attr.name.local_name == "number" { + verse = attr.value.parse().ok(); + } + } + } + _ => {} + } + } + Ok(XmlEvent::Characters(characters)) => { + content = Some(characters); + } + Ok(XmlEvent::EndElement { name }) => { + match name.local_name.as_str() { + "book" => { + book = None; + } + "chapter" => { + chapter = None; + } + "verse" => { + if let Some(book) = book && let Some(chapter) = chapter && let Some(verse) = verse && let Some(ref content) = content { + let document = doc!( + Schema::type_field() => type_, + Schema::iri_field() => iri, + Schema::book_field() => book, + Schema::chapter_field() => chapter, + Schema::verse_field() => verse, + Schema::content_field() => content.as_str(), + ); + documents.push(document); + } + verse = None; + } + _ => {} + } + } + Err(e) => { + eprintln!("Error: {e}"); + break; + } + _ => {} + } + } + + documents + } +} \ No newline at end of file diff --git a/search/src/error.rs b/search/src/error.rs new file mode 100644 index 0000000..3ee6735 --- /dev/null +++ b/search/src/error.rs @@ -0,0 +1,17 @@ +use thiserror::Error; +pub type Result = std::result::Result; + +#[derive(Debug, Error)] +pub enum SearchError { + #[error(transparent)] + TantivyError(#[from] tantivy::TantivyError), + + #[error(transparent)] + DocumentParsingError(#[from] tantivy::schema::DocParsingError), + + #[error(transparent)] + OpenDirectoryError(#[from] tantivy::directory::error::OpenDirectoryError), + + #[error("Path to index not specified")] + IndexPathNotSpecified, +} diff --git a/search/src/index.rs b/search/src/index.rs new file mode 100644 index 0000000..22de669 --- /dev/null +++ b/search/src/index.rs @@ -0,0 +1,132 @@ +use crate::error; +use crate::error::SearchError; +use crate::schema::Schema; +use std::path::PathBuf; +use tantivy::collector::TopDocs; +use tantivy::directory::{ManagedDirectory, MmapDirectory}; +use tantivy::query::{BooleanQuery, Occur, QueryParser, TermQuery}; +use tantivy::schema::{Field, IndexRecordOption, Value}; +use tantivy::tokenizer::{NgramTokenizer, TokenizerManager}; +use tantivy::{Index, IndexReader, IndexWriter, ReloadPolicy, TantivyDocument, Term, doc}; + +#[derive(Default)] +pub struct SearchIndexBuilder { + path: Option, +} + +impl SearchIndexBuilder { + pub fn with_path(mut self, path: impl Into) -> Self { + self.path = Some(path.into()); + self + } + + pub fn build(self) -> error::Result { + if let Some(path) = self.path { + let ngram_32 = NgramTokenizer::new(1, 32, false)?; + let tokenizer_manager = TokenizerManager::default(); + tokenizer_manager.register("ngram_32", ngram_32); + + let mmap_directory = MmapDirectory::open(path)?; + let managed_directory = ManagedDirectory::wrap(Box::new(mmap_directory))?; + let index = Index::builder() + .schema(Schema::schema().clone()) + .tokenizers(tokenizer_manager) + .open_or_create(managed_directory)?; + + let reader = index + .reader_builder() + .reload_policy(ReloadPolicy::OnCommitWithDelay) + .try_into()?; + + let writer = index.writer(50_000_000)?; + + Ok(SearchIndex { + index, + reader, + writer, + }) + } else { + Err(SearchError::IndexPathNotSpecified) + } + } +} + +pub struct SearchIndex { + index: Index, + reader: IndexReader, + writer: IndexWriter, +} + +impl SearchIndex { + pub fn builder() -> SearchIndexBuilder { + SearchIndexBuilder::default() + } + + pub fn remove_all_annotated_iris(&mut self) { + self.writer + .delete_term(Term::from_field_u64(Schema::type_field(), 0u64)); + self.writer.commit().unwrap(); + } + + pub fn add_annotated_iri( + &self, + iri: &str, + label: Option<&str>, + comment: Option<&str>, + ) -> crate::Result<()> { + let mut document = doc!( + Schema::type_field() => 0u64, + Schema::iri_field() => iri, + ); + + if let Some(label) = label { + document.add_text(Schema::label_field(), label.to_lowercase()); + } + + if let Some(comment) = comment { + document.add_text(Schema::comment_field(), comment); + } + + self.writer.add_document(document)?; + Ok(()) + } + + pub fn add<'a>(&self, document: TantivyDocument) -> crate::Result<()> { + self.writer.add_document(document)?; + Ok(()) + } + + pub fn commit(&mut self) -> crate::Result<()> { + self.writer.commit()?; + Ok(()) + } + + pub fn query( + &self, + type_: u64, + user_query: &str, + default_fields: Vec, + ) -> error::Result> { + let doc_type_term = Term::from_field_u64(Schema::type_field(), type_); + let doc_type_query = Box::new(TermQuery::new(doc_type_term, IndexRecordOption::Basic)); + + let parser = QueryParser::for_index(&self.index, default_fields); + let (user_query, _) = parser.parse_query_lenient(user_query); + let query = BooleanQuery::new(vec![ + (Occur::Must, doc_type_query), + (Occur::Must, user_query), + ]); + let searcher = self.reader.searcher(); + let results = searcher.search(&query, &TopDocs::with_limit(10000).order_by_score())?; + let mut iris = vec![]; + for (_score, address) in results.iter() { + let doc: TantivyDocument = searcher.doc(*address)?; + if let Some(doc_iri) = doc.get_first(Schema::iri_field()) { + let doc_iri_string = doc_iri.as_str().unwrap_or("???").to_string(); + iris.push(doc_iri_string); + } + } + + Ok(iris) + } +} diff --git a/search/src/lib.rs b/search/src/lib.rs new file mode 100644 index 0000000..f5e2089 --- /dev/null +++ b/search/src/lib.rs @@ -0,0 +1,9 @@ +mod error; +mod index; +mod schema; + +pub use tantivy::TantivyDocument as SearchDocument; + +pub use error::{Result, SearchError}; +pub use index::{SearchIndex, SearchIndexBuilder}; +pub use schema::Schema; diff --git a/search/src/pdf.rs b/search/src/pdf.rs new file mode 100644 index 0000000..9ba5b59 --- /dev/null +++ b/search/src/pdf.rs @@ -0,0 +1,26 @@ +use std::path::Path; +use tantivy::{doc, TantivyDocument}; +use tracing::info; +use gl_types::CatalogEntryType; +use crate::Schema; + +pub struct PdfTextExtractor {} + +impl PdfTextExtractor { + pub fn process>(path: P) -> Vec { + let document = poppler::Document::from_file(path.as_ref().to_str().unwrap(), None).unwrap(); + let mut tantivy_documents = vec![]; + for page in 0..document.n_pages() { + info!("Processing page {}", page); + let page = document.page(page).unwrap(); + let text = page.text().unwrap(); + let clean_text = text.as_str().replace("-\n", "").replace("\n", " "); + let document = doc!( + Schema::type_field() => u64::from(CatalogEntryType::AudioBook), + Schema::content_field() => clean_text.as_str(), + ); + tantivy_documents.push(document); + } + tantivy_documents + } +} \ No newline at end of file diff --git a/search/src/schema.rs b/search/src/schema.rs new file mode 100644 index 0000000..5518eea --- /dev/null +++ b/search/src/schema.rs @@ -0,0 +1,77 @@ +use std::sync::OnceLock; +use tantivy::schema; +use tantivy::schema::{ + Field, IndexRecordOption, Schema as TantivySchema, TextFieldIndexing, TextOptions, +}; + +static SCHEMA: OnceLock = OnceLock::new(); + +pub struct Schema; + +impl Schema { + pub fn schema() -> &'static TantivySchema { + SCHEMA.get_or_init(|| { + let ngram_32 = TextOptions::default().set_indexing_options( + TextFieldIndexing::default() + .set_index_option(IndexRecordOption::WithFreqsAndPositions) + .set_tokenizer("ngram_32"), + ); + + let en_stem = TextOptions::default().set_indexing_options( + TextFieldIndexing::default() + .set_index_option(IndexRecordOption::WithFreqsAndPositions) + .set_tokenizer("en_stem"), + ); + + let mut schema_builder = TantivySchema::builder(); + schema_builder.add_u64_field("type", schema::FAST | schema::INDEXED); + schema_builder.add_text_field("iri", schema::STORED | schema::STRING); + schema_builder.add_text_field("label", ngram_32.clone()); + schema_builder.add_text_field("comment", en_stem.clone()); + + schema_builder.add_text_field("given name", ngram_32.clone()); + schema_builder.add_text_field("surname", ngram_32); + + schema_builder.add_text_field("title", en_stem.clone()); + schema_builder.add_text_field("description", en_stem.clone()); + schema_builder.add_text_field("content", en_stem); + + schema_builder.add_u64_field("page", schema::STORED); + schema_builder.add_u64_field("book", schema::STORED); + schema_builder.add_u64_field("chapter", schema::STORED); + schema_builder.add_u64_field("verse", schema::STORED); + + schema_builder.build() + }) + } + + pub fn type_field() -> Field { + Self::schema().get_field("type").unwrap() + } + + pub fn iri_field() -> Field { + Self::schema().get_field("iri").unwrap() + } + + pub fn label_field() -> Field { + Self::schema().get_field("label").unwrap() + } + + pub fn comment_field() -> Field { + Self::schema().get_field("comment").unwrap() + } + + pub fn ontology_fields() -> Vec { + vec![Self::label_field(), Self::comment_field()] + } + + pub fn default_fields() -> Vec { + vec![ + Self::schema().get_field("given name").unwrap(), + Self::schema().get_field("surname").unwrap(), + Self::schema().get_field("title").unwrap(), + Self::schema().get_field("description").unwrap(), + Self::schema().get_field("content").unwrap(), + ] + } +}