From bdd2e5def9915f0b1366773f733a59ae4dd0bb16 Mon Sep 17 00:00:00 2001 From: 4o1x5 <4o1x5@4o1x5.dev> Date: Tue, 21 May 2024 19:51:46 +0200 Subject: [PATCH] initial --- .assets/romodoro.gif | Bin 0 -> 22646 bytes .gitignore | 1 + Cargo.lock | 2029 +++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 22 + README.md | 36 + flake.lock | 26 + flake.nix | 77 ++ src/app.rs | 175 ++++ src/assets/melody.mp3 | Bin 0 -> 153595 bytes src/event.rs | 88 ++ src/handler.rs | 14 + src/lib.rs | 14 + src/main.rs | 53 ++ src/tests/mod.rs | 162 ++++ src/tui.rs | 76 ++ src/ui.rs | 57 ++ 16 files changed, 2830 insertions(+) create mode 100644 .assets/romodoro.gif create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 src/app.rs create mode 100644 src/assets/melody.mp3 create mode 100644 src/event.rs create mode 100644 src/handler.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/tests/mod.rs create mode 100644 src/tui.rs create mode 100644 src/ui.rs diff --git a/.assets/romodoro.gif b/.assets/romodoro.gif new file mode 100644 index 0000000000000000000000000000000000000000..b67fd8397365de59344dcc3717574736764b22e3 GIT binary patch literal 22646 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
vE!Fw0tllM=?N!F)DV5yLFZ!R-{L^yX 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 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..48bd146 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2029 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "alsa" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" +dependencies = [ + "alsa-sys", + "bitflags 2.5.0", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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 = "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 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.5.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.57", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.4", +] + +[[package]] +name = "clang-sys" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[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 0.11.1", +] + +[[package]] +name = "clap_derive" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compact_str" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "static_assertions", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows", +] + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.5.0", + "crossterm_winapi", + "futures-core", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.57", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "derive_builder" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +dependencies = [ + "derive_builder_core", + "syn 2.0.57", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "envy" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f47e0157f2cb54f5ae1bd371b30a2ae4311e1c028f575cd4e81de7353215965" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "font8x8" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875488b8711a968268c7cf5d139578713097ca4635a76044e8fe8eedf831d07e" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[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.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.4", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[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.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.5.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[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.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[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 = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[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 = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ratatui" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcb12f8fbf6c62614b0d56eb352af54f6a22410c3b079eb53ee93c7b97dd31d8" +dependencies = [ + "bitflags 2.5.0", + "cassowary", + "compact_str", + "crossterm", + "indoc", + "itertools", + "lru", + "paste", + "stability", + "strum", + "unicode-segmentation", + "unicode-width", +] + +[[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_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rodio" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", +] + +[[package]] +name = "romodoro" +version = "0.1.1" +dependencies = [ + "chrono", + "clap", + "crossterm", + "dirs", + "envy", + "futures", + "ratatui", + "rodio", + "serde", + "soloud", + "tokio", + "tui-big-text", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[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 = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[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 = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soloud" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40cbdc64b205d53f861657923d4f94bd56ffa81e11b8ad920ac79447ececb47" +dependencies = [ + "bitflags 2.5.0", + "paste", + "soloud-sys", +] + +[[package]] +name = "soloud-sys" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ffc83bc0ae8897f7a13e975bde2126d7a9a9aa82d73d129ac8e60461f7b41" +dependencies = [ + "cmake", +] + +[[package]] +name = "stability" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd1b177894da2a2d9120208c3386066af06a488255caabc5de8ddca22dbc3ce" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.57", +] + +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +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.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[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 = "tui-big-text" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "800784c2ec32293c259c42bfb7352061dcfc672ae8f317e4d08e5292c49c19bb" +dependencies = [ + "derive_builder", + "font8x8", + "itertools", + "ratatui", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[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 = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.57", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[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.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-result" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd19df78e5168dfb0aedc343d1d1b8d422ab2db6756d2dc3fef75035402a3f64" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[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.4", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.57", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7d5ac96 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "romodoro" +version = "0.1.1" +authors = ["nezsha"] +license = "MIT" +edition = "2021" + +[dependencies] +chrono = "0.4.37" +clap = { version = "4.5.4", features = ["derive"] } +crossterm = { version = "0.27.0", features = ["event-stream"] } +envy = "0.4.2" +futures = "0.3.30" +ratatui = "0.26.0" +rodio = "0.17.3" +serde = { version = "1.0.197", features = ["derive"] } +soloud = "1.0.5" +tokio = { version = "1.35.1", features = ["full"] } +tui-big-text = "0.4.2" + +[build-dependencies] +dirs = "^5.0" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..61c24a8 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Romodoro + +A faulty pomodoro program + +![Romodoro](.assets/romodoro.gif) + +**Romodoro is a basic TUI application that keeps track of your time with the help of the pomodoro technique.** It follows the original technique by deviding workloads into a set of 4x4 Work and Pause cycles which are then finished off with a long break. + +# Usage + +``` +Usage: romodoro [OPTIONS] + +Options: + -w, --work Working length in minutes [default: 25] + -p, --pause The length of a pause [default: 5] + -l, --long-pause The length of a long pause (after 4 cycles) [default: 20] + -h, --help Print help + -V, --version Print version + +``` + +## Features + +- [x] Adjustable cycle times +- [ ] Styling +- [ ] Custom sounds (via .config) +- [x] Nix flake + +# Develop + +Enter nix shell + +```bash +nix develop +``` diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d0ea0f7 --- /dev/null +++ b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1716137900, + "narHash": "sha256-sowPU+tLQv8GlqtVtsXioTKeaQvlMz/pefcdwg8MvfM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6c0b7a92c30122196a761b440ac0d46d3d9954f1", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..89b41af --- /dev/null +++ b/flake.nix @@ -0,0 +1,77 @@ +{ + description = "romodoro builder"; + + inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; + + outputs = { self, nixpkgs }: + let + supportedSystems = + [ + "x86_64-linux" + "x86_64-darwin" + "aarch64-linux" + "aarch64-darwin" + ]; + + forAllSystems = nixpkgs.lib.genAttrs supportedSystems; + + nixpkgsFor = forAllSystems (system: import nixpkgs { + inherit system; + }); + + in + { + + packages = forAllSystems (system: + let + pkgs = nixpkgsFor.${system}; + in + { + default = pkgs.rustPlatform.buildRustPackage { + pname = "romodoro"; + version = "0.1.0"; + src = ./.; + + nativeBuildInputs = [ + pkgs.pkg-config + pkgs.alsa-oss + pkgs.alsa-lib.dev + pkgs.alsa-utils + pkgs.git + pkgs.cmake + ]; + buildInputs = [ + pkgs.alsa-oss + pkgs.alsa-lib.dev + pkgs.alsa-utils + pkgs.git + pkgs.pkg-config + pkgs.git + pkgs.cmake + ]; + cargoLock.lockFile = ./Cargo.lock; + }; + }); + + devShells.default = + with nixpkgs; mkShell + { + LIBCLANG_PATH = "${pkgs.llvmPackages_17.libclang.lib}/lib"; + RUST_BACKTRACE = 1; + RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; + + packages = with pkgs; [ + rustc + cargo + rustfmt + rust-analyzer + clippy + rustup + pkg-config + openssl + ]; + }; + }; +} + + diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..dc9c7eb --- /dev/null +++ b/src/app.rs @@ -0,0 +1,175 @@ +use std::{ + error, + fs::File, + io::BufReader, + thread::{self}, +}; + +use chrono::{DateTime, Duration, Local}; +use rodio::{Decoder, OutputStream, Source}; + +pub type AppResult = std::result::Result>; + +#[derive(Debug, Clone, PartialEq)] +pub enum Session { + Work, + Pause, + LongPause, +} + +#[derive(Debug, Clone)] +pub struct App { + pub running: bool, + + pub start: DateTime, + pub session_length: chrono::Duration, + pub pause_length: chrono::Duration, + pub long_pause_length: chrono::Duration, + + pub current_session: Session, + pub sessions: Vec, +} + +impl App { + pub fn new(sl: i8, pl: i8, lpl: i8) -> Self { + Self { + running: true, + start: Local::now(), + session_length: Duration::minutes(sl as i64), + pause_length: Duration::minutes(pl as i64), + long_pause_length: Duration::minutes(lpl as i64), + current_session: Session::Work, + sessions: vec![], + } + } + pub fn tick(&mut self) { + // Notification logic... + // TODO add ticking sound for the 5 second cooldown + if self.current_time_left() <= 0 { + thread::spawn(|| { + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + // TODO add this to the app object instead of opening it every interval (ram) + let file = match File::open("./src/assets/melody.mp3") { + Ok(file) => file, + Err(_) => File::open("~/.config/romodoro/assets/melody.mp3").unwrap(), + }; + + let file = BufReader::new(file); + let source = Decoder::new(file).unwrap(); + stream_handle.play_raw(source.convert_samples()); + + // FIXME increase the sleep based on the length of the sound + std::thread::sleep(std::time::Duration::from_secs(5)); + }); + + match self.current_session { + Session::Pause => { + self.current_session = Session::Work; + self.start = Local::now(); + self.sessions.push(Session::Pause) + } + Session::Work => { + self.start = Local::now(); + self.sessions.push(Session::Work); + + let works = self + .sessions + .iter() + .filter(|s| s == &&Session::Work) + .collect::>() + .len(); + if works % 4 == 0 { + self.current_session = Session::LongPause; + } else { + self.current_session = Session::Pause; + } + } + Session::LongPause => { + if self.current_time_left() <= 0 { + self.current_session = Session::Work; + self.start = Local::now(); + self.sessions.push(Session::LongPause) + } + } + } + } + } + + pub fn quit(&mut self) { + self.running = false; + } + + pub fn current_time_left(&mut self) -> i64 { + match self.current_session { + Session::Pause => { + return (self.pause_length - Duration::seconds(self.current_time_spent())) + .num_seconds() + } + Session::LongPause => { + return (self.long_pause_length - Duration::seconds(self.current_time_spent())) + .num_seconds() + } + Session::Work => { + return (self.session_length - Duration::seconds(self.current_time_spent())) + .num_seconds() + } + } + } + + pub fn current_time_spent(&mut self) -> i64 { + (Local::now() - self.start).num_seconds() + } + pub fn status(&mut self) -> Session { + self.current_session.clone() + } + + pub fn get_paused_total(&mut self) -> usize { + let clone = self.clone(); + let clone2 = self.clone(); + + let short_pauses = clone + .sessions + .iter() + .filter(|t| t == &&Session::Pause) + .collect::>(); + + let long_pauses = clone2 + .sessions + .iter() + .filter(|t| t == &&Session::LongPause) + .collect::>(); + + let mut saved = short_pauses.len() * self.pause_length.num_seconds() as usize + + long_pauses.len() * self.long_pause_length.num_seconds() as usize; + + if self.current_session == Session::Pause || self.current_session == Session::LongPause { + saved += self.current_time_spent() as usize + } + return saved; + } + + pub fn time_worked_in_seconds(&mut self) -> usize { + let sessions = self + .sessions + .iter() + .filter(|t| t == &&Session::Work) + .collect::>(); + + (sessions.len() * self.session_length.num_minutes() as usize * 60) as usize + + (self.current_time_spent()) as usize + } + pub fn history(&mut self) -> Vec { + let stuff = self + .clone() + .sessions + .iter() + .map(|a| match a { + &Session::Work => return "Work".to_string(), + &Session::Pause => return "Pause".to_string(), + &Session::LongPause => return "Long pause".to_string(), + }) + .collect::>(); + + return stuff; + } +} diff --git a/src/assets/melody.mp3 b/src/assets/melody.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6a5d52eb5f60b48325ab88249ff05e4c704edbfd GIT binary patch literal 153595 zcmeFZXH-l%9zMh^ESb&3< zhMcAn;{#!9CvPuCUpr4PCwDhSAwF?&J`qL^M{jQr34VT8t0#7RUiN%$cHW%&s``Rp zF9866pl=lbE5H-*2He3vH-Hgv0P9ZxJFvtHUOs>a_=_j_o9#cp>FX$g-2n1`x@rMV z;4OM!M<1}OEub%_ArCf!^8?4#*HF>|D_GzqBm#%a>8L6I0Cz4}b$VjuV8`#_<^YzX zb+jH5;?d!OMM6~-MO^@Zf<-8R0|UQ~pG{tZUl1?dhw?zh@ZCQE_&8NXIsIoAI}1Cr zW)IzXbtHf&TRS_fm8!dMC{Z_~Dayi8wxLfbN_4hvvyMJAQ;mwXh##Hb4usy!x1-Of z(eVHTiitzgsJ3j0i7LI^`2@KiYj_<5&{*}SLgSwiF#(}}hyIr!fBEkJ zs~i&2m5e@-MX!F0zvy#sZ$EC0!VTg=D$7zHpDjS42tVvhbUUc?y5fz1@qoL=Grg1^$rNe#6IbeBS!OmQ&1ocZzYMAoT~94euFBt7Rn`*L1nOK3pV`PeR4X>J2OQ0bM-n2MJqyqc}qnCXeekPyF71V zR?zw$t}ON3w#p4I(ZrJ+jDYY@ZHa(>Yf6Aka}C}8iZ*NBR5VZ<0X!QSvJ7TNHqk{d zU=9A>y?1zFh>ru5_C#enG!Z@7&UHy2lN<6*eu)A|tn_WiJx?q#1~VOmBx)+%PClc6 z{m)tL*Luh~aNza0dfKcRJ<&^WDd#`-FY!{gPVQGpqi7dCE6E@uP{1fkW=Cbf=kddh zg}&I~t>Qbue2hSl+p}P-fs;$p@AMt9ZcEGzRdNWx5s~AYza~+hceHDxym2xaCqqpF z$cVOn4qpqn!Eq%rH%PZ`{a#)J2667S&3}2kcG};q>b&E{=#^Gg98x$ zo_JkrR_Nos7(Dp9HM@Ci0}Acfh@3I1GOJ_=+kp)JKIJ`x+yQwGcI@= z*1F8|38s)O6+Q;Q~&OjbG+qquLfu^`Dad^+?9FlGNmZT-&1a3dhCqAtf%?X=Di`m5T>2qCx0fl zw{QL|T;I@vN+j;+w;s<--Oj>n;7scHu>GFaNX7KtV&76Z$jj63;w8sC&1c3J%Kd^l zcXm&QF?XDAhRv@v<3TxDmD$uE@X?gie!6(j;~lfWom885#GSKLa|3cxDDi7FW{OKN zzP8Zf&YE||k`Q^_y91$|S)o8sMFpO$e$}>Vnr_%pT+Oo3VZW5lD9H+92sT7tWP@Cs z9W1`7XHrqOBQfPyNIh8`*`86B739(mDKP>&8+@Xksx#Zl2yWit<1e1L7b>QyrrMmgbQq_tD{!-PH&>^RWKg-F!LsOV2m&fLQj|N2CC5LLS>_mo+ zw!ZkhTQ9We0Vmnvd=R!_QgKnBCA1S_qIpCC94GlLW2RERQz)b z^hk@QCHl*)wJ5m14X^K>`(vVlCerLR{q3a<-Z3!(gTHOIczI@|WGBivN6HGFg+Lua z8|>QlVl89CAwy&>{Y3vsBxrc@;>#PV%#N-#Y6_%kvP*_Q^<;lseL|JulAYr;{nlYx zuZ|X6O{`4)VwdO8k-T)-Tfko!tM1lna-+b)3CEnBT)<-+46dIdm5G4_A4CB6a#3 zZ(?r*w5B>}?_v#HtQ?7;(eO{QJG+Dvt}Y-SCr!!hXrB3rI8`^N0Q(=#3%f6CR<-DV zawSolk_Wf8FlglMTz3g=r572FCGGA#>9VsUge+t2#Dv}4o|9ugdoh6jBt~j(0lOga z!EGMSNZAJal;QD*tE;Q%k^Xi{AbZq8plT^3b|TWRZiJlo>O66m9)8pK0$mA!_exF~ zp5c_g{zHrP;i6vpBU}! z?w#Ckm_j!J`*G(L3N3*+-xqeW_zliJATPCMLT*JtVQw#}Z}BAsspcm&aa|(Sv!xD-K0ZOHf-{~kQa*ig|?GVN7F$;3wLlg>+oaf+J^=F@ITxO z0oObueag}7TAsVNui0B=%b9>6@x4%{*7@b^@bhn%8lWlj?3Jiasr&iKWu0PKee_mKRnyZki-~+BVLZuAn z_M@|4XOsNxK$UNmq{DRV^y#JT(r{DRPXFqr5jH9*>eR)>kM;*>3ywwp)Z1M?^KU!E z95Jf32t4(k-`%@(nVT)dLX~YCI!hAl{lP~7#zOU3HO|Ug0aBgyUJte;jv5c^Ajq!K z-NQ;ikEi{n*_$7;AU<`5TYEo9Y3stFu+cYkDTjJQh7+)rPBogh@+jm1y&&HpNr$P} z>0{p*mkrlx@AakKhIV&GYXW7q* z=UnVc89f4?4LfZWHe>tEF_Qq!y=`7vLyn&dCp08CgqE^4xbT1x@h3O>XUkfqn4rmO z^cyaw9Xj*QaM}o3Z#gnkf-H*{mgj8J|8RPR0E%eOhQ&qlF0uuO-c?j^0A*DC5+j~N zUA_S!ZP9BPJM5r^pdAYI)u#X?Ch>>2gRDTy6)E_SuEzuXM_$K35m5o1=}-h!-Nc0F z(CHh8#U!V=Kbs&aoDV)6Nmv?(n6JI-|3~X{0>7js!TH_W#B#s`OeVFo2Sn!8v;DOT zL<&klYg^j$YIrNi>cS`4o$Eiw2}n5GF5&>Zi>Na}(m#@v=ACin_g|MzpH8c&;QD8_ zl}9huW(+AAr&K79Isag3``$tyxXmukN`{oOiDonmQp zQSk2~{@sax+38=I_*Xmqt78AP6aQN5f8CD%Ip1jp3l;rpd21O5n61<>QaQk=qSJCXX6SJBQR31 zbk*wcPzjQ&ARSZykieeYR_gQ21j%9n1tU1#d*co=Hixtj#^PE1(m+SvnV{AG1P<6E zCwHYY_C{C1VQunua(>gB4T#7x{|^o!y^J1!6LDDy9Oe#z!IjS+Cp22l96u|>b6d~? zY#(RtMf%P$pGz<-fRPmbN~7%Mi_A=Mt4Y27oRuRxZ&-WA_nm&> zE1#d>aiw&QWoCCTNHZ$L+yMBkL!8~zJ*xE>bpAcW+PSC1OYLh5D)r1H9cl`MMhw7{ zrPthHv3aC#KiPTxw}pC*8cT8Tc;{ZKS+#TfdB&%&9k|wCKJHwwbJX^`9z%K03l3E% zf_JDwa<5t}X43nTD{rV#mBQ@&FR~&}ZToV9m70UoWh^Wzr8Ue7KSw}|4gqs_{%&{lX@ECb#^9cl~n|u5AzzY_ID*} zTUy$Vl>XG)|6d$QgB)tN_IIUfTQa2S(K)hXJ444wyEjKmV1!Agq`uVe?CdgeeiLm5 zoQIveb+>@W*Y)IcGM{%sn%)O{bl?ehM1Ov)^(yctcD~;M6P4q*C)mnPu+3-qjbE!l za>7=02cW$*ykaO7D*4k-}AG$-9!NbsaV?^6As&Z0qj!qo_jH&_-= zKUuml59x6}seyK29K2qUeu9*YEotXikVaq`^(Dj$OG|!WurmwT4}Z3{pDk6D%*S8Le(C5Zo2ESP ze~fNtU`M+HA*Zw48!cBY@3MZ(IYT?%eJ+M%!^=2diJCq-bXW+s%6P&(Qsz+dxP*UU zY36O;rUVp$xK3uu7Ava!A=}ZGujrSPW}_=;F+Z;F2x z7jt3Yg_ExuI4L8;tGSllz19A!3MqBKxLEp_XFz1h_}}Q={|j-?#kYnD0Dv#|7Yp!j zfcAeTdR&-(3kDJW^QpPCj;;ev+$N~crJIYvn7NaU)}?WZ%V$$i(_0!&NMWI_{dRjn zBN1m#yfo`c7!h)DXqQn8nx;gziR(ChGhQ$gK*jKEu{L#zsJ)^f-M780z<(E>hha49 zV?+j2xcJ|8rMN5}yY#4n$$&ePIDd8*HKYXGwgb+Gp$MAe5l=lcEL6tD_s+U?`;rPUTWhFFEaTAs zYIB}y=aU)x_g$oT=fM@_r--fPI^P~Jzra0b7N|N;BT5%)M?86SN^00?auAYZh7Ji#;hKnhhL_+JW0|%p#+>atl5|5-j!H@DG>c{ z7W!wC)RU_16nA7WNK2e{P=@%%TWqYa?O z2FwD;w27T28CSSG_KP`s&0nCmZIPaTFU#`cI(rAqBwYr2T(ei1&D44LZJArDfy!S< zuH|vN7j@{weMaE8Fz67z#Q| z9domYj-FkRdiqer8C>Y&CGHZ_3h5_{JvYy($3X3_D&8sWZ&`N;+TX?F=9m;0%Yl|1 zZGT)JNdt|qoTrq2Mnd2NZSPiAST~(Eg!&L`1zwb$nh1~rl ziJtet1Ptku?Y8G@b6b1IeNZsVlE}UbPGxt?|GGEDB~!n%3Pnp8!6hn>0BFW~7uAg` z+HSQ%dB6n99si#)U^@46cAvXzQ?Du|0e;#Tyy)K{|JSAEx41&y@3J9RZC_N!WFSIw z4tu|(K~|T(^88Ww$t>Pw)`#JHti_BcbqI(ophDn2cpRS zgOsheTElHo|0fW|4FcI8e!>rU_07i)@07o51HlcgZtMIZ%pkZTZUKvJun5(B^)~D1 z0u$vGP|wp&cme?>1+FpQk4EH%{RDxSkt zIo>ge*o1`1}(-e&Ys|pA8%fVD-{Vm{tUBbtmP$N(cmdArg{Gg~U(6P`Q)&Oe`xrgmgJiOrFi-yn<%a{<|2y=* z1o>Z=L-u7=-rVpyccxi_C|f{PNlURp9vP0lTDJXL|G)dFy4kyf?Zn^}1wgrJ0Sqi$ zd_qz(3L3h*jLa~#W)5ZV48~*+NmjeG%;Qtv4{G$_y_d)DFI35m&)n^0% z2>725R>7h$3IH(wTQ>Pb4F3K6??3^TE&&q>IeGbI0G?(>&OSvGA3V1D_3aSnUf|-l zZq3D(Mv#3UFqe{DCV6RR4(OA+pPjt@D6$-Ol19Hw#l^h_E@kp(`= zNA&9a#cPpK=e|p%DOM+ri^Av$h6y))P3$&)CtM{W;SCwwD>|c56|+-~v`fYPrSYmg zD@NGc@Voe*7JZtkIJnAe2kuA(>837nYC3pO9#wJEa#cDc5_{?1jltFOsvs>W)uqG3 zVHcml*)XVQioq+K^i}vVPZ^tRK?t~z)1l8@OP)Coaf8G!@ZI|t=meoTDuufKuLJ8ztX~({IJEW z3cf8LGm#{8BN`?6e^QCf$dxku33H{!WGW|Cm?X3<3m6uv;>YY{CX!cC=^SQrUST1} z;&_P5^qI*fF6}K5Oc%$4Z@_}0jB*u64#vz4v-?@-tDlN!6pmYf$P3nG48jrRs{B^qX$YZGQyYp1(OJ|WS_Luu z9?8L#^JtdX%hgcOATGQAe4mEi;OeHE2akASST#!1j#l3!+`zZ};u!xvXL_v@~hwiWNcbY>yV}qKc#$D=zzcU5Ck4DF)p}vl2AVvpUv9LA~CDvradVetZsxy-PPf1<+H%Jct z9dQBbm>IW&nV*kIsD#-T*H;BzF$hLX0z`_g6QLC84UZOjBBZ>br1O`hZ087#8@!lr7rA6 zu4o8O4U!|rw<;X5 z5EL_v3?Or*m18TycXyfxNFfjyqrflVYj_w!jX+g_j!8`mS4b=O>vQ8jWY#^{cy4*& z-=fL|Q6Ix09zEmwI>&@md`uA}ZxI~=4+Dq`NbfOWVHRS$gVP-sC;H|`V=}QX3qNM}g}*m2z)DN<_D)pp>PuofBC_0b z>46CUilZlY`svDLJ(S}|h{#C`-hbQw(OD`{-Ol?fQ{kd;Uy@Z(H-8!38_n5Q<)nyB z`)_t!y47YMZkPj7rFRmm*i9I{edPpI0Ssozi961aFI}B8+aF+#vB48gapFBL^)|v& z^;e4SV~Sa?gsV-4yM;cb8yeY2RbNjv{tC!ot#FZYUMODl{Po$OeZ6Aa6chNNhB5}i zNK~Orkr^}`PPzBfkxnR_bgFNa$rzCjBjf-!VX`PTdSu61ISlgA>C@^cHf~&%@hPA~ zLqvq>#5sz$Sw*&85H8k@XZt0$z=yqt%c7bikYlQ4{P$KJUs`T@?ChG;tby=&1E-Ia z)ly#-`SlNds=E=ZP0j`iM2kO!2)ecO-R^w|EgyKIDLLW39mTU>P*dVKRWemMep(?l zb1P=hM;LnJIF;qsWM?@1d0l^U#zsufi@%93yVL<~Vt2loF)emjkH{^w_1onv@#aQH zfZiUNjvVOT*@T6?b?VL?bB|@f!In?L!iZqp({oOwftwK|{gxvgB<;S>($6QDhw(6- zjN6uvgiG_m+h*Z<=dma+6GLpg3|M=;Y0O9pvg9Lj zGT5SO{hcl);e5EYm~r@zSaM5bV5` zmGiPzqSErXGhD(|{c+gHzd({SDh*%9TQ#vpgMWehlLGexpQ{j(FBCMBNPM*S%789acYqeVCMg#koa>PZ~2`dRojH z8)<15C`VSx&3Tqyr|@*YlGkm1VX3W^lb%a_^KpVt&_PWyJ^Ji8U}-O@*0ld~d(c%z z-PLumGaiZtP>{f+0o3}#-oNbl>Oo`O$VhG)kh?n5_QbF{k;g6`t%$Fc# zU2?gEPS=w!fh!&onRoZ2Ts&*9^jvB$!WaRyM1&aJ`U{yz$>y5SZw6RHasAMUIu*Ld z!Dz5}=<&47ig+?EQPs#~haib^G89E=O9CUqXTwHrNTR|J8r`|)ou6zwIH+PN3~a~q zEn|tG8fk$zs5E1ouaBBv1IZkTCX)6nLd;%p-7=hL^`SrOT6Z6019NfRhzNIHLZ8<) z2FWdVE-<>N|0)GO2<@QXxB1Uw%)MpeJU;7RS?jjg-R%y#RjTq4 zn_hg@s9uj35pP3q#fuGb2fn)ZNXPTbu7mF3Hxr{O=+WD+UQW|SHwNGC`|gP!BFI#v zV4lXvG4db65hn-T%|0(U!>v`HD@JAX;#cJ)N{mewa5ecZ) z-`0QJkbXH1K+2j~r!#?7ZEy&WfQC#yw=en09Mr@h z+s?g13b4t9IXzF-4Ui-W?1(Di!NbV)DrXg#;U4Um>gt_SP{Qax zVt=LN$?~dB*0KTn9rei5fw)0!2c3nS0f$LjVtx@7V{ZpY-9S@9v9k#)G@{HCnZiP zc+-hBWy)TA_S;;vj^m}ZtgR!`9}5mDo%g1RK3+{8w`M5G{qbgjW1t>B#8@WaUqfL* zFi8;fP}IvVofn;EVo0}p$^-~q2*CP+6-ek1M!Dbtq+uN7n!R>aL%ftp&vFy5>IEAP z1$1u}aBDEE?^7_ByaF6M?I!auO3zt^?!8f><%yImW-XLY;_nYwvz8+#a?9Xq-qUUt z{NX-o+2!eCbnsS7&M`~W=^-QHIB{&!^)XW7y+}G&zU1WHSmclFFkp3{MmSycLF>;N zVsY&UI%V~*xNcIf4NG_nxe^Bx)l8X9_0YU&-@c7M@Q4iA)VwKGzXSljw99l%DjO@v z^LGW6>>0a!Pp5ICdLhsR#kX5>??ImfSQ{78Y5c}k!~cR1@%HEU!Lc;k??cZK-~7Kn?L?41vXR@zSGdwyFicCL5}@E{s8*qchVJs%n{=PER;La=M)%Z zc+zqa6MmAFR+L|N-~XtIaCp4GQcElAjW}b%B4#~ z2!-^`_BM4p{XDPwdI7Bwtiq9VV2fjOeV;rYrYYRX&qyc2$MgQV969hFf&q=?$Vx-h z>>CJIurb{`jF@@OFZ~yYRa)We9Hiz^8J+gDT z_~}xnbtmJhw|%Ppyhj8&eQ{vcK;gA^683c{MJ@Vk7A;|##!tKIr!QUDj@6BkDAKL3 z9mYh1(kPbJhcHeJdpbudlEYzoER&C~PflP#avinGZ6dr6i`=lH72NY4D;rk!IYHEd zXW!T+?qV!(K86#7W2owvh49Kq=NCBEOs!RK9cE3I_0p@vz!7oVgABlc-TP>5PwPOR zHPJJ!#@~}+_Ihd|8OJw%8?hyFvYzIi!@qgeIH&aqz1A2suk71X$d_LGHH`FrEV}#^ z{7XLvYqsdMS)J$E+|9~JZ9iT-B%|4jO(`;tN}mB7)~b-zE5g-Z9EL3)W_r_dObFdF=>^r?!Mr_d^hL zG|%*Ko+P#L8IyE)nX!f%t9?wk9JsIf4bZ5|PkGx|6)kbBCwlNL)TF*j>gq0wipT+EA~m-;$U)BShRSD$RT0HVuJ zasWAwjy)Vkn?&UC0B*rmW6LN2e+KA~Fs0GrJc@-&rxAczBBp8x5~hTN<7!Z%o;?R> zCnv&9rsMb=U0<8R?!+{5Kf;c!V)&~R*iorR&(tSoWB0E#jO#7C6Ykir zRG3$1F15y^B1@5@pC${SOZJb@DpzNSUh!>vP%KvH-DFdlJ^esD<7<`u%YhI6N}Wo~ zsWO`Vv0HGNq*$aW88kmL=z}s;NafqKZ46&bG`575Em4x|00askfRa$h0tk5m>?&;nOyN)stwiit$SC6= zrUwH8Q;`OTDJG3zSs_h~krV@!OaR590Pgn>0J%WEaTVrZ2FXse=nIjv-7MPhSi?h3 z;S(oUmEF|5uv}_L6y&*d!e!~*8cxQ`J}5*X;UsaK=goq>CUYb!G%q4bx%g=fYpTvT z^&6Sjt6fIiF_+5KA53AG6w=m1_ine$RwqjvI8pD<-+W_TLpc^@7QY@meXQ^y_s=B7 z_=m?|gJoMRPR!lvdVMf|aP)eI`b>O@mSA3;lcEbX9TyH#HL2s7uteuPx!PP<`IYN+ zdK>4wv6m?C%Bq}EiZ81JV3Ze7#V{tp81KVr?o@SJ!=K}j+oK}j5xVLHD>8<_U%%pXSWC zL#iYF91?E+_;miHCFbry6~7nj@d>uyuV1LW6O|m{TT3x>wZ&dZup2g=*{P?3gJ|jJ?)eZ4?mbPTC zL(zR`LH8^4Ts?&~3@Cyr163?A2tcQdGfuTZfhlaof@cE=T4&chbp2IerNhp~vBH83 zf)!+Xvc%EhLxfkL9i2M~PnD9che#fYd^b_~5dSWn(4Ka}pfPQvNr2*Te z3v4!2P4NPKSJ%U9@oPDY-YJr3^xt5{WlFBzu$Ul>NC`|$+YSo6SSX5-2k-0tV~4bi0N|Z=hw(RKFTL2wdxb1vKm&;RmmygNv7L+=IG(KAx||My{3bH90(Q zBVaYQIoHp9NN`o6y>4Ptq3Vxr4L$oO26TzOSw!E2-he`9vz3;eih{!}@6MjF(dA+3J1H^%`cl3)qdm>$vN(bgn5Q2DO#$1kz& zCgYwGBXKm$;f^0T5ThH8q%Sb5kZ+ikmTYNrqQ#Y-hu6Yt#n7$GD<4bz3u67Jk{%?` z*|kNHj`a+nSn8qC)xTNIKlzQZtiJfluN#ZtS!Y2hJ;+(F^m4uTMx7?$y-I^~tu%80 zuf~Aqu&Felw9qJhZu2|0z+=Sjfx8-Kp)B{gTj=R+Up|3>%mj3;sNf)3mFGLUynG{S zzD-0`d?q@jpk)MG_>?V!D5k1)hIMSN&Q4&SxX$I2#}9v@tIz)ueNOnH*3n*fo6i@z zCj6Ci!RfHs*?h6-!u{EgsnW((bcNT&$bUry(dY}i%_$qfE#W4bX@vo8{9ur)u_+NK zBo2TH1_Lqih`Ho7?hzBs$PF?xXxN9vJ>ZH>U>x+1juVFr4k!&~krS|zLQ#$$(ol$; z2Z>?TEQJXH0Am6&5nqT{$SCMgVn~{&j2u!)0OkcN@Hl zT@aAM8pMiEAr^gH>aIC+K|tV0twZICqQt{|^o51I@MZ_SV=3jGgQ!3{dc@F?dfxok zdjEX#VG@pjfo}_YfopF;Nt2uwAUB%?%a?nULfb^F)FxX-(HB-HMUJx0A_rbKGw>ThpW5j3Vt< z9=uQ8NTewbek9pYWc7o4z}|u7(TwkxA3~J9Yr>)g(@hq~LX^?kEkX$=1dTi>eV;tx#b}ci+fgdcgYWF!ta_#rl#H+ZczUy1(eJt@O4nd- zAUmMHu)s%E@*|_v;n~)++uuzfFI+d6(mWn`36S7GfTG)k>U1ln*gd-FqEYBLFp||2 z7DG<=s5l-{u#6-240pj*g(tl7xZ6SI5+m%fDKYqu%TH-jwCw635^11T(xWJSl!+*2)iFg{dgc z>J5+^rXk%RfAdFREEfyGpnAAHTn~2fCSU*+JQz}Qx8p`kg)j+A=thtf839EVGh)aW z!IJ(apXC?<4M2^M&(bxy^KCbm4fRlkvAq`lfc!2E-b-MA4I9#IZpGN8g7-cFQv{3A z<>%#Kzr_P4$oj&FeJYiGN%Z)w`OIA1B^L&AGw_Z`;fY30<_f$(!-sBa}{f zjC=CLWUjE(yQ8^1naU@AJMF$4dK_>+RlE8}JP;l!n(_5rDa87(_Zi-D@;KDS*VGgY z5422$L`*e?ez!~>FV+)%3@4cO&BFa%FA~_YeYf7W#FGC-PY$}M(Bi1D^eE?|3IJS~ zG0Y-ynOAaFUe=Cn{QNy?8y!iZRjAL|D;c@5Tdc$oG;x00fCiy6+jF$89nnysU?=vfSCOEyZzB5Yr&M@={`^MaGt0|8lU?jh| zN;_JO+K(gVVL$GHzF^MNbEHo2L{7m-L54lwiPYz#GT0k9#W&8(!&t-v`LtLUm5Wc? zxEIXfk1uUl+ixCT@QrAKFZ7FL#IrzdWA=XPuqO15pn~_op^#N<9U_6xLV2xW7w}tl zy>Y0qz*{UY*eDJL1}7XVjSx_EOnkw_m`H;!CWo?gcfZ2=!-%n7Z~GMci7qXFr?6N; zDOse=E5i&LQbw_=GYEwCMo4 z0{rgHc`Nmc}Fr&s&NhZ>i#6*xz2oQd>Pz9~})7($17?O&4M1hKaUz#u2~ z4_RC=6&@WV!~~p{j=4*IcW`<;HMLcpM(s8j;n{yG?pQ>%dph+M?}pirkWxh@diqh2 zGGiPb>z5*UQ}wH+Uz+KphgArY&IR)l3c?hT1m8(reG zh_Y1K(hb>JhwJ}ENe4s*tWvNcJhw~OF;J zdlh*l*69IV>mR(^-ODP(G@KC?5XKl=glQJ*Y^|Yox?Xx7Z-PFlw>hMX6H|gm0`v6u z{U$aoO2cRI(mpp%c{TOuDPc|ls_PF191NSy4si@mT0)RhLFjF3o zuuH=c`$B`#!OZ=djZE|aFb!b(tLh|S8j%E8@||IVj7OgYagecuoP#O4R2cJ@Q>%`< zIlnOg%vc>}@$R56@2eT5s(&Y2y~yCIeb@DUnd)b5wRqo|A8WL?6cIC)Mbr8B0g+QU z@K)D3mJXJp>EJ~9s`=v@$`noBV9`r!*Sb@WBP+2#ANbPb2dXx>6jPU({Y zGF%7xtm3G<&jlh^PEc%+j+3MAcXdYT<6dTKIk#t)l^@n`FXRJa7 zL{fMBLN3=tES_4qE@AH%ez1?^V!QMH=Ut{=3ixg$VN&>7#J@Bv<9Ph7?#Vyf@jufWAfJdF!gQZ3zn)o`io1^}Egi#sq#CsKz?UWg@L zQ<+4dvvmS1f}}cDI1VT9?xczh47ZIW5{HR~$&jX(4o0g&Vb9~@J;g;Erx_KdhG1Wgg!^Z%t)gHg}4-mHa-u?)DVH-^@ z&5B_gvsHn<@k`EldYjHL{30P@0cFdW{ipa296BcH%yIS_CP;ZlQF2UH+J~smsJ0&$_V{4w2NX-sFj<)%)QG^hB*jwW_6aBZSC@Ov z?_do-w)jT_+~41QZF8o{Cu7o|F!yTIAnkM{{C4V>N!xI0y`Zwa_MObg6FaQ!g^1ns z(BqrFKbgi)nSECcc=ZOHyPt9;w*TdbP_*oV-(tX*PZ%M8MC~o-4G;Z%UT;}?ux-k{ zwij;9LSF(XPEB-SXF448AD^YP0try?Fb1&#G#FTk?rVHg(<3s&fJ7*yCm!8PTxB=t z7Vp#(Cn1L?k;|zn;L4={b{;HJlo`In;qpchy8MJc6EQ1M&pVCDtoAGJG8~Fb3B&ct zAyAtaD4L2OayjLqGZTqd$`fzL{SIukebF2bi1l_nT`8bk{vkI%{k=A1@fR%x7zL86 ze2mdQmSl!5vRu$;&OkF`<+SUDEd|d^c#U@Xl5jLZtq*d0v@2yCOUE>tU%;dFK0;~Q=&aqk%P#a$cJ$- z?yz30Fb%T~lq&_<%WlSB5rg7BFD>rlz5bwe*h$z&&!xawLnIK*{hpDDp09%X=oPgs z_gGDajJvK+N#c_Xx^8%tj?Olc?pbzjE}xobDyvRO&0P6_iPL22$1Otz4pRD*+G5^R zb<*&A_KNZ2;;eTI#F@1X9z62>GW>pH_A>JEHuO5bO5XAz9Zr0I`e5~3R8~QoHj|r1 z!5b0ZPL5x7cZ+8YWJRa!E$dcww>LgDarqq#cvo(cG5ub0UaC3y{b;7nL0~5b1P7$+ zx1W@ARE_N|_1A^iJv~r}#aBmPHenxyqQ42BT7o3X+5@SFMjwKH)k0L=-=eq+2+^y8 z>VHrc;>Cz{g9*?#u9Vhrlf3=Kr!C_6tQ+gd02YN(h7zVFFekrq?ErL^@wtM(#}*+H zmuY{5?c#G8+h_hTQqQd}+LXg5q;^F;Vo6SQw&c$;8>V$Ih}5krQ|ec-zhSnD;#{%j zQ-_+5UQ5CRI0LT;8a0|jtg-~SueU{H70bU-Qh$hZ$l6d{L|JC?b=Qv6Bx~~)JD2lJ z+z^|$5vn)zkCmPeDNKJFFz?f!t|i1(rtj8}>_PuIHUI!-0KS2N3n%H35XeRq!)bjmg)?_h!#U+^h2A61;pRAKxZ)QioE$X-cZ-|!cmZSLuq9`%l0Fg_z`47u z8Uce)WWJVn_?XTCNiN`Sl0=39G1~1^fmfr%SSj_`X;EMM!c~4Y#xjnJ9_HU=vE8+qd?Qu* ztO$#dRc~~Z%7-P4XtY)swJbPr7WrC1O_}lLkpn zAPp}WT|8rP{U}Eco+I)#+3yA}?dnj-j1->u34}x95QJ=&&a1&~ieV_YZU&|LQd^GE ziyyMOnFCKAqDPjd>&t4}T=~`+F45>*?;Z3Ct@e18Z3FtGvQ*v>KfBMoZF(7eg)@y} zS|k8;kU%;ZU#no+6BQzz1SJaG!tU}AvSF>VS##k;Vs_A5KgZkTz=dEy08&NH-??9j zXt6jn;aG1tb81pDx^<5~b@lLy8d09)yV|y@e8??@@cjl~s0=g|(8LxOjZejP*ZHZ( z2?A@its`9DH`|2YD5)DPM3o1ry2{r3sri?cjwvFOYx%agxNYJ?(WB8zn+_*edF|_9 zG-|YJ^;4gMr7_AXGQt&!j7hMG1%i-knOu%zaUs?N5u-?62ppLl{n)-S!qtkIz|CF_ z<1X?8(B-Lm2VoWV0@Wapvci;s8z!m}-8e32$ItlEF8a%TYR;7&8|g0MYJE>nJM9{s zZQG160}7tIg^TVQ!blG&@;ytp`~9%!E{q`&;jmYpc*8v=6=j&ES(?smtA`gS8(t|?DZuWgdEARTZ^N@HAN+^yW3lYcxC!F?+K__ zi$uwW#yLFiup!NLYtn?wuJ1}4R$n+8Yv|mM(`g;UBiMh%QXP%*h%I7>Y)hV>4HfKc zQ94+wAMLVdmGEO2TxVV?0{HN8_|;u(bcX`@DO$1?h4T@2WYL$``>GE@LjpvHy?m1<12o0-S2M)D7#qtaOml}k3eQlD zfI4>SI1?0x8FK(QZ5XYsF;H#F#HwFM1U{H@L$PWFqOz^2w2_@J5Dya!3TbllyMA?% zDmMUMh0~`GCx?iBKU9AHIIpipwEZ^W8P436PD)EYk~vD@gw~t15RRoTvB^R_hW|ZF zB8CXPc^s!}xkV!!F#otIoyXnaGP+l*{l>-3LM-4W#ZdIk2kCTo)AmU;;YSdZ{D=kt zNkov-@V_NZW1>iBUG~qy{gRy!? zz!oJa>`MrNll?tCFr#qO1AFZPk-%5CqNYk6fL(%6v#AV)Pv2>OCJqPKJS?{ehrE)o zUZ!9bO%_DAfy!f7-M zTQ6EBQ+^wdnPixMJ~|@E!FRjEEtFvBbZ7YL|6uC7qnh}Fwl|dk0YVSe&^si6NE1Tu zNN<8B^d?dSY)C=}=^zjg=?Dl&5fD)cRk}!16qF94SU~&pqWzl%LQr4N!Qz2zA&oflyrN3yhz)!9VQzS2&3#WlXPrNL5H zDFz=dlpOpDCe<>fS!jGX*;IH*i@LX@OaDN;zi`W0_#ZFr#4dKJ`9jj8qiEXIpTwjm zM$a9iB*{+=5qFZMrggl32P3J_U6HR~iV=&ca3K5#LJF`Q|iAZ5H+ z5+*wV!Us$Lc`mqN5e^6u1A$x&ud1HDnCGu4&>eNbeaX8Q#S;t%$Y^Oy+mW!6aqw9H zjRm<5)|$0quUA9yt{cTcVMDf|Zh*9z+KwRZlK+fpHQK$ibdF9^ag(04GWMhGUV^+h zb;t>=@-Y1!kpDvZc%j$!=2zOGH`HCuBXFZnJ8<~JaW?JmMVf7D)aFt)2vV`MZ`gjf z&Hx~dpfb+Jo!>yEU{BqF4(EE zhDs3hcNG02&oLX(ed%FE8CWQ#p-?x?BV&0fxWZw zjpD3SYDN9nH=^>sKD8GAjq{m?#w}N*)xhRE#ky~w*|G0hFNwEFpB~MpKHSi~^F(W5 z?FSF1nN3@iW?B$p?5@MWodKs!m&ITFe0N`Vs%&+I#KN7?ootcG1$V^GULjjR|CnmwiF5S6S2~rqYMxdxrMNa z5dCzOKrTk6=%&_F29%feksxxep>2e%wP{!Q(W(ibKAwUJxGS+McX@;&s_~I~>L)gK zpH&}Wt?aoixX*h3_yLU%Vu&ajX0p-4y*%@P=KROTn-ZFu&y=`-^tfq=fu5P1|2}NU zoUoEVG<@@UPF0&X5EuKu+7%<%89u55dL(+GpBN*5dRvN$WOn~Nrz1M?UM(xMsOVlW zh@8bBc}fT^ZhiA$F&QpGb#w%QoNu2iKx4uGjDjGEk=x(enI1i~H(rutt!EQ=ei_^@PHE;4!sGR*d9L@(J*~PtWtr{H1Em%$ zh}P?`+2p>gnN?mOmKHmXHCstxKTRL+bxEmvnvTf$!_`tB>a82QToY8`jJRx;}Uom8BlAMJlUdf5>L`wZ)exUmo*e@%YJx zxq*dNcyXG&g~T1_sR;_2u-9tDaNGxS?GxzF>6 zP*F*(q+)h$vr%ET1VKUHWnO!)OP)p!CN}L!{_caOq&sl$YP~dZu6ceRc6jPzmqaj1 zFQCF}(DZR|u!~e?X25!No(M(aGk?)gRFlu!(cDNL+t6aA%m8(b!S6Y$9*V^j4Q?6k zbc<2m+oOEErJRkqR<3Ds-dSyDdCU~JuB+xLR@t3PcOy#3e3eLE-CN;}?oShn0^ zvPSf=G||)av+gcy@_{uq!8mU+Od)`yDQP>5K>W$6hkQO3xY@G>hmEc8#T3YeqNQyF zZa=JD%xQ{Vv(8Pwek$%x$i0#e$eF_@J>M*i+9$a2a%pUo8|&9nAzn`N4aP63BWANa zmmh5}XK4Rej+M2ao-r=F&g91$XW|^5eD02@VDmym%3#}oX6svi?OXGf`&)c}(`h$1 z+J#p|$DTbKmtJ7{R~Lw|a1g@)S94bwMmKA=y6hO8=P2YXcr|x6$VwH9#mNt?ZhdlT z-NqMvJJELUF)8PFR0 z8Peh2;Y)7*UE=COM(&AsyDy^1?K4K7#UuNYI^!;gv19rERY3no|p83oA{M*bMf8$CC^m5j<{McZ8v{r*g;V;KNf zSJj;K-~oQdjwsLa9UNXa>iyDFVt9Rtbuc5SA2dFUVz69=7!jgKej`X3pSSIu;|kpZ zX@haoa1O)TmeX%iF`Spujjvx2v5w({H^<_+K^}u(`)Yyt``J)kJEb( z5f|*+$5?*`SiP3^(_?9O)B7lMzMZ3n*{;)NQIXH8kAiHyPvPTdG5=$<<48?2UN=6aZBH_>p6MW(Kc&# zqlhV6xZ?bi2HE2sZuFl7D8QbHZ@q2WmypxiDb@WH%on%X8iyw)!z+p^0^-VD`v|S1 zz{hXuJVT}3NNWHUtH3XJo(P_#TJ*0t#xY8O1B}YaC%NwV8jAb^8B!Tflxqi=G4@@0x+oO3EgyH-;+6KlBofqRcK8hRh$Vq?5? z$B!((N=p`RjH#~M?L854@nXtcx-;4Z!dSnzd2sq`#N`P8eQNf5RB5@7d?uHw!k^f&k<@bZfL&wDe>~FM)DtalTPsTLB8oX+mFAaRy4B*w#)p86c1Wl zY&+*+dCw^WqbF^`ub=(0roH{6bbgBR&}ja(SZEk(Ynr}AP|~OviM}L3tjUsR^0rUm zw#cYq2?h|jg1k}D=n0Bnz1F-Ihe4}x6iyb#lMevWj(QM68UzL=PCEQ>cmUOC2m$bP z*qeoubp`q4zH-Ck{rY%_NrqS@&Y)=A9HK^^^o&-~`ZLTn;0_Mt$EyCgctXC~JE-PMPz!2~2`#BeBdvSvk48fzOiDRi+*nDJ3cEkWcmHqr7MGu>fbw`9^ zRUav%p^R!RVlR>bAdQb|Y&drFKG;XXzOi}y=B2@|&yJ~NBs$lu0Ud0v(I(x+fi-8m z>MXAhb}?1BQMiYfD{<@hmPGFCj7wxPL9SLp4wonoKC=9?|5!IF?7BboM zvaxO5lDyZJ8gV{h=;L;4a#e(+Lw$5V6cpdw5jwDbsXDbuU6E5WIihsnKRQ#gxXoHuQD=8es0jIUIU zRn%LK5+=5akI8I`wGX4t)O1BFVdWS zTz7Zhk>(sTZzo*<@g(iTq0ZnW-VqC$CQVM!KYr>KhF2^im zW#^AunO@Vg!6VAs1aStpOV|LABp=eMxXHLw@p;dA<+z?C#E3i%E6Ha2(CWU*8N-=h zEweI@4no_=HQ{edldpfvPEFTEN7XD;Ib8Ed&rFZ1{Tt}{H0|wXBnO{peuD{rafU}t z(_8m5mUBWB=J0@5KO^{3HLM>+-ks8YX+#U#5!p$v9em>9T-X-iV1K>i;ojJymxb4- zRkvbTP5)f|L&J~7KhAPGG&d=51?^uxwS6qcHWoTod**>rZ*G%`^N-Vtg}3(JH2FTQ znHXD85BIzKTERYi;o{NPi%t-^|ZKIA>>VZImN9kfK#LzMQ z_%Tt037ZW4dsXwlay{ud-56Ti(YziNSWsBnr1+&rg|C(Wg(7V|v&+irp7sNob{5@^Q#;ok zSuESqwd~w z`1pnY;V1fQs+xqBN$M}!dF+2Z<@&C_KWfECf9#g@k|%$spPn>PQ#-i36Yt5N4nvDW zG*+?+UxKj z;0T(EB7`!mW6&{ z-P(_dU1=Ad{un6fU;5;Exov$NqJ8?zHD5Pd0}MP*a^1+k0dg(kcI_oo{f%igesQ$R zr<8g3H5>iHLhi|!_EoFeF*mjkR&Go-Ql-JU)ouU9#Ec11(XByrJ4e;j3lVQ zT^U{=z4sYA8yIUVh{*%CRPs?8u|=4NpFh0;ePcu3hSW;^v>2GAA&Mze&A6!ic9Hl~ zsaRNh)5bLJPssaX?kmM-$JVgL?Z2i+q81V#XNosc+Uq&VTud7u51gej8RGfg869nT zUI}}FX3G+%r+wIRE6Bv!p(lQy0&MaaI?Q*^T1QBJdT#bR;={4&Y@@%aCo>us7e+!r z&|k^qMpr0W3)UKc)I~W+!o}I#p!9)3@kJt(>j}8Hx;#FXG<5_6i3%q0gOWfbaO!C0 zFIaK|V@N@*a$@zMoZAVQ@wGhcQkSks#v_u_&{Fs8WSoYT6L;=$x|%3MND3lPZCgU+ z$h_7K=h;22oz{HEUB)bZU;MxpZ>KZnbIxI*C2UxW@%DMWLV@{58Td`01Aa?qwG-#Rsf!Y^|SgeEAK&-||8J`pHe< z!Zi8dp5BC;g69h)<`d3nxzb$SYdRNxe|Nu1= z^-2;X0{(P;D#ze$THe{&1H(ak9&Rz~6gz18h!LhAlRZ|U-E;YhlaxeRzW{SwPOuiuOA;55TYCDvcKInuUYh~v2mjCJiEoyLf?#KzV39sHQK-B$iW4XL$9MgNq^{PG) z4=}u{A|;9wff;Eyy7do^7u5CABZ@wqyg2aKik%E9dq|snXlLiJtxNlFKj_-R zaU(tNW}8E$ho7OyVJ@;iaj^1@UgvUJkXFlD)i7B(7mp7`sh6Xnb50^ z*1&@>-oF&KK8UvCn=Fy(`{=rfobB}nUoJawmhJ7<5-2L~`Ui4Cuy-;mp)|btx z6SvKWe|nC;E^l6K?k#=47fb)<1t07MYxL6b;j!lLW%bJaX3Iv6e`z|jzaPTrTtzV8 zBdv!=Lg^tj28EPYpXv^e4IEdMld_%mbbhhaWsj!XKd=`3C5{Cx^sfD0zWpq(F z515S}dS`ioCiR!}z1fUNK&=m}TD9`$09iy+@p z2w|Epp6Y83Vqi*9+RtOQKeU;tKL@s{Qa_JT*(=iSdkclVjPf z&D{To*-<}+Jy8VhM)1dU&}f3MAR`3NETKx@a}$ze`=k=czd(8A(AEJ8<-D}w zXZf*k;LEd5?|whJ`mXR(5q)m|NealA6Uq#;IXfI?_pH2NQUDT%UlEhDO8g)ey^>0Y z(rC117dV3a+hex_=vGW8mKr#OPM$wa0uaLxD0wAR8UX;nz}a~3_kFzU?zb(4rZk+F zHl@9+^CuUwu(*|(@;p52geT@asXEkogL5;Fn|bbR4vu==*JyGf7yeIsy8IZ4uX?I`x}hAv zV>ke0k+5WGOT{p~R~gOVpYtwFHTNErpD z0(n)Vzr<#Rl(jDzJ?;5(1+^k?VUxT;%7dtLe&Id8J+D1}=+y5s0#8tM&7UtS^pUN- z^Uo-#0SLp;mtP|Y;EoCYi+fLj3oI{i&HH&{KknB=F3()G8?2dJ^gUfC@Ugqe-Xnd& zek@=^u5q}A3RIA=d&M)9kgErF_m8$>>MN}s{^SVf9N+RlPH!Fe(kqV0UF;-@8-F4-+%X1C#4YitztRj)ozn?w1`zIjyfF_swsqOv6 zR$7K)jZ^D_W5Ynh*gc^aLI-WBdvvPc>ELeK(=a+Mh4$j}zAJ|ar-Q?UB)h}V>r6>3 zf1{@u6=EY7keUGnF>>qM2rnVE88H(!PZ!`hHCp<=PUDMDXXpHI=^HColn#hd_sp9$ zPFKrupNQqG0=pC+J(v#~vN_OY;QIA*iKpt$Fy|HNm)_2%&F_`m%I;e>whm>U4sv(q zq0!(`=$5M3;<2WbA^r~9Yo5T++ZThb|C`3Y&m%MXZagr%bo`p0-FP?E@{^tsFNr-l zWjy)RL+d+1TCNWd01|j80|<@bE5}n!4PRudFQI-79@Kr(3&vk&)?eYk42CZCy-Ih} z!5V@Ki?3p`U`W?HX=K=M!Y(Bm4vbMw+Qmjs#-%>N1iQK^^ei!y&lv!cs>zJ`?A5p zZqMJ&UjL=NyiS-F)Ls`H&DGdg~A2*Og~f^oH+ zgD>DujrS_IROY2nC_Fx4DikHlM-c|Y@Hy*^>WWy>%`<2t4mR$$+pa7J&gXohO4-D2 zHrT2A42(BA!}uTkY3-^5v)L=|(=<%~J{%~Rl7BmG?;KsYwfSZ_?Wv?_Qpy+TSzXpX zB?Z`hg$_OAKhI}TIq?URilX3~4Iiey9MO({ZAb}tjJ*~+43bkkimIU(AvC;%Yjbtx zU_6&;u|Jy}lZ;uaOXZ5&O=%}AqV(AU%)-G2qzONPbP?usRDxwEcCr+fzD#C$Bt#X< z?ht2WMABeLA^b!RN47O9C_@V~K;Dj|@Ty*wRh$!0La<3UwiI};J^Fit{qP*m@NJzw z5Oiugy6B{FK#y=#u~Mtcf%a!DPv1PQ>zWP5)cx8+(DX^A9CaOe~Wv+-hHE#-ymGNdt3Xi zQZ2cE@nGyg)Ql#&BRQIb=YWE{Q{PbRB<_j2M3Sg2YbPOO@eq zxOi8tQ)y5K3)1}W==kI}SK8M(OKwXB>ED=LBToGev&27! zqb#pzC!KBxAuPlQL{efE?Ge9E`&&jUAE;jDuz6`iR{|IZz-WN*&6xPO)3Z@ADD2qB zOy2vFy6@<&H@Y)G+C@{WXpIFORb5OlM`r_Qedi*FM6?Sd986LNSg2gAun`cxoB&{@ zwatBf*p<{yEfjTUqv|nn(yUkSkp{~-BUIcB-Ip3cboj3&h1DSdYC%@uyvAwTm*wPw z0f>4CwP1H|D@OqZ<;Oq3q|iZ62DWc#lptLHI;hP7<2CJ~cGD*rr0#!>ccN(eHnX~U z$e0Rx+JzrST_zSN@G$$r^xkVgjBpo07%cAUiUm9#Lw1e0y(`A{*GE}FZ-SGn4#uB2 zb?(04+P*pM_~-obY*=n=-TujgNZwe7rjlsIf5V_Q7$-ty`Yg?bU88>TS)b^h_|e6- zkN&3VncdZbVqaAH6iZE?Y*1YCTC$k;z4Q?xuF`a#sZ#YBC5%py5qCh3b{ z+WE_SoB%FG{#nKyH^I$mLzs|k^(bkEY#)%_SL@78LA4OVD7WM5!f-o}%DKehOyD8l z(rL09xLn4V+HZK{=9_*`RVqs8@fmiXZ&+0=?!**hD2z*Zg2beZNf;3oLj#sK zm2jpcY`7ze5_J&* z_G`+CP(zDKu=M8TUK@Sq+)KZ7vJtqT;dFn?2v2`+4S0)S7%o;22n2wcl3r@c=o8B` z;B4%t&T>UkkM42Z=TPJyv^IJw9LE>hCZu*cK7R=#W}-%YxmHQYkygI?8ZxmmF@I!S zRyGSY{<@U+@Cu5Jqh_SBTu$-BDR^~lM!UL`+Ep0)={?RZ0j~lDH2Z$^c**SxO!qh? z$_It-t&ab=RoRm@)^);)#GxY3Ssv?4!C6vse!o1L0eg!+ynJD51bTZVjS1>DGDUy* zH$RZ* z_<=$HZxcTf)jfLs6KX-KJo_vsV zPM=!XR4chPpFU$?^Y!fqEfp@MTT%60>7U1s|177!ul*;zvdJ~?wr>s2sj$9p5_{m= z=zIE%Lc3e>JiY5@NV6{O^_u%3f|APSa6<2}BVk$vynGBmQO1E7$u$=!R2kp8lzsYe zR!+~F8YV*q6@iLu$dPq2A8sm{7wvO?Es;%CRtO=Udq;{J0Qf9Lumc;Wf{;hfaVu9N44XNE=6 zay%?F7>52b2N0md%5)L(-`i*id@%#4D@q43lC#+<%1L?|L2&eQ7@54nj1D4yC)eeo zO`&|!5Hy5LNluZ60yiu%TsRb`ARm?_Q7em5Wz%9$~1)3v_muJ?J{PqdrmXuu(DRja1jXcQ|ph-!n>PCYy`og5u1} zL$Wb}ZRm4%tzPPyzA0o(Ncu-;bRsdFM33Ki_uw0y>2WUl$}OSP0lAkUVg0-J#g6tG z)FIPqMOh5&^(y+N?1B3rWjTfLu3;%w5g!3GQ)fb&XNIi)7>VQ=BlkRUeb=5~Ew1-@X=zk9*Y zd9Pk-Q|d7Dn&aFd``2H8B9HnmDHitr$YPr(4Qpeq=G#q+~i9p$c6;T(+cX%6V?a6`@R3~ zq~~vs{JjFz{6EYYls_`Lq#jhT=hw&&G@3rDI<{*AZ*AtSYDnTLp?%5t5t2l0b{%i0 z4aCqoKGfprv5Lp_p{gEBdb3C{(vp{T;+SKo00@xusk?jWCr=)Xp zP^7${@@)a#NI_B;Np%yP$T*B&R$VxW-kp-#|J7J5}4IrH?jYgoa_O>R?z(v%@0qHWJxqed~F!YKytEIRB*NfnU zbZ!uWN(GTH{~U#K62q^{lQB^w;JHjUlul^u36wf}G)Y3*57x$N;X$Dw6zm?X7SzCn z&Q{PyGNMQbP%&4kq+g~uvv}(DPm<(Ly=V8WPGkIKu) z3Rn@6{CZKEQaEO`@)Ohp{BVNQLNy{h$?H&^8cB`e4BEzMU`Ki7_vYR|9}QpiZaev> zwhPcsdKY33NpvI$oK4qb1t$%)#N_fo1Z?)baoxAycqVaLNTqB1Q0EK&c&*(Zl9@24 ze6-Z>jmI@o`wt$}PpF?&S;x%XMtaN7u#^3hE<_a@JEeItCm2Xw*kwPt)ISWsy{nq~ zVkoxkWFB(qq>tewl||&{5SpI_?aso5{4qg&kxa6lcr#)<%}?}%GDt@01SFg0f97CG ze{gSFq>x;+C_~P@-!A9SNyD{55tJiZjk0xRsFi`Xrr8_i~tu-r~Kz<2()jVX_lJj$)J)3aaN%7;Yo;$p^y z+Ou=2tcdz_CK@QTZS&5vwseYmiAp=5fg)olh82xlk*L)KJjo=y!?1o>c18vhrvg;A zh?=$mf)y3nW}wF=n!2Ed!^R~;u*H`4*;TFK5eDqlzVS) zXI|?aN7G~a+NCFmIq0NuBnTkU&sYwSNudGvyxy!4a^B0o5CVFOrfo}z`7k&q%YHSwrUXz-?53O_T_NyltFZv znG{f|X&63ixuUkfRkc}BZA>n5FshFNT5Ql)d6Fu#nPs>*a!b;~HiwEd zs#4%2-u}VW>!cv{|E4)wf)US4H1@$3gT`Srsg^iEQ1o-pT9vRw! z{v!S6mQCM(z49qqG8yX%kvzpGZI~9oj1h)))2A)EnWuS~m>Sqx#Xu zBHCmEH)K<-%@ES8bzV`#aJKZDOFFTnSa#wJq(!{|7R5R0fzi& z+pm}Lz>osJ?A`<*7`A-2IV5%5LZznu%iOP^=tEi-jkZ1+?mKzzb!?Q**T9)+SjLd& zlX2R&@t(>T@*N+J&gg8fXKm8EWRB|d!sgox&cDd*zEphYVU*p;c$b9*o0Cb`&zC+k z4BOiZp@joNe(6KXS5 z{WsxU90-VaYZ8>?WhKk!^+?ko?=(hC)(|qo;-ERmBR;~YnF_+x!u#hGiN$9m%@!<^ z3NteE#6QUfdJqwKu*pK;v2@WCr^$HD`j+vyV)+G~Tr+-!5MLfB@FXxbHIn0F18nyE zS7)4JTbZ(wfCB%y1x*I+QtxN}#cigv>L1soCsPlccBL#c(!@V*q+2|o^AXv-ls`Hg z1n}M-)3y_>ZNHxe{qFwcf&;xs|3NtbM6mMAlUjUL*IRbtBVe2p(=e>+#1Qq2DYgz! z^XzBi!{9O(ODQD6c{V5XqXJ*Mw4Mb()DXSu-2$eUeJ^W zaD_eq{p8R{Hg2Vv+Rg?QF#5=~Qi{D+keYo2rA%O)5K|I2VjRF#B8Qv0Tm7LvYs{pF zr9i@IEA9qFIXm1+xFM|v$)zH{dMX_I=&v{R1GEr6Xrc0BbThqM(~c+17W#QhwBHsq zI4r|fS4`ClYJU<3dJSY2y@%6mkrmSh5(rtBbmAw*Eat3 zMn!Q`!bPiguVt5+0_SZ{$sce^%vPtU>sKZA^`{x2;lj|=xwy(4CED*;d!M{H5{8{V zWt>xSNkEmc7eaD)mV_se;9C&j9A}ABBDMurFC~e|e{PJQGai>G9GonNj8I+QA<5Xzua%iYdA}R% zuo|YLcgFO2Q3!SjC<6*$e zL?gtlfuIK}m+GRd-s6>)z))9-F5XlF>cYc$?n?)yzZ5rb-Rgh@U32X4y?$PU1#;U# z7N^7x6|%Qbp>*`pa#eH-><<@e&xF60M>SFus|Q07yLrot)9cwk?A+3gyVtsTWVN(3 z(^h7@M0b>~HnAZ1&<4gXIXogdjNiORiRUxei#bw631!d~MP-atT{Sf6%F40us94_- zq*^tlUR*E5_b=`1Z(mIpI?eSSc^XVzB_I-7RTgJJ{k0rWNp%?9L>y|+cD{%UG+d;G zfyeuv;Y~{Atz`g)mKb2>Y+M&+#;*47`qa!Jg}>0UQJ1vz63RI0qoY3UpVfvd}F16 zOj)?{JN69fFklyA2TEKrjMj$plyvIQqK^y*yx#xrc@}*2zu3M6&ZQQn5A0~| z=s~DHoq+0%`gKv%&VSsIu$g_AYL}v6j2%f=`>cSS5Ow;7G4uksxao+Q$cT8XC~|}! zV_J`Pz2!OvI0vf;Lp)=a{UnZ@2p{4y!Q;HDp2C&jegK*wbxTjH;V4j5~K(Q)ICZXes^-7O*YIB#G7E4M7u*Y)H6` zQIy`qOQsrpxefRT3)tYZzpL!Nrp)Z-KDVIUH}@~+OP)XSMK<<9@cIwEw>~d557^f# z&wuhciguWr<6CrA=A&F1KmSF0adhwOoeu?1-U=~VT<2JtLMVE?T?ksph+OzSlB-jy zBq7_ZuU=rU#7O$C5q4+FV{BgR)y;9oPnT|3TSmSuV->$92NP4#VZTPn53gQxeEVp| zOuLJs!DBX3rJ`)a7vj+LZ~qTRM-n|B08Frfp)T+g6ZAxICaYs#=m3{3@(opWLdb41 z*f6^vB{v~LCQuPpNEt6)hb^XW&D(9Q*&nV*ok|n6G^S0b+ACv_nK(>^=17kNbHGaR(_rua-;Td~T zMj+EY^SQ<9-*@B8NTm;a=_~*K1#3p~5PX{@36igBj8s+=95qPx=E}Kt&oxrP77dFs zaPC!jSTP-B`@%{0d$!cstRADfH+Xjb4T0j~HX4P1FR){|MLT$XEzDZ#69U-3!S|6M z;Je!x?xt}0`F$fiUPdc0TIox-=YJ|+w=A5LDpg!ky&qk*FZjthLrcu)kz2lfd(ph_v&r3wZs|8~@>X?5 zJ;sMtOzX?fmurTZXcu@a`ZkE=p1Wdao+f9Tvx#70wv$XZtOK6|rf1}@7B`gqaJy1y zX3>!Qs_9jwXYe6$k8$qnNxNg~h1p~w_+QU$)ieK$!Z+yR;;oVKC7sX)CbKg)u2@S% z{>Hov&zl9yh>h;4sk6jxYpM1DfFuK^MIN+bE3a}!G_Ta=7WNLSz1}yha%W__ek%&g z$vDf5$pNSLCDm!x?%;*c2`!AJt2*dYU}*#*T?8=g&jtnn4GeKdVl33{dxM@iFRS7= zX;caWju!&?8hzz~H}bU60Z=A<64@IU1roxF%8wvRH<#^Q6=I^Z_(=G# z%jWri{u)ef9c65oOxAmIac4$eGUHP!!HBiIk z4H2omjSIs^KVl&V7k}Tjr5)VpU9^}JMOnK!oiHVz!C9$?A+D??`yJl77O?(lJN0(c z5xKTAD{<}c+N=#re;Q-#U2AW*BirJ;{{=$u4#^40C)?AXU9aCEp#V6ZVT*w%N(8eE zyML?1>Pr>9I$!-a@C#6J)?Lp;idiFE~&iRDHd$W(D^WP(+=sQFlY zFxJur2k^$+Ry>$gm>EIABqbU2@eub28}R=4kNMtjcU~)TJSsBPY=q$RUE@Bq;gRxi zK5PACIxQ(>OWVK~k+Q`?@&%FP8x-VQVNZ#qTvKb8x)WCVF5Y>C^2)=l3IV=g@|Hk> zZz#f;8w`g5r0m9i=+n;xb<+VfXvO#9o$DMlmt3Eu26IaUAfT)J`HRzLb8%VEyfpJK zapu`~)g^Jo0VxBF@#W?*y~niqm$Y~f^Y3v~cDbpV%?P#sq$m8&{(RK0j7sW*gR9B% zUhh}4bZ^o&%l@uP6!iEPIKhbx%y+J4pBwIoVoz?Ao@Q>2jUJg}OxC44RdhK;qiwQC z>C!vF(NEs$kQ5LkJ9_6jFr2x+$g|FWxTr#h*uZNnuo6hbv-$FqLJ7B^wJ@qEmd%)} zT$3OPU&`wa@Hn6nx6qW zHhV1|4rSJqA`O=Z3Nd3Mm=hN~@(k+|RaUbZwchlJNy;Oq-M^zT{^%B;@zLrs}9$-Iba4AByf6!~yn-vNl)*0%lN2gpQWq1;8Thr)q`7 zh5p?0(_kzkCDqUwGP{st*-sTV8YaYBrZb+F~n>`;G%bol(aLxJfh#w z6hI`4`WhLlU42Lz*pjr<4)s*@mB!rrreU+=lF}bXXIp#==7(|trViu$0G3|)iB_m$ z;V#06S>&{IL|r7TP(w9H`AAegtVm<==~zkK$6OK!WNG7?tZsA&XDNyLF3oflQ2#WM z;M1~WN2C4Np&1%NJ6h`M(HW||n7 z?SSdnf-*@fdqa&yWxXyb`=8=>t(RomlQ{e47j?b4c|BXa_@bBWx$5B$ue&Z^qra)N zqa-F}5yBb4=yaX#|<04AIW>7&8D5?CFI57O+%DN`V2(Y=@ z)W14dnx02w{3NAHYOIy88(02-+j|79DPzY(DVI9%7tGYi4<3FybkN5I^oCra|S^zIk ztgxBh+hyKuhDR*C_U)!AB~*1Z2L?aG?0a5tAB@i|pq&tCG!F7%dCqK<-N-c$Wo`FZ z`XJGdKab5yEy+2W<6B#)2m z+Ga3aJYAs~28(r1oxDjdDPJ6|3hEo|&p(igah67L&9@^FhJq^SB+49e#@VvCV8iq( z$B;^O2DPs4&@9Sf(LKX$;bYiR?QMC<4+Rc5!K=3=xj2|WQM?hq6B`3xIn_>;^xXWP zUd|T)#3bpQNdy6?pV&3uvjGTkAl#Szynbr?R?MUw>hUC3!|AN~{^Ettvv&J5+E<5H z#cq!t|1p}s%m|%Guz7B+`rl^Z`cy2vnE|c0@QfmD;bNxx`m^;al$8go72k*G}E&=7MZV<@?nCL(;X!GyQ-6 z_ujkMW|;d3&Ha*iGYYBZew%W?rskSUp;9T8_vX%&OBlM$CApSc_lpgotU@S7bU~!j zMT*#OpYQLVJs#U*f9(C(d7anuoaggAkMSCBeWqhREiy1KWriF<2S%b~o` zP^r(pe3!<8!GJA}&Y{GU{?pY5zU;ka$I87_(BIQ<=M-JHCY*Gb(HwTSox8JRi?UF+ z_&IuKo#L+DW%514slwxcz;T5y=?Dw0Os)-3`EyfB7nmz8ozex>hLX786dORZ@DY2F zJTBHm8fpyMYOW_ov?5z&^88=eMoEJDSJ`{SMa5(bV~(-tUjctVqlMX-?ZelcgKF7Sx|pPW*yAV6pHtSJ8-_%^aAM$b7VpvbsFA2TuN!Si5*&TY$yx6v z{HRy!rG$yUSxQ?|CXljT5*+T5qtS=s?eEV-Up8|0C13yfTF)Oc=4vjQt2tbCJ5nN8 zi@0=Mu)ZUQE-VodF0aV2i0+sb!+&;C!jR7JuP&aM5Y4on8rT%H-?@g4_+Bnq(?mm1 zb&Kf;D;_eK8~P}$Clzg^A{KPqEN}RibMidL2xY8!27#pOx>jo?wf=v(-SfP=pjM1DyrrY0k29;~S z+Pukt2gC^=VgRlmpF6ArpuwNyybszJ;{h2r6#JpH((m)Bl079eJTy-S@FU^-A4uhBh3vmNP;9|m%B8Rqnp}gRi=;+KMFoc05Oj6N5s8! z6a#aJNv7C#QL*|MLfWiN`F}{E49*yaT|Ns1jrW>#gO1Cjs+eA}YU=f~!M1BGjgOKL zJV*SK&T+N81G*Zu_ncqOE${=DH1aJ2i=ek37=vz(D+=T z)u)V)NK}7hWrjc?sJqmfz$Ats96!?mlteNBc&izCyc#e%Piv;if&Tcz>5)3Wc0ed_ zW4<_mChU4j_EWxI5&YO)2FwuAYPkQkBWB%Kxnyfz61@0;KXGlxV(4eNeM4&Fa+m8~ zNX(h|V{U_gPslGjJm6g}ZECU)40w8fYYDVkk4ryFZn24aN4{EjY=pJ=a#`Zblbf{* z`y4z!ZWKQ*9)8wW$Oxn>e2$Y4oOt%ra?|*gs+_KT^Q=;@n z$BBKu*ztGolP{tNM$zTxvG2DfDq!;{ z^Ny1%u4Ke47X%Cn>R3pO==+G_v-XIT9(z>J(y+*7EK~9}&u!5Fan-m6M9ugr_HJvf z>^cPCgI_5neb}ocqWt8XR_ngykzUj$ zXFX<90>n#iE`IuS_{#4MfldzB98G@_01yZ9~f`p#R9R;`T|MDXca-(O>`sG)g| zq>tp?g((-DT7JE>3-~d&UHC6WYvpL!MWcbV1RdeKl^czvS{W4^Wo4+slei85+N6U1 zQB=&UU=1s45vlQ)nrS*keNO3GL%*fk_LG7>CloCG5mznL%)X)hq$3Qsa-+z?s#0y< zHC?Hx+4Fk)1B2EXOmsT=fP$XK&z9bO3w>{I<3i*qg|B?CGz5)I96GJ7w6QxX+;@Ay z?`wuqztX?^%`{g62^V}CO1zv8{=8~dM-G_#vl&^Mf zmax|vtk;tJ%c>uZ6Xz-8?U_A z-eh;&)jtQV74{DCxIf_J0XIU>o8;+lt9k4D*qa# zAtT`+l-ZV>DC(V5rfL_J!RUm{S;pS~C55-3NLG~BXZUln zf?nya6!%_Pt_{O)*< z=PleLyrY_^y9q=&Y}(ZbV|;O$Xr6P`5BaFK`Ob4;XP?R)whv9xlD+uaFXC9csoX-% zM4)NK)s@Xbyu;<6Z`~`FzJHF1{Kzf$T|QfLWaN!SkxOf7O}~E4;>6|)x1NuF3miG{ zy|+{xF@A8_?`J^&SB#!M&1)_)p&>QEXWhT+goEqlaPNeYGdg6_ot$YJXO-uvp|V zUUS3g$?(e`U%v|kW8LjTI?HIhqYNlr6o|3ym%{sZ7fk;9m|vKs@$>TXh3M;o`bu7$ z=i@|^@3LG#NSgsjk%7d`Rxn9ubuWpy1RJwSxR#7~2ex{4UvnM_34DhE2W=yUpP1gE zJSh>a{Cq4*5-fYBgrWG}`~W#1jR8!ck>i^5<{;@KFFfYY-Oe0Tkto>Q$dQ#rQ{OZ6 z)PmW1KmB_z8(($jaZhNtybb^K-j-pqVafFR^T0dh&1N|EJ~ei|1jrZ}e&02GC%E@f zo+WoslIb>V)rNFw=cnY%u8k)D>z5t=%Vkf;xc`P^0lrU=t3T1}@P=adh{y{-!lsddq_?$Fzl= z&}f*LhV+U!)feh2%z$f#f0;rgf>IN{=;p`L5ZriPV*OJ?kjOP7um}ix@A(dvrFAAZ z5yKK?5c7cHU@e$S4Q>Q#j#O;XmwOM%LmN@j5i)96(29fEnRA@gTPRmh(0;6nqI?8$ z>p~%DT7@cyUaGGLqkbqSFOyD|N^CZ_um2M@wR?@W)FFgNi`H2FP~(%-BEnMno^Nx; zEsOg4-ZeJJbfDMD*7h+b_N|>`s|BtxIvXXy;)>GA6$xzD=RO5z+9-B9AClWvKiicL zC)BD8$|(pZus9tnBdenR{|OqG#Mt!=rxz2|iz5qT%1H^Va5)ij+_AzgZ4(WrFZCx6 z;sNNqNFf4Nf<(YJbakVNfv6`?F<`V0`(mSYC)5mrZp}t{BEM|?OspXc-cy$6Ypjb8 z1>Foq5o3%@NNLQqCBtziNfGGN!Q?N68a(mnZ;komJZa|(LCbc*oTwj{$q2Ph-eDeF zNvqFrf78H~27M(tT*`N<*D&*wQa^9_Pu%4TkA(Xe9a8`+PebiCQ^Zx-jvIlOkI0?m zNyqb=+anb&MX(7nxy0%(9vVpq-B($=@NU2>bQxP_f zx+-a|RAaaJ>b}HNc1JITPwVd3tGR++YIJ3e-+w2!Nt&EVmPKL2`=TD16uGZY7*tqj zP4eZG-&a3s%)AZo?kL&*xn10TPsUy`c|@=l@I0BHOX3DO1z2Bl>XP2Pq!~80WB4@YTc7+kcoO3Dg1S)PC>0eBXSHUDA>Q6mOxk zQ?LH~wtP(Y;}yEpd{Qo1>Ak+G_-L=7L-6K8W&eqvdh&Dcwu-cE5cQJSZ#ah=eEGpc zH+{p3t01>&mhjlxF_{p`;Sd1QvqfPBS(`0y9$ZMwWpB*nUDDZF>RuIm z79z2gSynmNeW}1}V=Og+i`63R!O;d^r4c|tpNB#VyJ@vQNBsFO0Hs8eE(GL<%`G-QC zxACjrpzFkwK@PXOjxS8YjM+abRu>x^w`}za1Lf51;N!ti5A#K6`pDUR?i}m%nl@^%h0!K*Btb`6RTa%FD z9N?_A0$Cue>-IK&5=>OWRZ*?!OjJ*ex{tWVl&@51H&5}tS~ex{-kqb1PywjLUUZV` zXCu2T23ZNRciVF_sn+_I+<`EdY zWj33AznAQ(QKmC`z*lL?>>H@pjntM<3MkHQ_|Zz6PZq4bTqSFWV2w8lK6y=kKISoB z`2OjM|A4|ekaeBWD=o|keYpzSNnYt12fwNB7UqP5CZSnhZk{xofB=MWfJR0GU*U!a z5DJX!NCou_1txYcBR{fJXA6H<=N_ICk;dU(1mbSzp-6J@Ak4k3SclL}fsrIpL_RYU z+#pbKN@E+drGem>0r#VwXn;&s`{ rG(vyh$rk|`(RY-Yd~S)uFp1%(y~a+zZR2x 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

4nF|FO&~8 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 hjK|;G6>ab2ynmth|5@}mLiGmInX; literal 0 HcmV?d00001 diff --git a/src/event.rs b/src/event.rs new file mode 100644 index 0000000..ee2aff1 --- /dev/null +++ b/src/event.rs @@ -0,0 +1,88 @@ +use std::time::Duration; + +use crossterm::event::{Event as CrosstermEvent, KeyEvent, MouseEvent}; +use futures::{FutureExt, StreamExt}; +use tokio::sync::mpsc; + +use crate::app::AppResult; + +#[derive(Clone, Copy, Debug)] +pub enum Event { + Tick, + Key(KeyEvent), + Mouse(MouseEvent), + Resize(u16, u16), +} + +#[allow(dead_code)] +#[derive(Debug)] +pub struct EventHandler { + sender: mpsc::UnboundedSender, + receiver: mpsc::UnboundedReceiver, + handler: tokio::task::JoinHandle<()>, +} + +impl EventHandler { + /// Constructs a new instance of [`EventHandler`]. + pub fn new(tick_rate: u64) -> Self { + let tick_rate = Duration::from_millis(tick_rate); + let (sender, receiver) = mpsc::unbounded_channel(); + let _sender = sender.clone(); + let handler = tokio::spawn(async move { + let mut reader = crossterm::event::EventStream::new(); + let mut tick = tokio::time::interval(tick_rate); + loop { + let tick_delay = tick.tick(); + let crossterm_event = reader.next().fuse(); + tokio::select! { + _ = _sender.closed() => { + break; + } + _ = tick_delay => { + _sender.send(Event::Tick).unwrap(); + } + Some(Ok(evt)) = crossterm_event => { + match evt { + CrosstermEvent::Key(key) => { + if key.kind == crossterm::event::KeyEventKind::Press { + _sender.send(Event::Key(key)).unwrap(); + } + }, + CrosstermEvent::Mouse(mouse) => { + _sender.send(Event::Mouse(mouse)).unwrap(); + }, + CrosstermEvent::Resize(x, y) => { + _sender.send(Event::Resize(x, y)).unwrap(); + }, + CrosstermEvent::FocusLost => { + }, + CrosstermEvent::FocusGained => { + }, + CrosstermEvent::Paste(_) => { + }, + } + } + }; + } + }); + Self { + sender, + receiver, + handler, + } + } + + /// Receive the next event from the handler thread. + /// + /// This function will always block the current thread if + /// there is no data available and it's possible for more data to be sent. + pub async fn next(&mut self) -> AppResult { + self.receiver + .recv() + .await + .ok_or(Box::new(std::io::Error::new( + std::io::ErrorKind::Other, + "This is an IO error", + ))) + } +} diff --git a/src/handler.rs b/src/handler.rs new file mode 100644 index 0000000..6ca71ed --- /dev/null +++ b/src/handler.rs @@ -0,0 +1,14 @@ +use crate::app::{App, AppResult}; +use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; + +pub fn handle_key_events(key_event: KeyEvent, app: &mut App) -> AppResult<()> { + match key_event.code { + KeyCode::Char('c') | KeyCode::Char('C') => { + if key_event.modifiers == KeyModifiers::CONTROL { + app.quit(); + } + } + _ => {} + } + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..85ad8bf --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,14 @@ +/// Application. +pub mod app; + +/// Terminal events handler. +pub mod event; + +/// Widget renderer. +pub mod ui; + +/// Terminal user interface. +pub mod tui; + +/// Event handler. +pub mod handler; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..6cfce46 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,53 @@ +use std::io; + +use clap::Parser; +use ratatui::backend::CrosstermBackend; +use ratatui::Terminal; +use romodoro::app::{App, AppResult}; +use romodoro::event::{Event, EventHandler}; +use romodoro::handler::handle_key_events; +use romodoro::tui::Tui; + +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Working length in minutes + #[arg(short, long, default_value_t = 25)] + work: i8, + + /// The length of a pause + #[arg(short, long, default_value_t = 5)] + pause: i8, + + /// The length of a long pause (after 4 cycles) + #[arg(short, long, default_value_t = 20)] + long_pause: i8, +} + +mod tests; +#[tokio::main] +async fn main() -> AppResult<()> { + let args = Args::parse(); + let mut app = App::new(args.work, args.pause, args.long_pause); + + // Initialize the terminal user interface. + let backend = CrosstermBackend::new(io::stderr()); + let terminal = Terminal::new(backend)?; + // FIXME return to 250 when audioplay is fixed + let events = EventHandler::new(1000); + let mut tui = Tui::new(terminal, events); + tui.init()?; + + while app.running { + tui.draw(&mut app)?; + match tui.events.next().await? { + Event::Tick => app.tick(), + Event::Key(key_event) => handle_key_events(key_event, &mut app)?, + Event::Mouse(_) => {} + Event::Resize(_, _) => {} + } + } + + tui.exit()?; + Ok(()) +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs new file mode 100644 index 0000000..c87a480 --- /dev/null +++ b/src/tests/mod.rs @@ -0,0 +1,162 @@ +use std::os::unix::thread; + +use chrono::{Duration, Local}; +use romodoro::app::{App, Session}; + +/** + * In this test I've set up a basic app that simulates if the user has almost already completed + * 4 work cycles. I simulate a tick that should turn the current session into + * a long pause since every 4 work sessions there should be a big break. + */ +#[test] +pub fn test_longpause() { + // Creating the app object + let mut app = App { + running: true, + + // Lets say we started this session 61 seconds ago. + // So when the app ticks the remeaning time of the current session + // should be -1 which means the session is complete + // if the logic is right that means the current_session will be LongPause + start: Local::now() - Duration::seconds(61), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![ + Session::Work, + Session::Pause, + Session::Work, + Session::Pause, + Session::Work, + Session::Pause, + ], + }; + // Ticking... + // Since we started 61 seconds ago, the time left should be 0 meaning its time to complete the + // current session + // the next shall be a longpause + app.tick(); + + // Now we check the logic + assert_eq!(app.current_session, Session::LongPause); +} + +#[test] +pub fn calculate_total_minutes_paused() { + let mut app = App { + running: true, + start: Local::now(), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![Session::Work, Session::Pause, Session::Work, Session::Pause], + }; + + assert_eq!(app.get_paused_total(), 120) +} +#[test] +pub fn calculate_total_minutes_worked() { + let mut app = App { + running: true, + start: Local::now(), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![Session::Work, Session::Pause, Session::Work, Session::Pause], + }; + + assert_eq!(app.time_worked_in_seconds(), 120) +} +#[test] +pub fn calculate_total_minutes_paused_with_longpause() { + let mut app = App { + running: true, + start: Local::now(), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(5), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![ + Session::Work, + Session::Pause, + Session::Work, + Session::Pause, + Session::Work, + Session::Pause, + Session::Work, + Session::LongPause, + Session::Work, + // 4 cycles done + ], + }; + // outcome should be: 2400 + // (3 * 5 * 60) + (1 * 25 * 60) + assert_eq!(app.get_paused_total(), 2400); +} + +#[test] +fn test_time_left() { + let mut app = App { + running: true, + start: Local::now(), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![], + }; + + assert_eq!(app.current_time_left(), 60); +} +#[test] +fn test_time_left_with_minus() { + let mut app = App { + running: true, + start: Local::now() - Duration::seconds(60), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![], + }; + + assert_eq!(app.current_time_left(), 0); +} +#[test] +fn test_time_spent() { + let mut app = App { + running: true, + start: Local::now(), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Work, + sessions: vec![], + }; + + assert_eq!(app.time_worked_in_seconds(), 0); +} +#[test] +pub fn pause() { + let mut app = App { + running: true, + start: Local::now() - Duration::seconds(61), + session_length: Duration::minutes(1), + pause_length: Duration::minutes(1), + long_pause_length: Duration::minutes(25), + current_session: Session::Pause, + sessions: vec![ + Session::Work, + Session::Pause, + Session::Work, // + ], + }; + // Ticking... + app.tick(); + + // Now we check the logic + assert_eq!(app.current_session, Session::Work); +} diff --git a/src/tui.rs b/src/tui.rs new file mode 100644 index 0000000..d90bbe3 --- /dev/null +++ b/src/tui.rs @@ -0,0 +1,76 @@ +use crate::app::{App, AppResult}; +use crate::event::EventHandler; +use crate::ui; +use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; +use crossterm::terminal::{self, EnterAlternateScreen, LeaveAlternateScreen}; +use ratatui::backend::Backend; +use ratatui::Terminal; +use std::io; +use std::panic; + +/// Representation of a terminal user interface. +/// +/// It is responsible for setting up the terminal, +/// initializing the interface and handling the draw events. +#[derive(Debug)] +pub struct Tui { + /// Interface to the Terminal. + terminal: Terminal, + /// Terminal event handler. + pub events: EventHandler, +} + +impl Tui { + /// Constructs a new instance of [`Tui`]. + pub fn new(terminal: Terminal, events: EventHandler) -> Self { + Self { terminal, events } + } + + /// Initializes the terminal interface. + /// + /// It enables the raw mode and sets terminal properties. + pub fn init(&mut self) -> AppResult<()> { + terminal::enable_raw_mode()?; + crossterm::execute!(io::stderr(), EnterAlternateScreen, EnableMouseCapture)?; + + // Define a custom panic hook to reset the terminal properties. + // This way, you won't have your terminal messed up if an unexpected error happens. + let panic_hook = panic::take_hook(); + panic::set_hook(Box::new(move |panic| { + Self::reset().expect("failed to reset the terminal"); + panic_hook(panic); + })); + + self.terminal.hide_cursor()?; + self.terminal.clear()?; + Ok(()) + } + + /// [`Draw`] the terminal interface by [`rendering`] the widgets. + /// + /// [`Draw`]: ratatui::Terminal::draw + /// [`rendering`]: crate::ui::render + pub fn draw(&mut self, app: &mut App) -> AppResult<()> { + self.terminal.draw(|frame| ui::render(app, frame))?; + Ok(()) + } + + /// Resets the terminal interface. + /// + /// This function is also used for the panic hook to revert + /// the terminal properties if unexpected errors occur. + fn reset() -> AppResult<()> { + terminal::disable_raw_mode()?; + crossterm::execute!(io::stderr(), LeaveAlternateScreen, DisableMouseCapture)?; + Ok(()) + } + + /// Exits the terminal interface. + /// + /// It disables the raw mode and reverts back the terminal properties. + pub fn exit(&mut self) -> AppResult<()> { + Self::reset()?; + self.terminal.show_cursor()?; + Ok(()) + } +} diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..1aee90d --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,57 @@ +use crate::app::App; +use ratatui::{ + layout::{Alignment, Offset}, + style::{Color, Style, Stylize}, + widgets::{ + block::{Position, Title}, + Block, BorderType, + }, + Frame, +}; +use tui_big_text::{BigText, PixelSize}; + +pub fn render(app: &mut App, frame: &mut Frame) { + let time_worked = app.time_worked_in_seconds() / 60; + let time_paused = app.get_paused_total() / 60; + + let current_left = app.current_time_left(); + + // TODO add double digit counter to minutes and seconds + let minutes = current_left / 60; + let seconds = current_left % 60; + + let block = Block::bordered() + .title( + Title::from(format!( + " Worked: {}m Paused: {}m ", + time_worked, time_paused + )) + .alignment(Alignment::Center) + .position(Position::Top), + ) + .title( + Title::from(format!(" {} ", app.history().join(", "))) + .alignment(Alignment::Center) + .position(Position::Bottom), + ) + .border_type(BorderType::Rounded); + + // FIXME stupid way of calculating the width of the text, but its good enough + let counter_text = format!("{}:{}", minutes, seconds); + let counter_text_size = format!("{}{}", minutes, seconds).len() * 10; + let big_text = BigText::builder() + .pixel_size(PixelSize::Full) + .style(Style::new().blue()) + .lines(vec![counter_text.into()]) + .style(Style::new().fg(Color::White)) + .build() + .unwrap(); + + frame.render_widget(&block, frame.size()); + let area = block.inner(frame.size()); + let area = block.inner(frame.size()).offset(Offset { + x: ((area.width as usize - counter_text_size) / 2) as i32, + y: ((area.height - 5) / 2) as i32, + }); + frame.render_widget(big_text, area); +}