pax_global_header00006660000000000000000000000064147532311520014515gustar00rootroot0000000000000052 comment=067552a95afff25484996fc43b21f607ac488e46 startup-disk-0.1.5/000077500000000000000000000000001475323115200141525ustar00rootroot00000000000000startup-disk-0.1.5/.gitignore000066400000000000000000000000101475323115200161310ustar00rootroot00000000000000/target startup-disk-0.1.5/.gitlab-ci.yml000066400000000000000000000003551475323115200166110ustar00rootroot00000000000000image: "fedora:41" variables: RUST_BACKTRACE: "full" RUSTFLAGS: "--verbose" before_script: - dnf install -y desktop-file-utils cargo gtk4-devel libadwaita-devel libappstream-glib make test: script: - make - make check startup-disk-0.1.5/Cargo.lock000066400000000000000000000634771475323115200161000ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "adler32" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "anstream" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "apple-nvram" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86c1056f6f4803156772f3369ae54d01cdfa36e901a1a271c620c3d445ae7eab" dependencies = [ "adler32", "crc32fast", "nix", ] [[package]] name = "asahi-bless" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1f6905316fcd1ec30e2ded7bf1ba1a8ba092f9d13bdf65fc98a5e528353112" dependencies = [ "apple-nvram", "clap", "gpt", "uuid", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "cairo-rs" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae50b5510d86cf96ac2370e66d8dc960882f3df179d6a5a1e52bd94a1416c0f7" dependencies = [ "bitflags 2.8.0", "cairo-sys-rs", "glib", "libc", ] [[package]] name = "cairo-sys-rs" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f18b6bb8e43c7eb0f2aac7976afe0c61b6f5fc2ab7bc4c139537ea56c92290df" dependencies = [ "glib-sys", "libc", "system-deps", ] [[package]] name = "cfg-expr" version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" dependencies = [ "smallvec", "target-lexicon", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "crc" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "field-offset" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ "memoffset 0.9.0", "rustc_version", ] [[package]] name = "futures-channel" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", ] [[package]] name = "futures-core" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-task" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-core", "futures-macro", "futures-task", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "gdk-pixbuf" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6efc7705f7863d37b12ad6974cbb310d35d054f5108cdc1e69037742f573c4c" dependencies = [ "gdk-pixbuf-sys", "gio", "glib", "libc", ] [[package]] name = "gdk-pixbuf-sys" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67f2587c9202bf997476bbba6aaed4f78a11538a2567df002a5f57f5331d0b5c" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", "system-deps", ] [[package]] name = "gdk4" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0196720118f880f71fe7da971eff58cc43a89c9cf73f46076b7cb1e60889b15" dependencies = [ "cairo-rs", "gdk-pixbuf", "gdk4-sys", "gio", "glib", "libc", "pango", ] [[package]] name = "gdk4-sys" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b0e1340bd15e7a78810cf39fed9e5d85f0a8f80b1d999d384ca17dcc452b60" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gio-sys", "glib-sys", "gobject-sys", "libc", "pango-sys", "pkg-config", "system-deps", ] [[package]] name = "getrandom" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", "libc", "wasi", "windows-targets", ] [[package]] name = "gio" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a517657589a174be9f60c667f1fec8b7ac82ed5db4ebf56cf073a3b5955d8e2e" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-util", "gio-sys", "glib", "libc", "pin-project-lite", "smallvec", ] [[package]] name = "gio-sys" version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8446d9b475730ebef81802c1738d972db42fde1c5a36a627ebc4d665fc87db04" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", "windows-sys", ] [[package]] name = "glib" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f969edf089188d821a30cde713b6f9eb08b20c63fc2e584aba2892a7984a8cc0" dependencies = [ "bitflags 2.8.0", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", "memchr", "smallvec", ] [[package]] name = "glib-build-tools" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3431c56f463443cba9bc3600248bc6d680cb614c2ee1cdd39dab5415bd12ac5c" [[package]] name = "glib-macros" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "715601f8f02e71baef9c1f94a657a9a77c192aea6097cf9ae7e5e177cd8cde68" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", "syn", ] [[package]] name = "glib-sys" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b360ff0f90d71de99095f79c526a5888c9c92fc9ee1b19da06c6f5e75f0c2a53" dependencies = [ "libc", "system-deps", ] [[package]] name = "gobject-sys" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67a56235e971a63bfd75abb13ef70064e1346388723422a68580d8a6fbac6423" dependencies = [ "glib-sys", "libc", "system-deps", ] [[package]] name = "gpt" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8283e7331b8c93b9756e0cfdbcfb90312852f953c6faf9bf741e684cc3b6ad69" dependencies = [ "bitflags 2.8.0", "crc", "log", "uuid", ] [[package]] name = "graphene-rs" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f39d3bcd2e24fd9c2874a56f277b72c03e728de9bdc95a8d4ef4c962f10ced98" dependencies = [ "glib", "graphene-sys", "libc", ] [[package]] name = "graphene-sys" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11a68d39515bf340e879b72cecd4a25c1332557757ada6e8aba8654b4b81d23a" dependencies = [ "glib-sys", "libc", "pkg-config", "system-deps", ] [[package]] name = "gsk4" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b9188db0a6219e708b6b6e7225718e459def664023dbddb8395ca1486d8102" dependencies = [ "cairo-rs", "gdk4", "glib", "graphene-rs", "gsk4-sys", "libc", "pango", ] [[package]] name = "gsk4-sys" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bca10fc65d68528a548efa3d8747934adcbe7058b73695c9a7f43a25352fce14" dependencies = [ "cairo-sys-rs", "gdk4-sys", "glib-sys", "gobject-sys", "graphene-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "gtk4" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b697ff938136625f6acf75f01951220f47a45adcf0060ee55b4671cf734dac44" dependencies = [ "cairo-rs", "field-offset", "futures-channel", "gdk-pixbuf", "gdk4", "gio", "glib", "graphene-rs", "gsk4", "gtk4-macros", "gtk4-sys", "libc", "pango", ] [[package]] name = "gtk4-macros" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ed1786c4703dd196baf7e103525ce0cf579b3a63a0570fe653b7ee6bac33999" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn", ] [[package]] name = "gtk4-sys" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af4b680cee5d2f786a2f91f1c77e95ecf2254522f0ca4edf3a2dce6cb35cecf" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "graphene-sys", "gsk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown", ] [[package]] name = "libadwaita" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8611ee9fb85e7606c362b513afcaf5b59853f79e4d98caaaf581d99465014247" dependencies = [ "gdk4", "gio", "glib", "gtk4", "libadwaita-sys", "libc", "pango", ] [[package]] name = "libadwaita-sys" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b099a223560118d4d4fa04b6d23f3ea5b7171fe1d83dfb7e6b45b54cdfc83af9" dependencies = [ "gdk4-sys", "gio-sys", "glib-sys", "gobject-sys", "gtk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "memoffset" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] [[package]] name = "nix" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", ] [[package]] name = "pango" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e89bd74250a03a05cec047b43465469102af803be2bf5e5a1088f8b8455e087" dependencies = [ "gio", "glib", "libc", "pango-sys", ] [[package]] name = "pango-sys" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71787e0019b499a5eda889279e4adb455a4f3fdd6870cd5ab7f4a5aa25df6699" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", ] [[package]] name = "pin-project-lite" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ "toml_edit 0.21.1", ] [[package]] name = "proc-macro2" version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha", "rand_core", "zerocopy", ] [[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.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" dependencies = [ "getrandom", "zerocopy", ] [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] [[package]] name = "semver" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_spanned" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] [[package]] name = "slab" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "startup-disk" version = "0.1.5" dependencies = [ "asahi-bless", "glib-build-tools", "gtk4", "libadwaita", "rand", "sudo", "uuid", ] [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "sudo" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88bd84d4c082e18e37fef52c0088e4407dabcef19d23a607fb4b5ee03b7d5b83" dependencies = [ "libc", "log", ] [[package]] name = "syn" version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-deps" version = "7.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "target-lexicon" version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "toml" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", "toml_edit 0.20.2", ] [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", "winnow", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ "getrandom", ] [[package]] name = "version-compare" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "wasi" version = "0.13.3+wasi-0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" dependencies = [ "wit-bindgen-rt", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" version = "0.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen-rt" version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ "bitflags 2.8.0", ] [[package]] name = "zerocopy" version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" dependencies = [ "proc-macro2", "quote", "syn", ] startup-disk-0.1.5/Cargo.toml000066400000000000000000000013501475323115200161010ustar00rootroot00000000000000[package] name = "startup-disk" version = "0.1.5" authors = ["Davide Cavalca "] edition = "2021" repository = "https://gitlab.gnome.org/davide125/startup-disk.git" homepage = "https://gitlab.gnome.org/davide125/startup-disk" license = "MIT" documentation = "https://gitlab.gnome.org/davide125/startup-disk" description = "Interface to choose the startup volume on Apple Silicon systems" categories = ["hardware-support"] keywords = ["gnome", "asahi"] [dependencies] adw = { version = "0.7.1", package = "libadwaita", features = ["v1_6"] } asahi-bless = "0.4.2" gtk = { version = "0.9.5", package = "gtk4", features = ["gnome_47"] } rand = "0.9" sudo = "0.6" uuid = "1.11" [build-dependencies] glib-build-tools = "0.18.0" startup-disk-0.1.5/LICENSE000066400000000000000000000020701475323115200151560ustar00rootroot00000000000000Copyright (c) 2023 Davide Cavalca Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. startup-disk-0.1.5/Makefile000066400000000000000000000034471475323115200156220ustar00rootroot00000000000000DESTDIR ?= PREFIX ?= /usr BINDIR ?= $(PREFIX)/bin DATADIR ?= $(PREFIX)/share RUSTFLAGS ?= --release ROOTDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) APP_ID := org.startup_disk.StartupDisk all: build appdata-test: gnome-software --show-metainfo=$(ROOTDIR)/res/$(APP_ID).metainfo.xml,icon=$(ROOTDIR)/res/$(APP_ID).svg appdata-validate: appstream-util validate-strict res/$(APP_ID).metainfo.xml build: cargo build $(RUSTFLAGS) check: check-bin check-data check-bin: cargo test $(RUSTFLAGS) check-data: desktop-file-validate res/$(APP_ID).desktop appstream-util validate-relax --nonet res/$(APP_ID).metainfo.xml clean: rm -rf target install: install-bin install-data update-caches install-bin: install -Dpm0755 -t $(DESTDIR)$(BINDIR)/ target/release/startup-disk install-data: desktop-file-install --dir=$(DESTDIR)$(DATADIR)/applications/ res/$(APP_ID).desktop install -Dpm0644 -t $(DESTDIR)$(DATADIR)/icons/hicolor/scalable/apps/ res/$(APP_ID).svg install -Dpm0644 -t $(DESTDIR)$(DATADIR)/metainfo/ res/$(APP_ID).metainfo.xml install -Dpm0644 -t $(DESTDIR)$(DATADIR)/polkit-1/actions/ res/$(APP_ID).policy uninstall: uninstall-bin uninstall-data update-caches uninstall-bin: rm -f $(DESTDIR)$(BINDIR)/startup-disk uninstall-data: rm -f $(DESTDIR)$(DATADIR)/applications/$(APP_ID).desktop rm -f $(DESTDIR)$(DATADIR)/icons/hicolor/scalable/apps/$(APP_ID).svg rm -f $(DESTDIR)$(DATADIR)/metainfo/$(APP_ID).metainfo.xml rm -f $(DESTDIR)$(DATADIR)/polkit-1/actions/$(APP_ID).policy update-caches: gtk-update-icon-cache --force --ignore-theme-index $(DESTDIR)$(DATADIR)/icons/hicolor update-desktop-database $(DESTDIR)$(DATADIR)/applications .PHONY: appdata-test appdata-validate check check-bin check-data install install-bin install-data uninstall uninstall-bin uninstall-data update-caches startup-disk-0.1.5/README.md000066400000000000000000000046611475323115200154400ustar00rootroot00000000000000![Icon](./res/org.startup_disk.StartupDisk.svg) # Startup Disk Startup Disk provides a simple interface to choose the startup volume on Apple Silicon Macs running [Asahi Linux](https://asahilinux.org/). ![Screenshot](./res/screenshot.png) ## Status Basic functionality is implemented and works. While Startup Disk should be safe in normal operation, error checking is minimal to nonexistent. In particular, races and corruption are possible if multiple writers attempt to access the NVRAM at the same time -- do not run multiple copies of Startup Disk at the same time, and do not run Startup Disk concurrently with `asahi-bless`, `asahi-nvram` or other tools that access the NVRAM. If something goes _very_ wrong, you might have to perform a [DFU restore](https://support.apple.com/guide/apple-configurator-mac/revive-or-restore-a-mac-with-apple-silicon-apdd5f3c75ad/mac). ## Contributing I'm mostly writing this as an excuse to teach myself [Rust](https://www.rust-lang.org/). While I'm striving to follow best practices, this is likely not the codebase you want to use for inspiration, at least at this stage. Contributions and feedback via [issues](https://gitlab.gnome.org/davide125/startup-disk/-/issues) and [MRs](https://gitlab.gnome.org/davide125/startup-disk/-/merge_requests) are always appreciated. Please follow the [GNOME Code of Conduct](https://conduct.gnome.org/) when participating in project spaces. ## License Startup Disk is [MIT](https://spdx.org/licenses/MIT.html) licensed. See the [LICENSE](LICENSE) file for the full text of the license. ## Credits Startup Disk is a GUI around [asahi-bless](https://crates.io/crates/asahi-bless) implemented with [gtk-rs](https://gtk-rs.org/) and [libadwaita-rs](https://crates.io/crates/libadwaita). See the [Cargo manifest](Cargo.toml) for additional dependencies that Startup Disk relies on. The [application icon](res/org.startup_disk.StartupDisk.svg) is a derived work of the Adwaita [hard disk icon](https://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/blob/gnome-45/Adwaita/scalable/devices/drive-harddisk.svg) and the [GNOME Settings icon](https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/gnome-45/data/icons/hicolor/scalable/apps/org.gnome.Settings.svg); it was created using [Inkscape](https://inkscape.org/) and [App Icon Preview](https://gitlab.gnome.org/World/design/app-icon-preview); the latter was also used to create the [Devel variant](res/org.startup_disk.StartupDisk.Devel.svg). startup-disk-0.1.5/build.rs000066400000000000000000000002721475323115200156200ustar00rootroot00000000000000// SPDX-License-Identifier: MIT fn main() { glib_build_tools::compile_resources( &["res"], "res/resources.gresource.xml", "startup-disk.gresource", ); } startup-disk-0.1.5/res/000077500000000000000000000000001475323115200147435ustar00rootroot00000000000000startup-disk-0.1.5/res/boot_candidate.ui000066400000000000000000000013651475323115200202460ustar00rootroot00000000000000 startup-disk-0.1.5/res/org.startup_disk.StartupDisk.Devel.svg000066400000000000000000000674751475323115200243230ustar00rootroot00000000000000 startup-disk-0.1.5/res/org.startup_disk.StartupDisk.desktop000066400000000000000000000003761475323115200241220ustar00rootroot00000000000000[Desktop Entry] Name=Startup Disk Comment=Choose the startup volume Exec=pkexec startup-disk Icon=org.startup_disk.StartupDisk Terminal=false Type=Application Categories=GNOME;GTK;Utility;X-GNOME-Utilities; StartupNotify=true StartupWMClass=startup-disk startup-disk-0.1.5/res/org.startup_disk.StartupDisk.metainfo.xml000066400000000000000000000041731475323115200250510ustar00rootroot00000000000000 org.startup_disk.StartupDisk Startup Disk Choose the startup volume CC0-1.0 MIT

Simple interface to choose the startup volume on Apple Silicon systems

https://gitlab.gnome.org/davide125/startup-disk/-/raw/main/res/screenshot.png Davide Cavalca https://startup-disk.org https://gitlab.gnome.org/davide125/startup-disk/-/issues GNOME 360 offline-only pointing keyboard touch

More robust logic for picking the default nvram MTD partition

UI improvements

Various metadata fixes

Fix the displayed app version to be consistent

Minor fixes to make packaging easier

Initial release

startup-disk-0.1.5/res/org.startup_disk.StartupDisk.policy000066400000000000000000000016161475323115200237460ustar00rootroot00000000000000 Startup Disk https://gitlab.gnome.org/davide125/startup-disk Run Startup Disk Authentication is required to run Startup Disk org.startup_disk.StartupDisk auth_admin_keep auth_admin_keep yes /usr/bin/startup-disk true startup-disk-0.1.5/res/org.startup_disk.StartupDisk.svg000066400000000000000000000351461475323115200232530ustar00rootroot00000000000000 startup-disk-0.1.5/res/resources.gresource.xml000066400000000000000000000006701475323115200214770ustar00rootroot00000000000000 style.css org.startup_disk.StartupDisk.metainfo.xml window.ui boot_candidate.ui startup-disk-0.1.5/res/screenshot.png000066400000000000000000002002551475323115200176320ustar00rootroot00000000000000PNG  IHDRa{LtIDATx6 сV辗 i(wGI4؇"Oxp{"c_ E;B PD0 D#A{HD\ WD"@D !D]' *\@Dڻ=J Yh}<' ;:c ~BPpE(Z'~b1šp H8sMx,"Dq(de8䋝GC1'ADQCY/]c!8r}Df87m SГtQ^K/7="z5Fm? l 3š0KVCc8b<9š0_jG3 ^**EOQXz 䦑XDq( M}J\pǡ0A}][<<'8[6~ka/d8Da5 PY4妁p@ ,D`qX8C {%"2"NQvQDq( ;X8 ox\P(,a!`;XPG-vY;{| 6)^Da1!-1E@ p}>qkڿ{V0ZzPN lEP X Dq((F\La!k @8捑 +fÍ3 P̎@< aiNQ8{l5 a @8f5 aA CQ8?%uXW=Cqax~ c=l(O?PUxn (O  1#!O C†(,a+4jkfo_ QqhjX EAwM! ['2GǼ[ 'aF1c2■ 8Y ,?fahZX J88> 9PjAX9n:t j a(zëSHBh ,bb0'ơB_?x‰)a|'cCj|h CdJC|18?[<L c>+Q8ptן2: @HNTǿD1gaNL4M M Wº(;j8~޳3&@ | Di-R]PJU@"BARl$vr똼u;ql̔o?{b]nj#oo\V ,h|T<lN?Ғʢ06^3oz19lKYhX>%\!ia0;'0_~;;;"3=6(9Mhp8ǿ޹sF;IhplO&fYR _W?ca)6Kx߽{iT` hQ:x{{{iiKRITy9>7_J*YR|yJa^㜒9=tZ8~x||oΝ{4il/ JO||l&BnFbȴųy} jN!I1۷oKkAf~SgE0+rɺ21;D2xxxիWg(XbO3`ʇ[y9lXgj2*œ,e ivSB=zRxttÅ  g 4jlނYқO![x9-8Z:]S(zAr8Y0Cɮ94͠ʰ%SCJ\bH+ٯs^O{ҟR Pa3+G3YW ig !KS[[fjL-)6n| epӑ/^.OZI)KQӹizv^hRF) ,- %by!Ǟ/5숳R89hFԬ(Q{zUC|֧[B1n#<{ǣG.O}53cV95P q˜=9G,[n![乴`jauRXܔ,aMq=o|{R 5;j̷pdah{8="H+|O2R뿰Dcr?ݻuٱ%gӘF{9iŐ|o ? 4;fIUtRde7׷9M7eDJ5CSv=Ő);qwy 9˔ŹTIIff t;HÍ ))X!'w7P %ev ̔y\ڥRz`!LȻ`nN)C@gf-tK!/%nq! =NF@qx]xuxUxExyxX>R=<ԓo rz9=/leۉs`2IL&=5a4zn*G1Ua{=9vyjls ĐAϱh[uphBVCKS{UitlR/v#P !zL1:޼y%.MKS[?cE'{+序bȄQǥ%?a1{婔6 ,Ul?WDV 5EgBg{a 7O޾}B-VVF{tTRY)ԦߡVϗR?WF1Hđb0+3,)CJ"࿾Z>ZsYiȂe82G1J fq8@仙R*" plSfwBn\gH]EQ=+Wizixuss3kYr$TS߅!{ =V}@aR* 2TJ!$$$QTڡIC[6PB(!THw;s5˧8>)))ATTԇ%ߝB{|+g m9>9AC9www:99:ǑF[t}} 3={p$͡rJ=}Obؙ!@ss?GHLL|bffӜߛC%d&xdd e'vwwAa -- ")0dXQ__J^LJxfC`<2jC*p[tuu= PUUv٦r$''wԔQ[[\Ê KCCCHJJהe:;; =s3lX@C1qe#;;1yw8L#~Sf~Ѿ>LNN*((<<<'0J*֠W^5 PTobsׯB#:fׯӧm&[ QءC6~Sݻ9 `3f7ю@+5m%m-]{ǭ5IJ*p#/W!D7uX#E LR.M*GzZxrf 6JJJlTڱcc0[uVֳڈB#ΝkӧORڒ;wڑ#GR!5aǏ /+޸q*UWWfkq UkBp͚5IP&6WPBOm!DP.c= `^VCYsGeC }KH0]vf#ͣPO;%`E%U58UqGz lRyrXaCrѱcGBdgϞBe|~}ݔSiJ !]ha=7GKbs&Na , Vd!\,X`7oX|EIiX콏?92h;Ɯ"m qD}"c.]*ڵW/H%ݺuEq`%e/_FOS75 fƪH'=wT|Ϡ 'N~IK "\fСCm6?Xb9xǍG͜9i@TR􉩓'OPl4ص{Qm|ŒN/U CUT1E !D^AbD! s1Ȉ 6DKL7۷oT#[Bo":cƌ*7%I:i6>|TL-'J3=&v큅*}B(ظqctY6J( #sζd4I~36cIܒ:ra6>LVcl 5(!$ [8 AHx(qHAYеko.^&ՎS_%Bp  d!`DGAvڤ&K*^j+ 2Nć=y2pĞSNô!SxQ譢 B=B6?#!AąP(uJQqFPd޽{ P!%[ ǶxL+**l֬Yec…6~x\3 %x0$Kh08orBH"K=Bk׮lkjjmgΜD OiS5 ( v#ZNBfU;6t"VZe.\0*dW^m@mʕvy{9#?cz!~~cN<}Ç,a/̤Y`.[KfNՓ=~̓cR,~cKBiϼ'Ge> !yšY{BWE\B\r>}dׯ_?yf>|xhiZ=rԩ7"P-/@t"6 "6p+)ZqXt_r9Ϟ=3'O\! *=w,L?Ν;v94Ѿ̩ɜk q>G[YiW) !k׮,SQ$4{}$0y!GfQDpƛڀӦMLL4臌K ѣG[]]!P!}PPЋ p[[[kH B f!a(GP!#۷Ϫ2EHfT%:DZ\\("p-};v,YII 3FX6F;Rceee cgX?-.0Ir[WWf"BZGrȑA5+DőՖ1h D46SF\D۶mTXʚ'N>)yݢg}8&~gc!x=3 `ݺub KBJߙAW{5ÄO20֒h){.@;h|yzh/{w:qqK)TA>Bh?v $;ڶXd1/1F5Ya΄e+`i2Fsc`EyD CϽ7YaVɘ\4OөFdL `Cynq1d,TvsJ$9xQ+X1Mߗ{垢\\ ޡɣ"rC!̈R㱖kڹCX=L`Y+{lk嚹6CQ plL堘V󳼖L>>Ɯ?b/sWV @G6@Ș C!a0@ C!a0@ j) ƿO糦@> V bz+C!a00@ C!a0@ C!a0@ C!a_qy@BP@ kDB"(t !tH#ư͌~'<8 À,ˈ`a2/"".t], eYqǁ,ysx+M`SEQ`g|u]_!""Jmi,˂}1 (s$ImyX4=e> $I qж-DQDUUDDDoqDǸ;@$8%APO)B@D$*@oPR( PPo"B! IZk] w9Cy|>m[=O}@ PH$j4dx~Fl6p8L&o`Q3pv~3nzܵp^e|>w;tT* B J&J!dŢ,N\z^mPBAX[>GjULb1xFZTe ֕sө6j2ȍ6L<C!\.emͦC!`v+I ppD"~  (_ T*vmCZi{ e. j5u7EPR{gJPI%D @PT)H NZz?lǜٍ33 ԁ\.k2䭮gvZJ~xT>gޣDQy<j5f=K4 "4~n,C4gt^e^c9b\(6 *f}3n|>T*%;МN|>Vr9sFVX>Śh9Jaq1nb(!s6#oDk:C]N#Qt:j*cvz B·զf)hdnB^g tST"V:1x44{9`f9h`'. TE/_c3z6#o3ɽg~1=\4T*glpl ]szi0ȘL&eZĽFaJc!yo=L#";2vx٫j="7>5zn\.:G"G-/e+c-ө]bCLx\ػ]Ӣ ! B# СPUD"TNWfĕdcof͚5ytt:e:m6GR,h ޣy5- "$Iz.*wk`33{Jٻ~lₜf$ CykM!o.aE ]L2H JRа3H<$K.;9\.С7'S lf3n6Na`4(?JWH2݆V3$v$mo$Vh4i~JnLHWYoȈoioĸ!bk֜$ֲqb Kqs ؘ8ˊbj=d2g!5sb#ŜVuS`[R >fl6~/K$+b^/jZ<6gK} Hz6~gڷ#|>Gqx[G&..o1|BmL߄`0I 'v;,k b8F^\ػM/= *I)F%("BAJIA zRo簮?>ァ=fwf /hZ)Y.O/%GqXx/\> ˛o{ $7nZ?"yAyfc3l$Q&ExbO<Us8FF<}m> wDO>=wc@96`O:IbFhgkazGzn##thH2D1evpqpׯo }2*d?7oތs(;s@q kwٹs&}w$ D%t{K#8L3.@ n٩Êu[:ނ{da /8p 3 NB&*}4UQZ3M!3<{Gjd%`!o8 ?duBA # Ů]&FzYʱcǐR$2 dʢi,"geD++%?~G|W-88}Sݧ-d '_b@ sGtAΛ3Q)GX@/ !r7itFV߿"7R4*]4c_~yo*ozGI#kz _Q}GylRmXK{Q: .:q޺u; *۶mDs:4nisrƱEs^j[MڳcMX #GRlbըEP?9W\?CzN28<ɺ#9Ş={&SsVQ]Q#gx] HJք ݴX ,$/"ՌQoۣ)@~IcwXD3@1b 'hB;K#ځH -֗3"'HX[Ҝ{..{tDADY!2OWD8oڀTA<N[̅[n!&ènWvZq -Aӌl`$ o6leQme5bCߟVp0PDjtVo8&^y:**0 qۼyT"#iUYr$ )ymV+[P}e HI,qa_OH U@ ~L;Pì5)[{qCR6+{"Y^eӃ/ghiUagjJA/;tdG" yoG^NGlp@K tqn{_9.F-]t|uy %W#F4_**aXQELaZ\AE9"/zc{cD , 'k A!Wb n<t,1>J"{dD@DN4 m[FF۠7Rڊ*۳efHFS<1FOKdE\)PhEICo(bg:̓@80Cq&%p1-gLe~1uju5S$._N(4?p\!+ rd1m ",Q8o DmDC bAע "3b.Pt gr$  ;>YG{T ( b.iOCAg 2:0JMŋR.`GDc5 gKʥ(mhs4Y![G{ie R=/7U!?6cڢ[y71C׉ȍ[N7Dq{EJyyV Q^**0@Ta@vDWx&ȀB5Qwzꉐ;@R @t堪vgD~ ܹs>D-m!b7g軨:G޺*u<R YVL,xG5Z2:=9;p59Ѩ?ݮ="4A.4M'!kI#I3Q#Q{"`ZNP2obCS!ʑyvT"T<[_}3r0E@)[zg"͸+("%Ӿfoly 6k(/[ mVTHQiAE6DJYǏS)pҌ,} Ipt"hWVFE+ UQ "YVz6JZxKyS;wDʔCw'*ix [ }gctCZ1BLL"ΈtpR_',5'Ɋ"؟8qb"9#sBz;)tT8z ~>~.sFDD4U)Q!5M!O3Gn]"fzb%νv{Z C%2hN/ULE={V\5GqIn4ޛrG~~a QMNƋӧO#2{ )RoY\Jkm{;4>=_ѫ:̙3#nc#8!gy&)xħ1Ɛ&T&0;K.ikt>pq٪X=&$w!S$^&@gz hG 3S ŌQ*?&{H>r $Y." (,k9KȖ;$11h ځkD3RJ& t! =@!%.f6-I:)YAP}Paa3"z5Tњϟ0L".HI>w`{)p5˪m eFf# Bl^IG-ڌpqx%AJː7Pt_Ʃn! #dRpӯCaK!5˗/ƈt5 qfD\k1P‚ XEP27,}D5!btyEbt)It {FV-< y琺 GHQXT߿I C sB^x52dX cmEg1p z@{?cdJ"+"<׮]?gL8gjZxoiQ$W&(w2"*2}զTXy|!/OjIi3)ӒwՀldI8ev^ ?b&2;\.ܷggx^O>zI]JYvuOzϫ߯b@^&gr&n00D^! s(g r:rj!``0l6-ĵ ^\'YV>1+``!``!`` b^c7@;pb_g,e)sHߏd%qݵ$dȉB眦K:7`=ϛRh4h\j|F/Ũv,%F)L(|+W!1):bP A'f .4tbL1!gbl?/mJsojO!3xeC@Sbjjv]cjxc.)i\H)j2QʪB ܫR w^,!  S^lT`5Ơ"8gm<`0Ѓ,E$AOٔ==clvM1*Ġ|~{Wa;4Y3m{ 8Rj$zz?]b `H)K>/Fb/|+ݾ]v0yi_{d@t>tv= )'m\JJ>W,Sfz^OuxоwY뷿RGGkXo6vo{koCP@EYiŔ! ^VL>Dm6[h1N@PIV}dr_ 9/se>*Ino~[u<Ԩ`>/˕M۬yƞhQw3!пokQ31̄3L{hG@Lj #{DJsp!9uzrݻuއZ?x^z>Pwi2joT乼sq>`+MFsm>^Йд+7F#V?!1FeYfVO˲Kg>탧|0vIJȹLY9p P] !<8oAt:dGϜ^ta@خElZJ!O?B ;pEiK!e)= l}٫J*6B]8d{pEDtv}cbXUʪ^:; N{Ch&ػq璔e'}yכĶBF .}PH :vpyxǩ 6~~*X'@mᮉjxkUC .^$IQz|zJÇY% NW[U )5:p}t=3Si ,ӀcT >Az0aM@ti>c8Ao @04MWŠX0,d>! lu|@X?QǓC3 ##,x LX3{DD`SX;,^>C#Fzr f&2N=ya\ @nDA ,_?Q4t/  ڨ{eks}4 `@zXg܆$*0 CS.| [?Q0:kZ`=#1 @(|=UL[e{K8]Yљ@8=n G{=̫{?1$XpϔG89_Gy}0 M.-n GyY~hC3W#:E!@8#}t I~$l_|=Au;]3 o# sİ`*83/.p8 J#{e'\'ʿoϟHr1N)5:0 \f~1 Mf^#6Z]v/35p<>`; COpld*8{ӳ߿>@0=R{0 rw݌ aM@tiK'^ {Q]+$3Ǐ V;7?1)Fp矡<0#4 523e1&IjF+ { /_>+F%f6HA1j ~b B{7==5L !~ײݮ{wyr݇!u7?+NOLawp|:۷orI1,ho p'}]wjڟWRj]Dz˷#.zҏ 1_lwDz7Ǖ y '^:q ^0bSº뢙brr>wNRJ/!0ƨ4jRMfAf&qƟB?i8߿Ĕ'FzL+4lU>43{M'\s4h߶JMZc fZQ<>^Y1Ƿ pxpz^G{sw0nx^9!wW  yry~O̵џ?ep4I$޵/_>)8vC# &S@dJ)*DSQ `Ld$GP.KB?A ?o߾߭GX~b>lO 3Xpnb# ??3֯(\Yŵ__m 1i:] p:c޵QL.#̼GXumG8I ~tܕrh}påO|q^DNfA @0W1Ɋ@X |@|뮶N Yi.f]@X~$ޭݮp7Us/#{3!z=鹺GXpm^w>ɂ! .tw?.~GX~•-~G8k{ǣ>* `zAf62aɥzW~by8963-U@0ɡ03Gac4C;J1맂'\:hC@Qmw)Y?@8u>cTQ!wc$Nxf&pcvm4z+[h+'zIp]awgf'pCBjwRaM@t|*X0O~YU]Ð3$|@, οZ#,/#ںxn`1F'bUpb`a#Ka毛f^#\It')&o#\}?Ęs!дX?粉T=NGI!`b!N{#XP.yE. dxF5k!=|ex`ؐL!U#,[?ʖ_?1jY0Na )5ƕ_\G{ofDswn`3SW{hf {a7#םjv{V@0V~%u'\Y!F7H){S@s)51 !\arwV @0$k'__?Q#̼xb)!SJV @0%/Z?qa=š !`Wf^#,Xm@X{TA!`BpU5%O\GapCV@0{kKUzN w.jmC@0yAPrzg( +c$_|DyؚeSEO׶@0Mzr#5 BZ `~ P7#\õQ` t+ \ϋ(!Rlb 3ǟ0 F+ la=Škb]*52w=IFЩﺙV!`M/>43 SdvaU=”$YP?"{`0N ׿~bGfתm }} 1C\Sp`Za91P4̂Lr}> nϿwA ?s 2E3r:=BN;m{x .)ZK̢I1$5NG s4c  Lak={'vˋIQ%⃞u:\&F7C@ L0`K6^wwzzzRu]0ǍlQ?5gPR$gf(:ISĊ5s]?ո~sdRԔb7nCx  R8c0dzm`̜|1׳ P렙=lcLMz#A! aEت]?QLXSzCUO{Rx=Ll6`XMʗ"LI  v#Oun9/fJ`t ˁ0HGؘ8J\I`C3hM4>#511%{>!(9 ,efkub|nwdf~$q_`(WVuD믍6 kh0 =D. qmݮ#o#!/6!~<) V saap8W0}n{K( `8RI]y{NN'3;i mX`0!a1{ڝzLfD_z(p RXTS=~U}|B}&`H@QMOfN! AKXG8 nun N5B\ 0ͥ~N?hfʲL! { Ǔ?{~ =F,kI230Ot}}sT@c0  hےKt#B9C0Sr{?sİTݕC@*^z=B^A[! !B?}y!PzN#dNk泳,Lj wT̴^˫kfӳM ( $C@bV{"дB=~,Nzsnt@WC@r͍s8{r)Q!`}q(4=-̋\Xw @`K=Oݼ}~hvd2SL ιxᰏ yК'rfJ`X_ȹLN@n{|.=GcGE:k٪?^Lju'O?4j |˫Ky_jd01< qb8U>>ciax2`x`s* /{|J>x/ h4|-\^j۫k6_L ]ue}D!@Hjtqϛqwwwww[IH ~8ӛ¤igPߵ^yr0|.sZl|!dʖawvϫVj a)CuӊO , R5T2YiWHUҢjciz?::*TYU~sڱmٜ*R:6It ' OQ"aD"ߺ׬U 'Z 1 {蜚 p=9z 47X((Lh3 NdsX[7OԄB;SLFN )"2Lwns(9Қ: n իiE:USI%Tq%-VXԢEfZrCk*RRlٺUvPXYYG<{I1ONjKł|LVP(* {ю;-A>?e<;FrVI٩-[ɿ/>1ռySp9YRJD ե-nzC`0q0s(眢dJIѡm۶ŁЂ9g+!AUD"h·Ck=<ߖq*]N1CUF=;vT{GBtZ[9\1N%t&K$rr٬b~(PB\fB;wjaQNk]~@d"0$,\-jmoOO's i6|#rNc<[ZZ,f!hW>N_jV :R;\H'.===쐊B:󬳏9Lêqx?K!{]AMM`Z!Ql~\Xtb`dxDfg  X(奒*hpxgzzzۣ{]`6?OC<ϳauus* VьАp|>أL&#߷ ƮK[ZjC s 7HaS\.:t/V2O>_𐍣<=%SI-_ަj@0Ųd"׽㲑 TWW-M HxEXI֞yղt]B x%MHUhXJ}KZZd=8lf&OYPPMӬ`!t9窡ٴI]yTp S@C}JG$ Wg̾Pc@:c*-\P~-},Mޮ˗D‘G$'ApߠzBaFZh***0eym #=^vԭb19Y'lmTsS/^d\2ۗ94a9Y ۼy TW?>3Kvߛ Y@0r97Qh E# 3+VEvftr--ݭ h)vI- dykEg- Us6chhH55=Y4,N.~ƞ /+WZ)ĸbsnutvYpΝعkv9vg3Iv늶Z8cpppBaڳqe3+?c`ݛZw(̔*=?lٲ{zٵ_}}^s'RѾ8ܥ٨GYp…Zz.W"LImk[0Z0>}lT ,%;<ZTbsjvԺUWRhlTkÆYؽk: ]D̨mK&JDuμ:~6|:9ɮqIUHɌʹUP@nv *VSS>˖0I#`=={#Huu5 @{곟^Wky*)fZ*UUרm:*X0PϘ ) |9'yMxoDkY1TUUZI9?'R6֮=S.) ƜEBB|hע˒͌~utt{6ꪫ_7rڵ{0꜓q2A%MMڰ<=ҥ'&N\qҝsq(rş%C4شyOߥrfsdݹ뮻'*vph\ٟ,;gˮ<'ɓ{%9:?c_+[$9+Ǯ-LjtF5@T,DN1g aZ[0=8Ɲ}.%;Slc{T6oޢoU/ztr#P4b(L6YyꭊEg2G3i;?e9+ qAκeXpoύJJ'㜒ɤlia0{[A`r},)Kϕdn]r:6!'n߾Cmm+t$u:r77pd8 OYDSRģF*3seL8g!QF*/q255O(MMjjlR<Fٯ4Dž7]E[m%@kz{4zٳW{ @0LhZ׽~;>jvfXW~st @sI%TUXE*7vrBYț9?⎔ ̳-_:;g6wBҜc@H/9_500Xz?HO|v Iߟ+.J## `hhP_~KԨ S c{T!9Bt0("*V(deޖDf E о'; T0VQ(LBJ\ƧLJO.ջf}?]wmTix-Z ޟ^z6@0LC}=jZҢ|z;tĥA .*M4ddPDa(԰:ι`qis~ɾ[?UGE- \5{ghhHpl[ޱ[K[/oy;7Z{CTx) h=퐟]wޡ[8}_Ol*%uud֬Y#{ |k*B^ʅa U*ǮcP®q>_*ص|toS0 kʣ(MCZ{g'h3\pI:U]]i ^Wڈ`we/{`hkk|w =<'7MZ~f34p! Lk__L&t?>T*@0466ϟ?8 gu~_kժU eZ|RV`!+V{%/QE:a3A‹GGܤ@0e]>tS,LOx>Y~s[(~׻nW_7jsFjҨtgA筟j]pV' `))` !` _attN "H@XB`cx^?|a0@ C; C!a0@ m"IaG ?u4Mi4žzTUuwQW8mY.˲<ʲcx!mq?1qGQAb'ѾE ]a}U)JU$ \n#ݽSh2}=?/Uqa$|^"d+ľt:Bv ""b#:\.1a$|>c^Hv;ytbr\j# aRATB<じL&d2N "@DDolBBRxD0\L&$ m|>m6!jK>l6v3׋`0('hZV8N((g!fp8 VNF\NB)P{юaHDDpX[ o#%ka(ŌHm1X,"""bQ$^l6}X,DQp*/"""!ƍSBRAZ*A)E%EbHIAI$]woWog۽}߻ꞝ9'\C9sװœedd:>}CibG>Ç /_H]3Bpa%L;=ܹ;wr>\VZj/U1k֬{wҥK TQii~ds9mذArJ[mHPqqV^9jɒ%Җ}m۶ c>c1v /\o:u~PM6[8f "]'ND(&[ɠ?~ym߾]]JDaqDGYYAܹ3I#FPN#@T1/"߿L}9r\ݿQKEbs"ui}Rǎ:v93"XX>޸qٳgkС$hիW0pCZO}}O>7o{uӧO\OG֟x NAAz%aAv=[?N/^!ۥKmܸQ߿gw-ZØ, Q˸nZ8pKY;"S/V}'-Z(@sT'/_^eĕKeT|20mtY6Cc1)5 w0#pJ&M#=*'NpC+D pcoy & ApXy3fL\c96oެTc1cL JCcp-3gN3C>|M= >\ n$ \&Y߽{_~\ZvN:ʿK}Tu]~A7cah1v !Hq !FK_Kة#DHK Su=c\po1 ">S7o":۶mCx7֜c11~z'5"uZO(KP^Ȏ(FA(VP _p.c:<-kLN :"h}! !VCҰ 0a!6Ư1`(tw4~j8rs9-DRd+'@VχC2'GU'3xh&w" ?"C,of*TnVP((O N C!a0@ C!a0@ C!a0Q@a3n[<.m0xc(X0Ia^w(ZN; ?! 7Wn/. !q}<\0i>4AS@ a4u]CB@ aF `0@ C!a0`]8afe(s{2*j~wiCefff:8ؕ_m#kdI4K+i~sr\Y*cy8𬚦Q]7JblvjE&#FCysNKq)3M#uп_p^cM& dWYBA}U-Xmq֖v> a<hV4NC\vnۦꠓBկ~w]i?t彷?K4v}wz\k U4Zt{65͞~CDZ 뺶{~g`o4MS'[w> 4\x wUU| Gɝ[>6=}a'ӹBW?w<ٲZuQgQtАli=vCagzJLr+TPsV3Q?7ndU ~ols^GC-Bo$Bb?Dzm[75`r#7j]z[{z% &m۪i[דaw @0ٛBswɧ[`I@I L}Qu]zuC>(zo /@77ɬh;Gu1t3NmvY!`֞ Naf@|!pC1zg!`#tGX4T_O~; u ‚1̝d|,1h86:O1Y`X#Msxc &Ě{==7D`Sˁ|*#|~3 GFz: dU"N=}yp@h&zEFsa`J@0MG@'=‚H C.~b͔g~kC*a|*X# ScGgM GzCX?1{6#I&`5B|p/$Wxlt>NM!#t=B`/{W?1T)aiprKE=8?` KY=‚3D43 }=™![ ~Ppg.Nנ[{6#|9CD313zSgL 3sSשjv ,aKK⯟`xg!I0$odN߿G#|iIKiԏ?w + 8(=}y0o_,~"="5`XaUU>iGN ]z1 M/#t)GXpl4?]m[ÞMp:=V{#\j_-~lt>fN"]G8Oc/bݽV@0<>>?DUU)pGQW#gRI &i'cR? :z<;33}t }nnWX)ɔc]~5R33c%3Vu] @0Cw?Jڴ^bf!8z71cp>~_t<$gB2kV?`XYo}'ea󐸵@# t<ׯ_~s|1vR!ުmۧcWq={6#>]ãB ӯftqCO|&9w.8%,~K=¬;w}sשcTUתZ1OL!\&}tnקObU꺳M]* i*}1KHNbp׶W@0iqA}:R=M p|?]G{~#|eb ]C !|TL~o==r߿//~"+ 珍NƤªú@%7{B( =¬~? {B4U1 !lҾ}'IҠrޭG{cpA O:z'V?oG87ɬb- x||]*xG[C4^ p> υKo>2|ХaѢ|@ &z`t=~u=?ںfҫ78 !`>0TzlGpAA@'N c/  sdA ,SIfyp> HphkơSU`3S6Z?1O䆭J{s~PU !v'Pz'T#|sV@0|7#G&j_I2@0t;)aYX>,z騶 !'u,#t`*X{''߃0w@ 4vKe=™x_G?%wgY07TUU`a X~Dap>Ku.*@0`͆-Ra0=B{Z?c3*nner{.#\wa4ݍ>ba|*X#ZGkبx `1m[%z]EO-Nu ! @0\!3{dg{eΧOpUqvW~¯[?1Ϣc=$8NU@0\ڦ[J_#, Iʟ fL2nn2ZSUaj3+%|@̛ ?G]ZG8u RJO'5CR]V!TWu43~.#t{SdZ=BT@X~¯O96%Z!&9>IO sWU7Z9))mG_V#wwgfZ)b揉gKCo0 ?hC@ QJ'.#aI@O ~<@0XJt~hQaqR{v OLUf揉.~ec0>^̏^G8=|/#dJ 2z#Dp=C`&Od7\tD20++3K_n==yA!D`0 ;1ϛ(a$ )w_\pǗY?C0UV,q5a{Tk%C-#t)GXpl4#ԭWggP+Zk{⌱V!`M/}c ̚ E\ХaUjwikkCG8|E? Z `6ndLpuӪmwo b4&%_,V@0G8h?aҜXUϡ A=\Hi=A}? F)$2E3J&ez)ls(LEEbTR?:ǧP#r` fYU~bK=M`k (hxu<۽̂=iV!qb`W#Pnt8u~|!0Z0}1Ѣc=}dRW_oz|x$N:V@0H.#{%Fg$3E ZRA}M&Lͬ`HJ)΄zY/'V@0&ak>mD3%itC`Җ{L/ϓ{wc=‚c?ơ̴ !BQpz@Xbz.!8ǑpCj:z /[ci ̦SAH=a||cKg)iu a- iw<T׍l}<U 8*=hfh5‰Ftsw%k@0ɺ.zA kt]'Q251<;۲Kk;N9̲ g~g!|>K)]gW5^Mi {<n|wWm$yſU% 3s̻2AV8kE2 vRW8%D K z2`(SahfGx`P$я@1Fknn@Q$#av[o9H{&y pXR[Fzv L&)sC@qE a4) @*IQh8 iᤘh=]pEzRMy.`looK27fdL Ue ЌF0dj5[T![n/H[[;憜s0LZ-WhC!e ozG_re,Ku-KVyct4,Kh4tO$>66Z_h^ߵ)k]v[G!{}"NRf:R9v{YׯБ @ʳ\y=/Bu׿fI1PmFXɕ>aTNP8^|OHß³?L FZI>k4nW=8 ?h~~^Xic;kJT8\_m :uZZ(J\1qxhtVVckC޽sO/_! ( ?Ct:xRXYctUݸySIC}xGq$8rJ=}LnBk_wi8c7Y&ޱQHX,J=yLAB'g&/KSI"ɇFxGOkkk=V/]" L { l 0XCqԽuwwww[wՒJ] /t'$lwzv)̇y=BI(,,,᥀-L"5cʎeatt c[RR οt/!eeY̨aaZD042 4eQJ5sn݇qSN*R.ÅAj88*zAHXOu; &td>/6mڊ@ """C""nWU^5յHDme8 Q[aAdF4I(l@]䢸5Y%\=DD DDDIUe~pāccM zʑmK 4a9:5(b@AbM ""1$""***y瞇J 3Mln-![*hYi " ].sQXTv0=DD ;DiI)uc: `ӦM:ѹ/"HCL3a ݨ>GB--+߿"""b0$"bM%ɱ&&0Tǣu%W+aGCooA:px@j߭E8+oDXuDD`HDDx\ZBnn7N% 3[lEuu vLCM:甡CC(-)Aii.:55Px9PQ-0EEQZZA1B-Kg\#""C""ZACr97$]zexsm۷kIDib|bqZCL&-Σm }N)6+nٺY PHCl&ȹDD`HDDY$՛T Rr'[pE)O}6nܘZl:|qdt }zZD'$wCEd&l/-Ů]{Qa<%0ZZBaLXלCMc%,dq()ɍm,9PNg}%{ S6nSdTTϩ^FV) .`с>*EJ6ۭѐ^ar2+WjuA *ϪWӌ¶ڒI47b*sa=>w9;f12Ŝ9+߀Faa> ==Xim>;w;0<8TM>c<ǒ Õ rTUwbbRj/LȾyaCr V# 2V[oԆ6 W\q ~/ G5܀>(y@q-yfq()uw.[qUFǍu(,*E"_ WV G!9 eeܢQH X$VR-MMVB$z{{q!q]ƛPW_N]aTJ: Tpɥv%n]BEIir,ϥ^~z{DDĊ!5Q|ɡN!OxXf,՝,TPPMThJ9! ¡$ِ {^m=G^s ǵHŭDOwh2.բ63Ա"KφjayEjkPQQ{sczw6D4:j;֦_NKٻDD`HDD'7+i$KQBc[TXMš ˌ]^rtVLBO`fk rT5(bz3mY C#B9O˄π u!rw0A0C 6/~SSחƋ^| ik[42 ([K^BO*8` V_~?a%d}aH@&4+_"m1H3u eJBi6|./r]\6\x}[KYMt~daC->+?qN Weep3:6&"'FOK|S^t(ܠ;aIi >wc)MO7\>׏0z\QUj۶oHs~& !Ud?@]F,vs=D |cl򜼶܂v84< ""C""r`G@sa,BnW44TΑs~WH\?c!::5"C:ڠbG#[%ἙcyN^s2}a{xbhxxk7*++Xk {NAt p-x;>_' DD`HDD۶m[v+pݷ&ucjjB! D'[6\w-WWmw,e˖-""C"":pUWa9P6'K7DfiD">ֆ3KKz;l 8oDh9h%4,VEW)Bhd68l-Yx7̦git:YXXbf7660*Jn lnn;"CvwwS*2^ﻌzpxLߎDR!{{{iZdPN|NOO< L>6ÿj_Y!+++9;;R& ,..f4\\\hd'ooGYk0Ve0\.%ఙ|e'?ׯ_ \ ~pplmm0σ?:77v>_Ut+0׹}rju1,6}ZI<`a@RI-?%@ C!a0@ C!I C!a0@<==]`]]]z~~r6 ~}ycpǿ-J%л  $P~C:p?0{fϰ94M뺼;8J)~c qu]iV>Niqض-9! BHQQ#p\X.( P4n22uV+b1d2O=:ZVq>6{1~3~v;vb%h4p 㫌T*f F|>SCc9)(>F?oD4_@ HIUJ(P Q@AH%PR* BB"l;3}??WtΝyܤ@C*--;466d' A# c+\S1{7s0==]YH ~*Db ҧ0Laa݉"Hޑ} \__LTPSSSS__ ,Boood/y 0 aas9BUUUdӨ_0F?L Ksc (51ɡ4!K'4+**a04 x~~,mȈD[lXN611]}sZ`&$&RKe?5V9ȀhvvVCCCZ533SqQO|ck69??1FSSSc|>1,d:;;#?Z642ח@7FÍӏqȹ@GQ_\? XNq%(((Ҕp~ٸ9R+lg_=\sf YYY0 g 0oꏏX*1hllH.4‡U Q+E/@%`D n=\9FD E~bD[$ <ҿHŸ.//sBc @??PZjbd-o7~ΡüLHȸ?==ɉI2 VTT^0prbW;/\9Q@H֐g!ffdNF:&o'%s3!uJ[6LOOQ^^.87+{l/+ .SHN?1@ /8!%Bur,OA,֦dZ:o "/{n%2G`[?lΕG:!'(MMM߄ŽEh*c-k.w |||5p̜FpP\1gy5^0"&"fSx H Fa04 ?==LDZCCyC(??wsZZXfr\vv6oEWWg34ܜHnoosNΨndӧ~„Iff0@TQRssX ;j8>Q DT"*rRTTJTP"IWyuZNrיsm>c ac.pٽNFS铃Dsn'l䱬04?lobWtr*!zY䈸Eq!Óe >}y~igϞ qm#Dcǎ8˺ܹsS¢(1,?|ҿ AΚ;wFnBX9GGq" Clm9BBU}N"ԩS66|A?D! CDW!dB(Ȅ!͍[vN }7QE BQT+' Ek f7|~B<ڵ8]9{ |[…3{q2zz0 C_~5.oPh&7#3A,f0%eysӸ{MOh zjg*GS!U 儣X5Bw ; .k(aQ"YJθelvm|>Q8DN:yRC8 BTAzj!W א'gL~|Gb},\>{.8r}O Ba$[f+B8ÿR$8D!.Y\}cYU4'b *ώW2HiUr (aXEjB5'勨(4\jnqzjGpʕ&,ٳm"lsW/.9p r*d2ff #?CD%V+U!|e1GɄ!'vkWḱTEQ°(b ""& <49LuDCөnf'ng>V D5Fh1Q@͸+(=R*|V #UHT售 HahlzRhɏ?6ZV(^5AZnrQE â( 07oUEX6AE<%{$I.q͈m"Ļ\^qCr>̹~x*M*ӧ6'+ M #4OT!(cK ᾂ1{mw i_sZQ(Nɓ''@ޑd\Ǣ(EQ+t |}\='i( '8!n͹ҙxOoZ7BZhv\"߿ zM{[(oRĉ3g4zM 'u h:DDɬ0AQ:#2D K๹uV.yg+ cIc=N a?W;(<#H\?*ܹx?~<-=&1T 8t  w_*EQӮ!z}eM+mM=.]޾}l+Ww†ŰQ<,K$! ~E.ʳg׮]k>khU`m!Ww]}-9 ̼:typ}T$לGtH.aOsLx," ͛֠Bka c,a>)B B99{su5*ȍu a_xъ(Iǰ(wرvbˁ" 2FNF^on66D͡ \xQ`AyTGRQ LjA0rϟ'Rpc`,30!ѣG[- S]%܄ !~q3oyX׵X,$|s2͔ -Mm]| sC>C!a0@ C!a0@ C!a0@ hլc׫G=i L&5Nk>r|a8Xv˅|ra={*qZ"n%eX{].QЂlll, Bj]]XZ Ia\wr0߿)tRl/B aWRaHB a;`CF~+)6kC!a0@ CjVO/{wHsqn$mn D{/00333ǰvWv:NIW{HGefB𦐔RRI!13y ̭$3YRU)k @0xF 8j= T16rP<"3EP׵&áRJ !ƂEYrTr*mCfsqPB鹦өn xp՚LgZ.ѳR^_h0,%m#+ =ǟx8XQۮu !JVYG3PwNNώ_ 31mξ|/?v圯b:OVL{`!,3I eZiX(Sg Z7Z.WfN&fxg^J`bjRέ6֯ub*dZ-f3m>z/ -a맿Y !07+BMӨmk)YBUUi4A)%0M!ăO׬Cgv)t{Z)%k>_ůx׿gާN_n7~(4Ág[,fE{a\,O~V5 }3_.CNCLm@0쁙=4 fr./~urKš{ SLmCსBc/Fݻw!+Eůe #v Bm=׃) @0ifR|;F5j7bLr\h<na L[4Z.W?C^BTR,ڶUU%u6޽t~@lR Igkc?y^g3WJIk'ƤNuL&=|΀h5M#3K A;UUR)ٯ /<_|>:zwEOUWbz'2P\,5OOΡ3#tMg&V#  73 ox tfW ;`8RI⿭@0 P۶9o{RJ:997n?osUW:==UsBJ9B C`RL!"/Ƿ {۠xhuV\(\Ck&7`nDc+#{w}9Ud[G`hwHK]lF]Ȉl.'-h:׳z# &Mh4~Щu8`?OS8ɯ.}pWGuԞJ bfzW X |=~oYWQ:N c? '#'om/OmۋC TUnGX~bb*8q0!G]А3p9T#, IoáC@]7 aI@̘ fN2Szy,1[]?1OdD?I)bh!,hg=œޘ!vXwߓ#h cJX#|=0O{#ti#=Bjp@0ip4w/4;gB3#,[?OOS m)_\# <@0'LipwJU`ʧ=B@X~"c*8y @0`]Zap3 VOLB{~l ṕ#k36:Ggz!]ZG{GxC@% %z.҂ pz.M[?᧢㳇䭳! ~^G{SsQptt `D^ؚGD:.jq!4| ~O {~ΙfL'&UW1z.mG?GX|`!!=B?|_#/w) g[!`%pzG8>OOL9OF?}CX}uI0phХHХamЯIL @0''Z?_?1/G4$===?>Qww +UUa>=t<<ef_=<<@0,@o>9݇!uĭB8`(N|E:Ɨ j 4 iC ~QOOOU4_n3}eAGnptы 1w3~Qs=${5OW]tJX#|50tQz1or9>]K۪cTUתZ1OL!\&]|>}pЇ/jE)m]* Q*xm Hϭbp4+ 4'=IzG?zo1FMp{|Sa?1zS*R x~~]* Emoba*\|"lO ]-]6Z# A o:,#,^?\?1S[[gLz0 `w< 6Z#tirb8Ϡ C_QGYCbA Č`$G8]G8}k[UU7$f][nD ,_? {~I+N^U-ÿ5{@#wDAХᏄ|mCLa=B=].$CYȜ_ S7#'5A >)<=B %G8~_-~"3(1ivZJJ2wpya0_^dT SJ7)'z''{!GX=Q!ha{dr)oGRypU'w9}rlf]`(g $NiNUc! k))mGV#DߵJ) V* M&Z~b)'{.O ?%Dwp#R1D)eXG/ z%/ T# ߱Qaj +L&:{~}: V&XRZG8s;%Du(62z#tIi=BzR#=LJ [1s*8y`{VV6fzGgK)iz V,|r'~Lp ! rOO?|<@Bd!]Ai{?cO Z!`%lK=F3a QUoߩBk C5uL6}aT0eKE=ªۯ͂B5- ] @0xb=OԻFM0(ڿB|z$%\,C G8`?aҔXU/]A'&{YҠ!%vg /4 gLEz~I;Msx IRhR ZNQ%TI |B0i}?lʹ~GRv0{n{yduUw:}a\J [l3=B'3X0͍߫AI]ש=,?ݮ`xgiy]=n/*uw{1p`XХL&Z~hAptBL\飞 A!`5O$M + )BF]L/W> K@(R(!d1FP[F;Į&L GJԅpblTib䁿#PTT"06zB>TQ8sAE8U"h4ǡj!繬(0c]gQsRKj6%,SV% 0u:zW*‡"ߜs~b&Ցudm`8 %i0 5::+֪!3>aii0jZ7-16:W/_jeu]ij01Xk=?p=nTaa@]`m}MEQnJ%UVW0Pb8jccSꈒ$7hvfV~_*]-.-(ru%&?1V+]t]?-LTFC 0'dU W胉tC@VN^4>!o 1{,g9IN 3Kٳp01%iZ+ `zvFyhjz0 "a(Y\\ܞ2; .i=5Lgá^MRQ8MNM6RS)xc0@ՑV5眞>~`JZ% (0ګi-i7! l >kD`Vz59MNNɓ#sNF/TJX7n0d[j42xBO$ߊH%gmnZZ79}gZ[[F׮xF*m-ѹ9ENg\ׯб m :IR񀇏> ժ~ӟJ1bTaT煆pt|RO>!~`b0JrT*Eq"M3z(/v-51FrNiEq GzC645uZZ sT!qxdL20{._ _/^'}bzzZ/^1V]rU7n? ǡsΟ E!J<}L3>5:޽'٧~&XNp0 +$9,דgϴ⃰3B'$q0$95ooTn z66߾)xQ`b1$5V$㯖_3-̴d ]|sY01J*c 43;#GVn{C(Ho>[8De~֗5H?ЩS( h4wo,/;lnljfvV`=5~ĉQ'af寗JΟ(@ZXX₶kDwttLժ80'Z]9yOuv5^ZXSgtu>cxD*}󍊢q8fҒN+IdYum',4ѹsUaQ%qz3f'ʄ%5M:0wWN^ӓt_vgߔ@`TI+zNy7ohk)ow9~J2|(FQSj4*o hںwNNLl/?ɯT`1nlⲺMIGallltP!AG}^^O_~u9ńpsu_^To|aθ* 10,A-?m ep" F]y.6xB\KӯOe("BdfW{s᲋>{m{s.47"C ;rTUU}1,=/3F$2XV:mRnnl,l""`(""d͹o jb9餓QWW֖tt3d'叹ULh(B82`~Ѕ͛Ak!23H8@L˕D"()-EIq1DDDs EDd  ۮ'?)x_SN='Yhrj ]= 2xS)Σ]]Q,\OEUu͚p8 BK"gc|mVDD EDd f9=Y.kJqq1'E/~ 2CK'008q]O1vuc":d=[+*pgx^k-i$a%d1sΡK1L䁈h(0<)dsNklhċ_BTWW`Q|~ ""C9p ̧.:ԩuK|H&/${wgE_Xt EN84;Jbk k4z9d2K.3>Yd ɰup=;WhFa~f+eb8xuwMR<>""`(""+s{3>b@ĘAL7AdH'~7o 5ˌţ'V*ܜ16e C3șCDD ED$(f|_9| ?v{uxc_ZZwmp 0`Aq) N!idi:B^Lv6rg\ |k J6 TVTqc$~-׾P(>x}7`a~8W~@DD ED$"0o#A68a P{?/BknГt> ˷0 Kq12GKҜ׏eWְom~^;DDDUH^1owep߁\8Cm뇁k{^gc|n(ADD ED$7p!e eYl_\?xt8Cɓ&{~U9oyۈD"xdێhWwހ_>O)O}7,K333rОmCHutά81~?Qn?<<3amCYg_ xfn |qװ'"kV&In9UW]s EDDPDD31مd2 o5ڇ, = E9,̬D1UX8wkW6{(..l۶jjZGkp}v8ϹMf!y??|5x6zpuICXnz֘ +W ̪(lV@A)2غl(PȟPB)(B;V;.χy}xQ^oˑ7J9*//Iݧngbrv0F9@|d\@duu5z=0`kk<"` @9W?&0lfcc#CWL䟭?ƎCvvvQ 7!j9>>V&&+^[Q.f4paΦezz:v\ BNNNj2 ɓOi} |NOOlR˯ȏ?G@yʿT߫wPk|Y;6_?To0n79;;Ennnr{{~p\o:YMyl>l5Q`a@^O)00@ C0@ C!a0@ hC!a0˲xD*F:juE]^^f?nv@!R H@ !"N@Dt]  );300qXB$CyiuY EQ|u UUmqGev}aq r{Six}1(4aY @E Hh1$q'$a/䝮e40 u]Y&x)mUURu]ض 8y,c8{(16f&zD$@I@DDHw(@A%HE A#.g{>O Ft80LnDZX,""PDװI/Cx<f38.֍-E45>:B6~8~|soXt:h^c#ɠ\.gn}}d,\.*"%jNCcL&ab8RJ02478T*1x22 hxHkV`0v""=L+""t:!b4qԕ&cnl6P&=c* :(SKaNau]!^HDDPD?" G@*H " JE@%*QJEQTQ"Q"%(@XX z\۲ܙ%VVV8,u"IeC" \NNOOejjJwV9l6k%E'''{Iie.<==Q 5à\^pviooOS8YIW\k|^'HUOSESU]rxxXhvvV;gi߻@!syy)oooeŅp=wЗcqh BtZ yd=pDx>-c\X/(^0{DW1!Ig+ *++d2=ĻgwҌy1ܺkppPdhhHfffd_RThmŠkun]*T#%V9g =<<|±y@#TGEHRh8QL8򴛛CBp D^p TBH AVWWLVRCxFeبDE@֜M<U% D H___8(j$⽿ M;H뛹ДE>H86Lc&FKKĉZbP)BZ(bKX26Hm鴶/innD2OIGy}}eSG=liÆYIc1y'v6"r6 (☲ 8;;k===a¡ -N7gdbbB677qbTD=r򹰰oFC\)DcgAuu~8SDp&ągOP-%rI@jrcddFm5DT$ pؠLʙA"(85uؠ3|Q0@X8ewb0Iܨ "]@4 ;_9bJQeMtvvbGX3.}:H$8x r!0uZ޽{N;w7o߾-u>|PYi%?~(lʞRg];v Wq8ydxҥRšCqa:~}I{#ȝG޽{kH$l9Oeߙ\ס&MB p ZA|jbY4弡ԳW @ZA˗/ TBp((AXÛ Ha&%'dnXX(_D̫vҺ!sm sΕ)!Nu)쬉@egMcxNW!@Þ@_z%!xm`}*:1}|Z7 2@]k D^wޕH$XbH$r=%ȒYH #{PٳCՁP|FEѣHIWЃ`n@3eOLOSԗD !!ׯ_SC]}ݭW 7ɳ )s  0PՀ{HGXt%X% 'Vef5ú,aT]D"!5Uǹ $K-c1f& +<1\Kpp (Ԋ߿SNe7iij&A˗7ZW@xԔetםzDF~MG 59u!U?Wx /$\MuVgN5|AX5NqrxD`W&` jP#pTؗe5d5cAThgϒ;?۷RbUM 01t6?Q屢#K(b^v]xHCub赥1B)|MJ:(SxSzu3lLmjͳd"*!q?Dcw%$Db`(9rDC u2}&U1.]wR4i* lC!0!l3rv 3jbG2H1 a#]4Zb+W'T|]P zi@:W|ʕ:3BCKPSs){׌HdDvCJ$Nf&`V?t)0%pS1dspCT E @yѠFTAAԨ$eYsHs:7`WXԇ"6`ZX=`ʞN%|)nڧ$F#|1vDv9J$ ]gTW {-,~ˀ1m` PF\L4M>(TuG!M@[p_X]ps-s+u0/m|dOD1ۏ4Fsaݩ\K`{4Ɛ`CU؍نNku=CHӱMrJd̙HbH$fItFF#TRuĈ Aݐ==AR]uL7٥4񹬆HI0bR~X* lnX8'kz\ߋ/`cCf+zۻeP) rvPi`6GMQcΜYclQWu& OBwomJ}x4R;]KM=zzGm=I*H"P%.eW{۲} ֡.{665_p,:kD&? ?@rLsh6"OUWtdѽ_ݍZԩSHk uudt&u1Vc 6ȟ ptTa_ϟ?P O|@4$ͼAJ$5JjϨbiK-9~h)ψuFZ,yQkHh"Yʭ[VZo߾]._\ār сY7o,;B_"{[{:$,Drjw%4bȇ("__ʍ j I4Aw/^5@"|y6+kVիW82fi!c% (PX-%.F1fb\W%4K7oބ4>ڋQUX^jhS v#O>-׮]sYbk  sk"F[Þm=,U"3XCFP ."fʸgkMx?DA&JL9w;mh8+w;|}tV.IO'W! L cHu6N6ĮN`X^ #] GpZ<ݕOywdX[򷕉_]ilWZDchA0h/'O~"jeY~wWc/+>16!11y+Y Z`de!/.d 7`t !/"K~Ǫ _)hCH^zxQ !83y(yK3J*ے)b}Ȧ=gغ%ٕO1Azps/fd`!dYիW>1Lf̤ K'fjŐX c.HT4cSP6tM1B-`PIf(R4[mP͚\(c)S1Hsč>~eBacpgC)rG"kl-"u idL#P !iAbO2$fԠuKFZNTUw2k˞EbN CT{=3},'(},AifY(aLd8;;}@fH_ ]{̟)(.9sZ8o̘\r𙊘ʹ=.e1<::hqbLϲ: 0?Ljv&xjݡf Q/u.4(I/jc]'V2&K٠2 )+Z:EO 5jf\G;c5!$JWPxmGFϹBi 5+ %dҤW$rYW%NckĦi6re9W3]Q4!W&MN-ኤzcp;t%P3/3c)w&_4=;sE>CHV۳Ao޼9NWfB͆>/>9ʝVf)!$1k5;xjmzfNQ "iIq󬡱<.+=W+f>~G=a\b(['/+.bwԓp8sz4iYJȏ*==(2&O:k'6o苋}xO^4A0O̎鳅vvvQ {pqwvQ!F0˗|VU՟YN3f;x>ʠ1g C3{HA!,3<_;V| +f?]_,gggN&O^~,w"ReYjEEUa,S<)d6E3 c%Qw,ܙs尌AP$.e EQTnwX pD$rH8IxaTzl8?<@J\ac{݋9_OMlףu*6f' Bl_=%Ƶkz=Z:zaEŐIu_iԣa$C}Xw*e!i\E6V߽L5@ ץgZa _."u.y:ya+b0z~+Ѓ(Vs 5Uar=r$h$ո`ۉcT*ͫXwp9pHr(u.UėT 3 qu2aknE 1 UCsaO3  Q({o=G-5̥ b_-m+VczY:9,?YB9@ =厓 nXvrQp%CX *j&f3O~ <Յ_Tj|.t[mЯةҖm}&|o ufa C\M.-[C'1yP0B9KcZ,(m3 ¨˺}'`M50Ҁ:V"~)[ 1x¯(k!`1 Kjp'}Iyy7>cZ76OX׳nya[DR.í!H柿<0ˋaf +Qp ލ(O] M^!!}x lB4Λ8\BkYChn)-0SH/SJZJWE-Cg0<|5\t5ߛs AX a"$?Yk޿|M?lDכߟOV"~Nk0.B׸>X6=s<&D \Bah5̮n5,_sfb `vWY~+0n>ZX@q^YwA]yAwERa8̯S<<&}[Q8XBaj.9ɿ/b5rx?>s0Vq_!$1BS?SDJHby)?7wXDcb~9Ļ, L`] Pma \\f3(+8*)_GZh19VΝk1+ch!kםxo".>^Ln$?f+ bh5EV5cpJW[J{  P Ò8?cP8,7A( P &";814'`_N 8{p(@F Z_ p,9hBc_F"b02Q( ay1 Bcqn:;O8LN%xi(9̇epbX3'#nBqck <6&j@ aAhB1VĠƘc̈koAc.c{@тvO=̷KS`;(r1@#X _B15A(B. ZX3"kP\`@ 'B!@ "A!@>@"/D x @CrxO9@T R%!l-IENDB`startup-disk-0.1.5/res/style.css000066400000000000000000000005701475323115200166170ustar00rootroot00000000000000.candidate_gridview { padding-bottom: 12px; background-color: @theme_bg_color; } .candidate_gridview child { margin: 12px 6px 0 6px; background-color: alpha(@view_fg_color, 0.1); } .candidate_gridview child:hover { background-color: alpha(@view_fg_color, 0.15); } .candidate_gridview child:selected { background-color: alpha(@view_fg_color, 0.3); } startup-disk-0.1.5/res/window.ui000066400000000000000000000122561475323115200166170ustar00rootroot00000000000000
About app.about
startup-disk-0.1.5/src/000077500000000000000000000000001475323115200147415ustar00rootroot00000000000000startup-disk-0.1.5/src/application.rs000066400000000000000000000053031475323115200176130ustar00rootroot00000000000000// SPDX-License-Identifier: MIT mod imp { use adw::glib; use adw::prelude::*; use adw::subclass::prelude::*; use adw::Application; use crate::startup_disk::startup_disk_library; use crate::window::StartupDiskWindow; #[derive(Default)] pub struct StartupDiskApplication; #[glib::object_subclass] impl ObjectSubclass for StartupDiskApplication { const NAME: &'static str = "StartupDiskApplication"; type Type = super::StartupDiskApplication; type ParentType = Application; } impl ObjectImpl for StartupDiskApplication { fn constructed(&self) { self.parent_constructed(); self.obj().setup_actions(); } } impl ApplicationImpl for StartupDiskApplication { fn activate(&self) { let app = self.obj(); let startup_disk_library = startup_disk_library(); let window = if let Some(window) = app.active_window() { window } else { let window = StartupDiskWindow::new(&*app, startup_disk_library.is_supported()); window.upcast() }; window.present(); } } impl GtkApplicationImpl for StartupDiskApplication {} impl AdwApplicationImpl for StartupDiskApplication {} } use adw::gio::{self, ActionEntry, ActionGroup, ActionMap}; use adw::glib; use adw::gtk; use adw::prelude::*; use adw::{AboutDialog, Application}; use crate::config; glib::wrapper! { pub struct StartupDiskApplication(ObjectSubclass) @extends Application, gtk::Application, gio::Application, @implements ActionGroup, ActionMap; } impl StartupDiskApplication { pub fn new() -> Self { glib::Object::builder() .property("application-id", config::APP_ID) .property("resource-base-path", config::RESOURCE_BASE) .build() } fn setup_actions(&self) { // About window action let about_action = ActionEntry::builder("about") .activate(move |app: &Self, _, _| app.show_about()) .build(); self.add_action_entries([about_action]); // Keyboard shortcuts self.set_accels_for_action("app.quit", &["q"]); self.set_accels_for_action("window.close", &["w"]); } fn show_about(&self) { let about_dialog = AboutDialog::from_appdata( &format!("{}/{}.metainfo.xml", config::RESOURCE_BASE, config::APP_ID), Some(config::APP_VERSION), ); about_dialog.present(self.active_window().as_ref()); } } impl Default for StartupDiskApplication { fn default() -> Self { Self::new() } } startup-disk-0.1.5/src/boot_candidate/000077500000000000000000000000001475323115200177005ustar00rootroot00000000000000startup-disk-0.1.5/src/boot_candidate/mod.rs000066400000000000000000000044011475323115200210240ustar00rootroot00000000000000// SPDX-License-Identifier: MIT pub mod object; mod imp { use adw::glib::{self, subclass::InitializingObject, Binding}; use adw::gtk::{self, CompositeTemplate, Label}; use adw::subclass::prelude::*; use std::cell::RefCell; #[derive(Default, CompositeTemplate)] #[template(resource = "/org/startup-disk/StartupDisk/boot_candidate.ui")] pub struct BootCandidateWidget { #[template_child] pub name: TemplateChild