diff --git a/Cargo.lock b/Cargo.lock
index a3784d9762d8df41af068e955587ac6cde999eef..9c1c833a9786d84349a41d92b0c1c5e70a5caf86 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "ab_glyph"
-version = "0.2.23"
+version = "0.2.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225"
+checksum = "8e08104bebc65a46f8bc7aa733d39ea6874bfa7156f41a46b805785e3af1587d"
 dependencies = [
  "ab_glyph_rasterizer",
  "owned_ttf_parser",
@@ -35,9 +35,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 
 [[package]]
 name = "ahash"
-version = "0.8.6"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -47,9 +47,9 @@ dependencies = [
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
@@ -74,7 +74,7 @@ dependencies = [
  "async-trait",
  "chrono",
  "futures",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "iced",
  "iced_aw",
  "image",
@@ -130,15 +130,15 @@ dependencies = [
 
 [[package]]
 name = "anstyle"
-version = "1.0.4"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
 
 [[package]]
 name = "anyhow"
-version = "1.0.75"
+version = "1.0.81"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247"
 
 [[package]]
 name = "approx"
@@ -172,63 +172,46 @@ dependencies = [
 
 [[package]]
 name = "async-broadcast"
-version = "0.5.1"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b"
+checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
 dependencies = [
- "event-listener 2.5.3",
+ "event-listener 5.3.0",
+ "event-listener-strategy 0.5.1",
  "futures-core",
+ "pin-project-lite",
 ]
 
 [[package]]
 name = "async-channel"
-version = "1.9.0"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
+checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3"
 dependencies = [
  "concurrent-queue",
- "event-listener 2.5.3",
+ "event-listener 5.3.0",
+ "event-listener-strategy 0.5.1",
  "futures-core",
+ "pin-project-lite",
 ]
 
 [[package]]
 name = "async-io"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
-dependencies = [
- "async-lock 2.8.0",
- "autocfg",
- "cfg-if",
- "concurrent-queue",
- "futures-lite 1.13.0",
- "log",
- "parking",
- "polling 2.8.0",
- "rustix 0.37.27",
- "slab",
- "socket2 0.4.10",
- "waker-fn",
-]
-
-[[package]]
-name = "async-io"
-version = "2.2.0"
+version = "2.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997"
+checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884"
 dependencies = [
- "async-lock 3.0.0",
+ "async-lock 3.3.0",
  "cfg-if",
  "concurrent-queue",
  "futures-io",
- "futures-lite 2.0.1",
+ "futures-lite",
  "parking",
- "polling 3.3.0",
- "rustix 0.38.21",
+ "polling",
+ "rustix",
  "slab",
  "tracing",
- "waker-fn",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -242,41 +225,44 @@ dependencies = [
 
 [[package]]
 name = "async-lock"
-version = "3.0.0"
+version = "3.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45e900cdcd39bb94a14487d3f7ef92ca222162e6c7c3fe7cb3550ea75fb486ed"
+checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
 dependencies = [
- "event-listener 3.0.1",
- "event-listener-strategy",
+ "event-listener 4.0.3",
+ "event-listener-strategy 0.4.0",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "async-process"
-version = "1.8.1"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88"
+checksum = "d999d925640d51b662b7b4e404224dd81de70f4aa4a199383c2c5e5b86885fa3"
 dependencies = [
- "async-io 1.13.0",
- "async-lock 2.8.0",
+ "async-channel",
+ "async-io",
+ "async-lock 3.3.0",
  "async-signal",
+ "async-task",
  "blocking",
  "cfg-if",
- "event-listener 3.0.1",
- "futures-lite 1.13.0",
- "rustix 0.38.21",
- "windows-sys 0.48.0",
+ "event-listener 5.3.0",
+ "futures-lite",
+ "rustix",
+ "tracing",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "async-recursion"
-version = "1.0.5"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
+checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -285,13 +271,13 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
 dependencies = [
- "async-io 2.2.0",
+ "async-io",
  "async-lock 2.8.0",
  "atomic-waker",
  "cfg-if",
  "futures-core",
  "futures-io",
- "rustix 0.38.21",
+ "rustix",
  "signal-hook-registry",
  "slab",
  "windows-sys 0.48.0",
@@ -299,19 +285,19 @@ dependencies = [
 
 [[package]]
 name = "async-task"
-version = "4.5.0"
+version = "4.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1"
+checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799"
 
 [[package]]
 name = "async-trait"
-version = "0.1.74"
+version = "0.1.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -322,25 +308,26 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
 
 [[package]]
 name = "axum"
-version = "0.6.20"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
 dependencies = [
  "async-trait",
  "axum-core",
  "axum-macros",
- "bitflags 1.3.2",
  "bytes",
  "futures-util",
  "http",
  "http-body",
+ "http-body-util",
  "hyper",
+ "hyper-util",
  "itoa",
  "matchit",
  "memchr",
@@ -351,7 +338,7 @@ dependencies = [
  "serde",
  "serde_json",
  "serde_path_to_error",
- "sync_wrapper",
+ "sync_wrapper 1.0.1",
  "tokio",
  "tower",
  "tower-layer",
@@ -360,38 +347,41 @@ dependencies = [
 
 [[package]]
 name = "axum-core"
-version = "0.3.4"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
 dependencies = [
  "async-trait",
  "bytes",
  "futures-util",
  "http",
  "http-body",
+ "http-body-util",
  "mime",
+ "pin-project-lite",
  "rustversion",
+ "sync_wrapper 0.1.2",
  "tower-layer",
  "tower-service",
 ]
 
 [[package]]
 name = "axum-macros"
-version = "0.3.8"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62"
+checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa"
 dependencies = [
- "heck",
+ "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "backtrace"
-version = "0.3.69"
+version = "0.3.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
 dependencies = [
  "addr2line",
  "cc",
@@ -404,9 +394,9 @@ dependencies = [
 
 [[package]]
 name = "base64"
-version = "0.21.5"
+version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51"
 
 [[package]]
 name = "bit-set"
@@ -437,9 +427,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.4.1"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
 
 [[package]]
 name = "block"
@@ -477,44 +467,44 @@ dependencies = [
 
 [[package]]
 name = "blocking"
-version = "1.4.1"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a"
+checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
 dependencies = [
  "async-channel",
- "async-lock 2.8.0",
+ "async-lock 3.3.0",
  "async-task",
- "fastrand 2.0.1",
+ "fastrand 2.0.2",
  "futures-io",
- "futures-lite 1.13.0",
+ "futures-lite",
  "piper",
  "tracing",
 ]
 
 [[package]]
 name = "bumpalo"
-version = "3.14.0"
+version = "3.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
 name = "bytemuck"
-version = "1.14.0"
+version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15"
 dependencies = [
  "bytemuck_derive",
 ]
 
 [[package]]
 name = "bytemuck_derive"
-version = "1.5.0"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
+checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -525,9 +515,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.5.0"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
 
 [[package]]
 name = "calloop"
@@ -543,11 +533,37 @@ dependencies = [
  "vec_map",
 ]
 
+[[package]]
+name = "calloop"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298"
+dependencies = [
+ "bitflags 2.5.0",
+ "log",
+ "polling",
+ "rustix",
+ "slab",
+ "thiserror",
+]
+
+[[package]]
+name = "calloop-wayland-source"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02"
+dependencies = [
+ "calloop 0.12.4",
+ "rustix",
+ "wayland-backend 0.3.3",
+ "wayland-client 0.31.2",
+]
+
 [[package]]
 name = "cc"
-version = "1.0.83"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41"
 dependencies = [
  "jobserver",
  "libc",
@@ -567,21 +583,21 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
 
 [[package]]
 name = "chrono"
-version = "0.4.31"
+version = "0.4.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
  "num-traits",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.4",
 ]
 
 [[package]]
 name = "clap"
-version = "4.4.7"
+version = "4.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b"
+checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
 dependencies = [
  "clap_builder",
  "clap_derive",
@@ -589,9 +605,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.4.7"
+version = "4.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663"
+checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
 dependencies = [
  "anstyle",
  "clap_lex",
@@ -600,30 +616,30 @@ dependencies = [
 
 [[package]]
 name = "clap_complete"
-version = "4.4.4"
+version = "4.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bffe91f06a11b4b9420f62103854e90867812cd5d01557f853c5ee8e791b12ae"
+checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c"
 dependencies = [
  "clap",
 ]
 
 [[package]]
 name = "clap_derive"
-version = "4.4.7"
+version = "4.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
 dependencies = [
- "heck",
+ "heck 0.5.0",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.6.0"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
 
 [[package]]
 name = "clipboard-win"
@@ -649,21 +665,21 @@ dependencies = [
 
 [[package]]
 name = "clipboard_wayland"
-version = "0.2.0"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f6364a9f7a66f2ac1a1a098aa1c7f6b686f2496c6ac5e5c0d773445df912747"
+checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8"
 dependencies = [
  "smithay-clipboard",
 ]
 
 [[package]]
 name = "clipboard_x11"
-version = "0.4.0"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "983a7010836ecd04dde2c6d27a0cb56ec5d21572177e782bdcb24a600124e921"
+checksum = "4274ea815e013e0f9f04a2633423e14194e408a0576c943ce3d14ca56c50031c"
 dependencies = [
  "thiserror",
- "x11rb 0.9.0",
+ "x11rb 0.13.0",
 ]
 
 [[package]]
@@ -720,18 +736,18 @@ checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642"
 
 [[package]]
 name = "concurrent-queue"
-version = "2.3.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400"
+checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
 dependencies = [
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -739,9 +755,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.4"
+version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
 
 [[package]]
 name = "core-graphics"
@@ -758,9 +774,9 @@ dependencies = [
 
 [[package]]
 name = "core-graphics-types"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33"
+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
 dependencies = [
  "bitflags 1.3.2",
  "core-foundation",
@@ -789,54 +805,46 @@ dependencies = [
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.11"
+version = "0.2.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "crc32fast"
-version = "1.3.2"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
 dependencies = [
  "cfg-if",
 ]
 
 [[package]]
 name = "crossbeam-deque"
-version = "0.8.3"
+version = "0.8.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
 dependencies = [
- "cfg-if",
  "crossbeam-epoch",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.9.15"
+version = "0.9.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
 dependencies = [
- "autocfg",
- "cfg-if",
  "crossbeam-utils",
- "memoffset 0.9.0",
- "scopeguard",
 ]
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.16"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
-dependencies = [
- "cfg-if",
-]
+checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
 
 [[package]]
 name = "crunchy"
@@ -854,6 +862,12 @@ dependencies = [
  "typenum",
 ]
 
+[[package]]
+name = "cursor-icon"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
+
 [[package]]
 name = "d3d12"
 version = "0.6.0"
@@ -919,35 +933,32 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
 dependencies = [
- "libloading 0.8.1",
+ "libloading 0.8.3",
 ]
 
 [[package]]
 name = "downcast-rs"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
 
 [[package]]
 name = "either"
-version = "1.9.0"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
 
 [[package]]
-name = "encoding_rs"
-version = "0.8.33"
+name = "endi"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
-dependencies = [
- "cfg-if",
-]
+checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
 
 [[package]]
 name = "enumflags2"
-version = "0.7.8"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939"
+checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d"
 dependencies = [
  "enumflags2_derive",
  "serde",
@@ -955,13 +966,13 @@ dependencies = [
 
 [[package]]
 name = "enumflags2_derive"
-version = "0.7.8"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246"
+checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -972,12 +983,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.5"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
 dependencies = [
  "libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -992,9 +1003,9 @@ dependencies = [
 
 [[package]]
 name = "etagere"
-version = "0.2.9"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bf70b9ea3a235a7432b4f481854815e2d4fb2fe824c1f5fb09b8985dd06b3e9"
+checksum = "306960881d6c46bd0dd6b7f07442a441418c08d0d3e63d8d080b0f64c6343e4e"
 dependencies = [
  "euclid",
  "svg_fmt",
@@ -1017,9 +1028,20 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 
 [[package]]
 name = "event-listener"
-version = "3.0.1"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "event-listener"
+version = "5.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cec0252c2afff729ee6f00e903d479fba81784c8e2bd77447673471fdfaea1"
+checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
 dependencies = [
  "concurrent-queue",
  "parking",
@@ -1028,19 +1050,29 @@ dependencies = [
 
 [[package]]
 name = "event-listener-strategy"
-version = "0.3.0"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
+dependencies = [
+ "event-listener 4.0.3",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "event-listener-strategy"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160"
+checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3"
 dependencies = [
- "event-listener 3.0.1",
+ "event-listener 5.3.0",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "exr"
-version = "1.6.4"
+version = "1.72.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56"
+checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4"
 dependencies = [
  "bit_field",
  "flume",
@@ -1069,15 +1101,15 @@ dependencies = [
 
 [[package]]
 name = "fastrand"
-version = "2.0.1"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
 
 [[package]]
 name = "fdeflate"
-version = "0.3.1"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868"
+checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645"
 dependencies = [
  "simd-adler32",
 ]
@@ -1094,14 +1126,10 @@ dependencies = [
 
 [[package]]
 name = "flume"
-version = "0.10.14"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
 dependencies = [
- "futures-core",
- "futures-sink",
- "nanorand",
- "pin-project",
  "spin",
 ]
 
@@ -1111,6 +1139,15 @@ version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
+[[package]]
+name = "font-types"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6784a76a9c2b136ea3b8462391e9328252e938eb706eb44d752723b4c3a533"
+dependencies = [
+ "bytemuck",
+]
+
 [[package]]
 name = "fontdb"
 version = "0.14.1"
@@ -1141,18 +1178,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 
 [[package]]
 name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
 dependencies = [
  "percent-encoding",
 ]
 
 [[package]]
 name = "futures"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1165,9 +1202,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -1175,15 +1212,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -1193,63 +1230,51 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
 
 [[package]]
 name = "futures-lite"
-version = "1.13.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
 dependencies = [
- "fastrand 1.9.0",
+ "fastrand 2.0.2",
  "futures-core",
  "futures-io",
- "memchr",
  "parking",
  "pin-project-lite",
- "waker-fn",
-]
-
-[[package]]
-name = "futures-lite"
-version = "2.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb"
-dependencies = [
- "futures-core",
- "pin-project-lite",
 ]
 
 [[package]]
 name = "futures-macro"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "futures-sink"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
 
 [[package]]
 name = "futures-task"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
 
 [[package]]
 name = "futures-util"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1283,24 +1308,32 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "gethostname"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
+dependencies = [
+ "libc",
+ "windows-targets 0.48.5",
+]
+
 [[package]]
 name = "getrandom"
-version = "0.2.10"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
 dependencies = [
  "cfg-if",
- "js-sys",
  "libc",
  "wasi",
- "wasm-bindgen",
 ]
 
 [[package]]
 name = "gif"
-version = "0.12.0"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
+checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2"
 dependencies = [
  "color_quant",
  "weezl",
@@ -1308,9 +1341,9 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.28.0"
+version = "0.28.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
 
 [[package]]
 name = "glam"
@@ -1380,9 +1413,9 @@ version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "gpu-descriptor-types",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
 ]
 
 [[package]]
@@ -1391,7 +1424,7 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
 ]
 
 [[package]]
@@ -1406,9 +1439,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.3.21"
+version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069"
 dependencies = [
  "bytes",
  "fnv",
@@ -1416,7 +1449,7 @@ dependencies = [
  "futures-sink",
  "futures-util",
  "http",
- "indexmap 1.9.3",
+ "indexmap 2.2.6",
  "slab",
  "tokio",
  "tokio-util",
@@ -1425,9 +1458,9 @@ dependencies = [
 
 [[package]]
 name = "half"
-version = "2.3.1"
+version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872"
+checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
 dependencies = [
  "cfg-if",
  "crunchy",
@@ -1441,9 +1474,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
 [[package]]
 name = "hashbrown"
-version = "0.14.2"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
 dependencies = [
  "ahash",
  "allocator-api2",
@@ -1471,11 +1504,17 @@ 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.3"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 
 [[package]]
 name = "hex"
@@ -1491,9 +1530,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
 
 [[package]]
 name = "http"
-version = "0.2.9"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
 dependencies = [
  "bytes",
  "fnv",
@@ -1502,12 +1541,24 @@ dependencies = [
 
 [[package]]
 name = "http-body"
-version = "0.4.5"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d"
 dependencies = [
  "bytes",
+ "futures-core",
  "http",
+ "http-body",
  "pin-project-lite",
 ]
 
@@ -1525,13 +1576,12 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
 
 [[package]]
 name = "hyper"
-version = "0.14.27"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a"
 dependencies = [
  "bytes",
  "futures-channel",
- "futures-core",
  "futures-util",
  "h2",
  "http",
@@ -1540,32 +1590,53 @@ dependencies = [
  "httpdate",
  "itoa",
  "pin-project-lite",
- "socket2 0.4.10",
+ "smallvec",
  "tokio",
- "tower-service",
- "tracing",
  "want",
 ]
 
 [[package]]
 name = "hyper-rustls"
-version = "0.24.2"
+version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"
 dependencies = [
  "futures-util",
  "http",
  "hyper",
+ "hyper-util",
  "rustls",
+ "rustls-pki-types",
  "tokio",
  "tokio-rustls",
+ "tower-service",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower",
+ "tower-service",
+ "tracing",
 ]
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.58"
+version = "0.1.60"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
@@ -1764,9 +1835,9 @@ dependencies = [
 
 [[package]]
 name = "idna"
-version = "0.4.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
 dependencies = [
  "unicode-bidi",
  "unicode-normalization",
@@ -1774,9 +1845,9 @@ dependencies = [
 
 [[package]]
 name = "image"
-version = "0.24.7"
+version = "0.24.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
+checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"
 dependencies = [
  "bytemuck",
  "byteorder",
@@ -1784,7 +1855,6 @@ dependencies = [
  "exr",
  "gif",
  "jpeg-decoder",
- "num-rational",
  "num-traits",
  "png",
  "qoi",
@@ -1803,12 +1873,12 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.1.0"
+version = "2.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
 dependencies = [
  "equivalent",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
 ]
 
 [[package]]
@@ -1842,9 +1912,9 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
 
 [[package]]
 name = "itoa"
-version = "1.0.9"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
 name = "jni-sys"
@@ -1854,27 +1924,27 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 
 [[package]]
 name = "jobserver"
-version = "0.1.27"
+version = "0.1.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "jpeg-decoder"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
+checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
 dependencies = [
  "rayon",
 ]
 
 [[package]]
 name = "js-sys"
-version = "0.3.65"
+version = "0.3.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8"
+checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -1912,7 +1982,7 @@ dependencies = [
 name = "kurisu_api"
 version = "3.0.1"
 dependencies = [
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "lektor_utils",
  "serde",
  "serde_json",
@@ -1950,7 +2020,7 @@ dependencies = [
 name = "lektor_mpris"
 version = "3.0.1"
 dependencies = [
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "lektor_procmacros",
  "lektor_utils",
  "serde",
@@ -1966,7 +2036,7 @@ dependencies = [
  "async-trait",
  "chrono",
  "futures",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "kurisu_api",
  "lektor_procmacros",
  "lektor_utils",
@@ -2001,7 +2071,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -2010,7 +2080,7 @@ version = "3.0.1"
 dependencies = [
  "anyhow",
  "futures",
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
  "kurisu_api",
  "lektor_nkdb",
  "lektor_utils",
@@ -2045,7 +2115,9 @@ dependencies = [
  "axum",
  "clap",
  "futures",
+ "hashbrown 0.14.3",
  "hyper",
+ "hyper-util",
  "lektor_mpris",
  "lektor_nkdb",
  "lektor_payloads",
@@ -2055,13 +2127,15 @@ dependencies = [
  "serde",
  "serde_json",
  "tokio",
+ "tokio-stream",
+ "tower",
 ]
 
 [[package]]
 name = "libc"
-version = "0.2.150"
+version = "0.2.153"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
 
 [[package]]
 name = "libloading"
@@ -2075,12 +2149,12 @@ dependencies = [
 
 [[package]]
 name = "libloading"
-version = "0.8.1"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161"
+checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
 dependencies = [
  "cfg-if",
- "windows-sys 0.48.0",
+ "windows-targets 0.52.4",
 ]
 
 [[package]]
@@ -2091,37 +2165,30 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
 
 [[package]]
 name = "libredox"
-version = "0.0.1"
+version = "0.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "libc",
  "redox_syscall 0.4.1",
 ]
 
 [[package]]
 name = "libredox"
-version = "0.0.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "libc",
- "redox_syscall 0.4.1",
 ]
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.10"
+version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
+checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
 
 [[package]]
 name = "lkt"
@@ -2155,9 +2222,9 @@ dependencies = [
 
 [[package]]
 name = "log"
-version = "0.4.20"
+version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
 
 [[package]]
 name = "lru"
@@ -2165,7 +2232,7 @@ version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21"
 dependencies = [
- "hashbrown 0.14.2",
+ "hashbrown 0.14.3",
 ]
 
 [[package]]
@@ -2185,9 +2252,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
 
 [[package]]
 name = "memchr"
-version = "2.6.4"
+version = "2.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
 
 [[package]]
 name = "memmap2"
@@ -2207,6 +2274,15 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "memmap2"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "memoffset"
 version = "0.6.5"
@@ -2227,9 +2303,9 @@ dependencies = [
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
@@ -2254,17 +2330,11 @@ version = "0.3.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
 
-[[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.1"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
 dependencies = [
  "adler",
  "simd-adler32",
@@ -2272,9 +2342,9 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "0.8.9"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
 dependencies = [
  "libc",
  "log",
@@ -2309,19 +2379,10 @@ dependencies = [
 ]
 
 [[package]]
-name = "nanorand"
+name = "ndk"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "ndk"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
+checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
 dependencies = [
  "bitflags 1.3.2",
  "jni-sys",
@@ -2346,19 +2407,6 @@ dependencies = [
  "jni-sys",
 ]
 
-[[package]]
-name = "nix"
-version = "0.22.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf"
-dependencies = [
- "bitflags 1.3.2",
- "cc",
- "cfg-if",
- "libc",
- "memoffset 0.6.5",
-]
-
 [[package]]
 name = "nix"
 version = "0.24.3"
@@ -2398,13 +2446,16 @@ dependencies = [
 ]
 
 [[package]]
-name = "nom"
-version = "7.1.3"
+name = "nix"
+version = "0.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
 dependencies = [
- "memchr",
- "minimal-lexical",
+ "bitflags 2.5.0",
+ "cfg-if",
+ "cfg_aliases",
+ "libc",
+ "memoffset 0.9.1",
 ]
 
 [[package]]
@@ -2416,32 +2467,11 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "num-integer"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
 [[package]]
 name = "num-traits"
-version = "0.2.17"
+version = "0.2.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
 dependencies = [
  "autocfg",
 ]
@@ -2480,7 +2510,7 @@ version = "0.5.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
 dependencies = [
- "proc-macro-crate",
+ "proc-macro-crate 1.3.1",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
@@ -2492,10 +2522,10 @@ version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6"
 dependencies = [
- "proc-macro-crate",
+ "proc-macro-crate 1.3.1",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -2565,18 +2595,18 @@ dependencies = [
 
 [[package]]
 name = "object"
-version = "0.32.1"
+version = "0.32.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "option-ext"
@@ -2614,9 +2644,9 @@ dependencies = [
 
 [[package]]
 name = "palette"
-version = "0.7.3"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2e2f34147767aa758aa649415b50a69eeb46a67f9dc7db8011eeb3d84b351dc"
+checksum = "ebfc23a4b76642983d57e4ad00bb4504eb30a8ce3c70f4aee1f725610e36d97a"
 dependencies = [
  "approx",
  "fast-srgb8",
@@ -2626,13 +2656,13 @@ dependencies = [
 
 [[package]]
 name = "palette_derive"
-version = "0.7.3"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7db010ec5ff3d4385e4f133916faacd9dad0f6a09394c92d825b3aed310fa0a"
+checksum = "e8890702dbec0bad9116041ae586f84805b13eecd1d8b1df27c29998a9969d6d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -2691,9 +2721,9 @@ dependencies = [
 
 [[package]]
 name = "percent-encoding"
-version = "2.3.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "phf"
@@ -2725,7 +2755,7 @@ dependencies = [
  "phf_shared",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -2739,29 +2769,29 @@ dependencies = [
 
 [[package]]
 name = "pin-project"
-version = "1.1.3"
+version = "1.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
 dependencies = [
  "pin-project-internal",
 ]
 
 [[package]]
 name = "pin-project-internal"
-version = "1.1.3"
+version = "1.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
 
 [[package]]
 name = "pin-utils"
@@ -2776,21 +2806,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
 dependencies = [
  "atomic-waker",
- "fastrand 2.0.1",
+ "fastrand 2.0.2",
  "futures-io",
 ]
 
 [[package]]
 name = "pkg-config"
-version = "0.3.27"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
 
 [[package]]
 name = "png"
-version = "0.17.10"
+version = "0.17.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
+checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1"
 dependencies = [
  "bitflags 1.3.2",
  "crc32fast",
@@ -2801,32 +2831,17 @@ dependencies = [
 
 [[package]]
 name = "polling"
-version = "2.8.0"
+version = "3.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
-dependencies = [
- "autocfg",
- "bitflags 1.3.2",
- "cfg-if",
- "concurrent-queue",
- "libc",
- "log",
- "pin-project-lite",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "polling"
-version = "3.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531"
+checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6"
 dependencies = [
  "cfg-if",
  "concurrent-queue",
+ "hermit-abi",
  "pin-project-lite",
- "rustix 0.38.21",
+ "rustix",
  "tracing",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -2845,6 +2860,15 @@ dependencies = [
  "toml_edit 0.19.15",
 ]
 
+[[package]]
+name = "proc-macro-crate"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
+dependencies = [
+ "toml_edit 0.21.1",
+]
+
 [[package]]
 name = "proc-macro-error"
 version = "1.0.4"
@@ -2870,18 +2894,18 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.79"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "profiling"
-version = "1.0.11"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b"
+checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58"
 
 [[package]]
 name = "qoi"
@@ -2901,11 +2925,20 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "quick-xml"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
 dependencies = [
  "proc-macro2",
 ]
@@ -2948,9 +2981,9 @@ checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab"
 
 [[package]]
 name = "rangemap"
-version = "1.4.0"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "977b1e897f9d764566891689e642653e5ed90c6895106acd005eb4c1d0203991"
+checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684"
 
 [[package]]
 name = "raw-window-handle"
@@ -2960,9 +2993,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
 
 [[package]]
 name = "rayon"
-version = "1.8.0"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
 dependencies = [
  "either",
  "rayon-core",
@@ -2970,14 +3003,24 @@ dependencies = [
 
 [[package]]
 name = "rayon-core"
-version = "1.12.0"
+version = "1.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
 dependencies = [
  "crossbeam-deque",
  "crossbeam-utils",
 ]
 
+[[package]]
+name = "read-fonts"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea75b5ec052843434d263ef7a4c31cf86db5908c729694afb1ad3c884252a1b6"
+dependencies = [
+ "bytemuck",
+ "font-types",
+]
+
 [[package]]
 name = "redox_syscall"
 version = "0.2.16"
@@ -3007,20 +3050,20 @@ dependencies = [
 
 [[package]]
 name = "redox_users"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
 dependencies = [
  "getrandom",
- "libredox 0.0.1",
+ "libredox 0.1.3",
  "thiserror",
 ]
 
 [[package]]
 name = "regex"
-version = "1.10.2"
+version = "1.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -3030,9 +3073,9 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.3"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -3041,32 +3084,32 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
 
 [[package]]
 name = "renderdoc-sys"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b"
+checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
 
 [[package]]
 name = "reqwest"
-version = "0.11.22"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
+checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19"
 dependencies = [
  "base64",
  "bytes",
- "encoding_rs",
  "futures-core",
  "futures-util",
- "h2",
  "http",
  "http-body",
+ "http-body-util",
  "hyper",
  "hyper-rustls",
+ "hyper-util",
  "ipnet",
  "js-sys",
  "log",
@@ -3076,10 +3119,11 @@ dependencies = [
  "pin-project-lite",
  "rustls",
  "rustls-pemfile",
+ "rustls-pki-types",
  "serde",
  "serde_json",
  "serde_urlencoded",
- "system-configuration",
+ "sync_wrapper 0.1.2",
  "tokio",
  "tokio-rustls",
  "tower-service",
@@ -3093,16 +3137,17 @@ dependencies = [
 
 [[package]]
 name = "ring"
-version = "0.17.5"
+version = "0.17.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
 dependencies = [
  "cc",
+ "cfg-if",
  "getrandom",
  "libc",
  "spin",
  "untrusted",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -3125,67 +3170,63 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
 [[package]]
 name = "rustix"
-version = "0.37.27"
+version = "0.38.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
+checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89"
 dependencies = [
- "bitflags 1.3.2",
+ "bitflags 2.5.0",
  "errno",
- "io-lifetimes",
  "libc",
- "linux-raw-sys 0.3.8",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "rustix"
-version = "0.38.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
-dependencies = [
- "bitflags 2.4.1",
- "errno",
- "libc",
- "linux-raw-sys 0.4.10",
- "windows-sys 0.48.0",
+ "linux-raw-sys",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "rustls"
-version = "0.21.8"
+version = "0.22.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c"
+checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c"
 dependencies = [
  "log",
  "ring",
+ "rustls-pki-types",
  "rustls-webpki",
- "sct",
+ "subtle",
+ "zeroize",
 ]
 
 [[package]]
 name = "rustls-pemfile"
-version = "1.0.3"
+version = "2.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
+checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
 dependencies = [
  "base64",
+ "rustls-pki-types",
 ]
 
+[[package]]
+name = "rustls-pki-types"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247"
+
 [[package]]
 name = "rustls-webpki"
-version = "0.101.7"
+version = "0.102.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
 dependencies = [
  "ring",
+ "rustls-pki-types",
  "untrusted",
 ]
 
 [[package]]
 name = "rustversion"
-version = "1.0.14"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
 
 [[package]]
 name = "rustybuzz"
@@ -3206,9 +3247,9 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.15"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
 
 [[package]]
 name = "scoped-tls"
@@ -3222,16 +3263,6 @@ version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
-[[package]]
-name = "sct"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
-dependencies = [
- "ring",
- "untrusted",
-]
-
 [[package]]
 name = "sctk-adwaita"
 version = "0.5.4"
@@ -3241,37 +3272,37 @@ dependencies = [
  "ab_glyph",
  "log",
  "memmap2 0.5.10",
- "smithay-client-toolkit",
+ "smithay-client-toolkit 0.16.1",
  "tiny-skia 0.8.4",
 ]
 
 [[package]]
 name = "serde"
-version = "1.0.192"
+version = "1.0.197"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001"
+checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.192"
+version = "1.0.197"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1"
+checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.108"
+version = "1.0.115"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
+checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd"
 dependencies = [
- "indexmap 2.1.0",
+ "indexmap 2.2.6",
  "itoa",
  "ryu",
  "serde",
@@ -3279,9 +3310,9 @@ dependencies = [
 
 [[package]]
 name = "serde_path_to_error"
-version = "0.1.14"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
+checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
 dependencies = [
  "itoa",
  "serde",
@@ -3289,20 +3320,20 @@ dependencies = [
 
 [[package]]
 name = "serde_repr"
-version = "0.1.17"
+version = "0.1.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
+checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.4"
+version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80"
+checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
 dependencies = [
  "serde",
 ]
@@ -3343,9 +3374,9 @@ dependencies = [
 
 [[package]]
 name = "sha256"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386"
+checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0"
 dependencies = [
  "async-trait",
  "bytes",
@@ -3386,18 +3417,18 @@ dependencies = [
 
 [[package]]
 name = "slotmap"
-version = "1.0.6"
+version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342"
+checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
 dependencies = [
  "version_check",
 ]
 
 [[package]]
 name = "smallvec"
-version = "1.11.1"
+version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 
 [[package]]
 name = "smithay-client-toolkit"
@@ -3406,7 +3437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9"
 dependencies = [
  "bitflags 1.3.2",
- "calloop",
+ "calloop 0.10.6",
  "dlib",
  "lazy_static",
  "log",
@@ -3414,38 +3445,54 @@ dependencies = [
  "nix 0.24.3",
  "pkg-config",
  "wayland-client 0.29.5",
- "wayland-cursor",
- "wayland-protocols",
+ "wayland-cursor 0.29.5",
+ "wayland-protocols 0.29.5",
 ]
 
 [[package]]
-name = "smithay-clipboard"
-version = "0.6.6"
+name = "smithay-client-toolkit"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8"
+checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a"
 dependencies = [
- "smithay-client-toolkit",
- "wayland-client 0.29.5",
+ "bitflags 2.5.0",
+ "calloop 0.12.4",
+ "calloop-wayland-source",
+ "cursor-icon",
+ "libc",
+ "log",
+ "memmap2 0.9.4",
+ "rustix",
+ "thiserror",
+ "wayland-backend 0.3.3",
+ "wayland-client 0.31.2",
+ "wayland-csd-frame",
+ "wayland-cursor 0.31.1",
+ "wayland-protocols 0.31.2",
+ "wayland-protocols-wlr",
+ "wayland-scanner 0.31.1",
+ "xkeysym",
 ]
 
 [[package]]
-name = "socket2"
-version = "0.4.10"
+name = "smithay-clipboard"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d"
 dependencies = [
  "libc",
- "winapi",
+ "smithay-client-toolkit 0.18.1",
+ "wayland-backend 0.3.3",
 ]
 
 [[package]]
 name = "socket2"
-version = "0.5.5"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
 dependencies = [
  "libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -3467,7 +3514,7 @@ dependencies = [
  "redox_syscall 0.3.5",
  "thiserror",
  "wasm-bindgen",
- "wayland-backend",
+ "wayland-backend 0.1.2",
  "wayland-client 0.30.2",
  "wayland-sys 0.30.1",
  "web-sys",
@@ -3513,18 +3560,25 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
 
+[[package]]
+name = "subtle"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+
 [[package]]
 name = "svg_fmt"
-version = "0.4.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
+checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499"
 
 [[package]]
 name = "swash"
-version = "0.1.8"
+version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b7c73c813353c347272919aa1af2885068b05e625e5532b43049e4f641ae77f"
+checksum = "06ec889a8e0a6fcb91041996c8f1f6be0fe1a09e94478785e07c32ce2bca2d2b"
 dependencies = [
+ "read-fonts",
  "yazi",
  "zeno",
 ]
@@ -3542,9 +3596,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.39"
+version = "2.0.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3557,6 +3611,12 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
 
+[[package]]
+name = "sync_wrapper"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+
 [[package]]
 name = "sys-locale"
 version = "0.3.1"
@@ -3581,45 +3641,23 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "system-configuration"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation",
- "system-configuration-sys",
-]
-
-[[package]]
-name = "system-configuration-sys"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
 [[package]]
 name = "tempfile"
-version = "3.8.1"
+version = "3.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
 dependencies = [
  "cfg-if",
- "fastrand 2.0.1",
- "redox_syscall 0.4.1",
- "rustix 0.38.21",
- "windows-sys 0.48.0",
+ "fastrand 2.0.2",
+ "rustix",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "termcolor"
-version = "1.3.0"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
 dependencies = [
  "winapi-util",
 ]
@@ -3630,35 +3668,35 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7"
 dependencies = [
- "rustix 0.38.21",
+ "rustix",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "thiserror"
-version = "1.0.50"
+version = "1.0.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.50"
+version = "1.0.58"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "tiff"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
+checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e"
 dependencies = [
  "flate2",
  "jpeg-decoder",
@@ -3733,9 +3771,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.33.0"
+version = "1.37.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
+checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
 dependencies = [
  "backtrace",
  "bytes",
@@ -3744,7 +3782,7 @@ dependencies = [
  "num_cpus",
  "pin-project-lite",
  "signal-hook-registry",
- "socket2 0.5.5",
+ "socket2",
  "tokio-macros",
  "tracing",
  "windows-sys 0.48.0",
@@ -3752,30 +3790,31 @@ dependencies = [
 
 [[package]]
 name = "tokio-macros"
-version = "2.1.0"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
 name = "tokio-rustls"
-version = "0.24.1"
+version = "0.25.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
 dependencies = [
  "rustls",
+ "rustls-pki-types",
  "tokio",
 ]
 
 [[package]]
 name = "tokio-stream"
-version = "0.1.14"
+version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
 dependencies = [
  "futures-core",
  "pin-project-lite",
@@ -3798,15 +3837,15 @@ dependencies = [
 
 [[package]]
 name = "toml"
-version = "0.8.8"
+version = "0.8.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35"
+checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
 dependencies = [
- "indexmap 2.1.0",
+ "indexmap 2.2.6",
  "serde",
  "serde_spanned",
  "toml_datetime",
- "toml_edit 0.21.0",
+ "toml_edit 0.22.9",
 ]
 
 [[package]]
@@ -3824,22 +3863,33 @@ version = "0.19.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
 dependencies = [
- "indexmap 2.1.0",
+ "indexmap 2.2.6",
  "toml_datetime",
- "winnow",
+ "winnow 0.5.40",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.21.0"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
+dependencies = [
+ "indexmap 2.2.6",
+ "toml_datetime",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"
+checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4"
 dependencies = [
- "indexmap 2.1.0",
+ "indexmap 2.2.6",
  "serde",
  "serde_spanned",
  "toml_datetime",
- "winnow",
+ "winnow 0.6.5",
 ]
 
 [[package]]
@@ -3855,6 +3905,7 @@ dependencies = [
  "tokio",
  "tower-layer",
  "tower-service",
+ "tracing",
 ]
 
 [[package]]
@@ -3875,6 +3926,7 @@ version = "0.1.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
 dependencies = [
+ "log",
  "pin-project-lite",
  "tracing-attributes",
  "tracing-core",
@@ -3888,7 +3940,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
 [[package]]
@@ -3902,9 +3954,9 @@ dependencies = [
 
 [[package]]
 name = "try-lock"
-version = "0.2.4"
+version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
 
 [[package]]
 name = "ttf-parser"
@@ -3937,19 +3989,20 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
 
 [[package]]
 name = "uds_windows"
-version = "1.0.2"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d"
+checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
 dependencies = [
+ "memoffset 0.9.1",
  "tempfile",
  "winapi",
 ]
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
 
 [[package]]
 name = "unicode-bidi-mirroring"
@@ -3983,24 +4036,24 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
 
 [[package]]
 name = "unicode-normalization"
-version = "0.1.22"
+version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
 dependencies = [
  "tinyvec",
 ]
 
 [[package]]
 name = "unicode-script"
-version = "0.5.5"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc"
+checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd"
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
 
 [[package]]
 name = "unicode-width"
@@ -4022,9 +4075,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
 
 [[package]]
 name = "url"
-version = "2.4.1"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -4043,12 +4096,6 @@ version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
-[[package]]
-name = "waker-fn"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
-
 [[package]]
 name = "want"
 version = "0.3.1"
@@ -4066,9 +4113,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.88"
+version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce"
+checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
 dependencies = [
  "cfg-if",
  "wasm-bindgen-macro",
@@ -4076,24 +4123,24 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.88"
+version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217"
+checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.38"
+version = "0.4.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02"
+checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -4103,9 +4150,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.88"
+version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2"
+checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
 dependencies = [
  "quote",
  "wasm-bindgen-macro-support",
@@ -4113,22 +4160,22 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.88"
+version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907"
+checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.88"
+version = "0.2.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b"
+checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
 
 [[package]]
 name = "wasm-timer"
@@ -4160,6 +4207,20 @@ dependencies = [
  "wayland-sys 0.30.1",
 ]
 
+[[package]]
+name = "wayland-backend"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40"
+dependencies = [
+ "cc",
+ "downcast-rs",
+ "rustix",
+ "scoped-tls",
+ "smallvec",
+ "wayland-sys 0.31.1",
+]
+
 [[package]]
 name = "wayland-client"
 version = "0.29.5"
@@ -4184,10 +4245,22 @@ checksum = "489c9654770f674fc7e266b3c579f4053d7551df0ceb392f153adb1f9ed06ac8"
 dependencies = [
  "bitflags 1.3.2",
  "nix 0.26.4",
- "wayland-backend",
+ "wayland-backend 0.1.2",
  "wayland-scanner 0.30.1",
 ]
 
+[[package]]
+name = "wayland-client"
+version = "0.31.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f"
+dependencies = [
+ "bitflags 2.5.0",
+ "rustix",
+ "wayland-backend 0.3.3",
+ "wayland-scanner 0.31.1",
+]
+
 [[package]]
 name = "wayland-commons"
 version = "0.29.5"
@@ -4200,6 +4273,17 @@ dependencies = [
  "wayland-sys 0.29.5",
 ]
 
+[[package]]
+name = "wayland-csd-frame"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
+dependencies = [
+ "bitflags 2.5.0",
+ "cursor-icon",
+ "wayland-backend 0.3.3",
+]
+
 [[package]]
 name = "wayland-cursor"
 version = "0.29.5"
@@ -4211,6 +4295,17 @@ dependencies = [
  "xcursor",
 ]
 
+[[package]]
+name = "wayland-cursor"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba"
+dependencies = [
+ "rustix",
+ "wayland-client 0.31.2",
+ "xcursor",
+]
+
 [[package]]
 name = "wayland-protocols"
 version = "0.29.5"
@@ -4223,6 +4318,31 @@ dependencies = [
  "wayland-scanner 0.29.5",
 ]
 
+[[package]]
+name = "wayland-protocols"
+version = "0.31.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4"
+dependencies = [
+ "bitflags 2.5.0",
+ "wayland-backend 0.3.3",
+ "wayland-client 0.31.2",
+ "wayland-scanner 0.31.1",
+]
+
+[[package]]
+name = "wayland-protocols-wlr"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
+dependencies = [
+ "bitflags 2.5.0",
+ "wayland-backend 0.3.3",
+ "wayland-client 0.31.2",
+ "wayland-protocols 0.31.2",
+ "wayland-scanner 0.31.1",
+]
+
 [[package]]
 name = "wayland-scanner"
 version = "0.29.5"
@@ -4241,7 +4361,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b9b873b257fbc32ec909c0eb80dea312076a67014e65e245f5eb69a6b8ab330e"
 dependencies = [
  "proc-macro2",
- "quick-xml",
+ "quick-xml 0.28.2",
+ "quote",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283"
+dependencies = [
+ "proc-macro2",
+ "quick-xml 0.31.0",
  "quote",
 ]
 
@@ -4268,11 +4399,23 @@ dependencies = [
  "pkg-config",
 ]
 
+[[package]]
+name = "wayland-sys"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
+dependencies = [
+ "dlib",
+ "log",
+ "once_cell",
+ "pkg-config",
+]
+
 [[package]]
 name = "web-sys"
-version = "0.3.65"
+version = "0.3.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85"
+checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -4280,15 +4423,18 @@ dependencies = [
 
 [[package]]
 name = "webpki-roots"
-version = "0.25.2"
+version = "0.26.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
+checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009"
+dependencies = [
+ "rustls-pki-types",
+]
 
 [[package]]
 name = "weezl"
-version = "0.1.7"
+version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
 
 [[package]]
 name = "wgpu"
@@ -4322,7 +4468,7 @@ checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2"
 dependencies = [
  "arrayvec",
  "bit-vec",
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "codespan-reporting",
  "log",
  "naga",
@@ -4347,7 +4493,7 @@ dependencies = [
  "arrayvec",
  "ash",
  "bit-set",
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "block",
  "core-graphics-types",
  "d3d12",
@@ -4360,7 +4506,7 @@ dependencies = [
  "js-sys",
  "khronos-egl",
  "libc",
- "libloading 0.8.1",
+ "libloading 0.8.3",
  "log",
  "metal",
  "naga",
@@ -4385,16 +4531,16 @@ version = "0.16.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d0c153280bb108c2979eb5c7391cb18c56642dd3c072e55f52065e13e2a1252a"
 dependencies = [
- "bitflags 2.4.1",
+ "bitflags 2.5.0",
  "js-sys",
  "web-sys",
 ]
 
 [[package]]
 name = "widestring"
-version = "1.0.2"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
 
 [[package]]
 name = "winapi"
@@ -4423,9 +4569,9 @@ dependencies = [
 
 [[package]]
 name = "winapi-wsapoll"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e"
+checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28"
 dependencies = [
  "winapi",
 ]
@@ -4461,11 +4607,11 @@ dependencies = [
 
 [[package]]
 name = "windows-core"
-version = "0.51.1"
+version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
 dependencies = [
- "windows-targets 0.48.5",
+ "windows-targets 0.52.4",
 ]
 
 [[package]]
@@ -4486,6 +4632,15 @@ 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"
@@ -4516,6 +4671,21 @@ dependencies = [
  "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"
@@ -4528,6 +4698,12 @@ 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"
@@ -4540,6 +4716,12 @@ 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"
@@ -4552,6 +4734,12 @@ 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"
@@ -4564,6 +4752,12 @@ 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"
@@ -4576,6 +4770,12 @@ 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"
@@ -4588,6 +4788,12 @@ 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"
@@ -4600,6 +4806,12 @@ 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 = "winit"
 version = "0.28.7"
@@ -4624,11 +4836,11 @@ dependencies = [
  "raw-window-handle",
  "redox_syscall 0.3.5",
  "sctk-adwaita",
- "smithay-client-toolkit",
+ "smithay-client-toolkit 0.16.1",
  "wasm-bindgen",
  "wayland-client 0.29.5",
  "wayland-commons",
- "wayland-protocols",
+ "wayland-protocols 0.29.5",
  "wayland-scanner 0.29.5",
  "web-sys",
  "windows-sys 0.45.0",
@@ -4637,18 +4849,27 @@ dependencies = [
 
 [[package]]
 name = "winnow"
-version = "0.5.19"
+version = "0.5.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "winreg"
-version = "0.50.0"
+version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
 dependencies = [
  "cfg-if",
  "windows-sys 0.48.0",
@@ -4665,32 +4886,31 @@ dependencies = [
  "pkg-config",
 ]
 
-[[package]]
-name = "x11rb"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e99be55648b3ae2a52342f9a870c0e138709a3493261ce9b469afe6e4df6d8a"
-dependencies = [
- "gethostname",
- "nix 0.22.3",
- "winapi",
- "winapi-wsapoll",
-]
-
 [[package]]
 name = "x11rb"
 version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cdf3c79412dd91bae7a7366b8ad1565a85e35dd049affc3a6a2c549e97419617"
 dependencies = [
- "gethostname",
+ "gethostname 0.2.3",
  "libc",
  "libloading 0.7.4",
  "nix 0.25.1",
  "once_cell",
  "winapi",
  "winapi-wsapoll",
- "x11rb-protocol",
+ "x11rb-protocol 0.11.1",
+]
+
+[[package]]
+name = "x11rb"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a"
+dependencies = [
+ "gethostname 0.4.3",
+ "rustix",
+ "x11rb-protocol 0.13.0",
 ]
 
 [[package]]
@@ -4702,30 +4922,39 @@ dependencies = [
  "nix 0.25.1",
 ]
 
+[[package]]
+name = "x11rb-protocol"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34"
+
 [[package]]
 name = "xcursor"
-version = "0.3.4"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
-dependencies = [
- "nom",
-]
+checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911"
 
 [[package]]
 name = "xdg-home"
-version = "1.0.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd"
+checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e"
 dependencies = [
- "nix 0.26.4",
+ "libc",
  "winapi",
 ]
 
+[[package]]
+name = "xkeysym"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621"
+
 [[package]]
 name = "xml-rs"
-version = "0.8.19"
+version = "0.8.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
+checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
 
 [[package]]
 name = "yazi"
@@ -4735,24 +4964,22 @@ checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1"
 
 [[package]]
 name = "zbus"
-version = "3.14.1"
+version = "4.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
+checksum = "c9ff46f2a25abd690ed072054733e0bc3157e3d4c45f41bd183dce09c2ff8ab9"
 dependencies = [
  "async-broadcast",
  "async-process",
  "async-recursion",
  "async-trait",
- "byteorder",
  "derivative",
  "enumflags2",
- "event-listener 2.5.3",
+ "event-listener 5.3.0",
  "futures-core",
  "futures-sink",
  "futures-util",
  "hex",
- "nix 0.26.4",
- "once_cell",
+ "nix 0.28.0",
  "ordered-stream",
  "rand",
  "serde",
@@ -4762,7 +4989,7 @@ dependencies = [
  "tokio",
  "tracing",
  "uds_windows",
- "winapi",
+ "windows-sys 0.52.0",
  "xdg-home",
  "zbus_macros",
  "zbus_names",
@@ -4771,11 +4998,11 @@ dependencies = [
 
 [[package]]
 name = "zbus_macros"
-version = "3.14.1"
+version = "4.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d"
+checksum = "4e0e3852c93dcdb49c9462afe67a2a468f7bd464150d866e861eaf06208633e0"
 dependencies = [
- "proc-macro-crate",
+ "proc-macro-crate 3.1.0",
  "proc-macro2",
  "quote",
  "regex",
@@ -4785,9 +5012,9 @@ dependencies = [
 
 [[package]]
 name = "zbus_names"
-version = "2.6.0"
+version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9"
+checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c"
 dependencies = [
  "serde",
  "static_assertions",
@@ -4802,24 +5029,30 @@ checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697"
 
 [[package]]
 name = "zerocopy"
-version = "0.7.25"
+version = "0.7.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557"
+checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
 dependencies = [
  "zerocopy-derive",
 ]
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.7.25"
+version = "0.7.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b"
+checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.39",
+ "syn 2.0.58",
 ]
 
+[[package]]
+name = "zeroize"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+
 [[package]]
 name = "zune-inflate"
 version = "0.2.54"
@@ -4831,13 +5064,12 @@ dependencies = [
 
 [[package]]
 name = "zvariant"
-version = "3.15.0"
+version = "4.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c"
+checksum = "2c1b3ca6db667bfada0f1ebfc94b2b1759ba25472ee5373d4551bb892616389a"
 dependencies = [
- "byteorder",
+ "endi",
  "enumflags2",
- "libc",
  "serde",
  "static_assertions",
  "zvariant_derive",
@@ -4845,11 +5077,11 @@ dependencies = [
 
 [[package]]
 name = "zvariant_derive"
-version = "3.15.0"
+version = "4.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd"
+checksum = "b7a4b236063316163b69039f77ce3117accb41a09567fd24c168e43491e521bc"
 dependencies = [
- "proc-macro-crate",
+ "proc-macro-crate 3.1.0",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
@@ -4858,9 +5090,9 @@ dependencies = [
 
 [[package]]
 name = "zvariant_utils"
-version = "1.0.1"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200"
+checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172"
 dependencies = [
  "proc-macro2",
  "quote",
diff --git a/Cargo.toml b/Cargo.toml
index 240d3d4d8132ab9f32f17323474a990397fa9389..42bd06177e1d06d9a1cd35c12a988888de66503a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -39,76 +39,73 @@ opt-level = "s"
 panic = 'unwind'
 
 [workspace.dependencies]
-url = { version = "2", default-features = false }
-zbus = { version = "3", default-features = false, features = ["tokio"] }
-chrono = { version = "0.4", default-features = false, features = ["clock"] }
-sha256 = { version = "1", default-features = false, features = ["async"] }
-anyhow = { version = "1", default-features = false, features = ["std"] }
-regex = { version = "1.9", default-features = false, features = [
-    "std",
-    "perf",
-] }
-log = "0.4"
+url = { version = "*", default-features = false }
+zbus = { version = "*", default-features = false, features = ["tokio"] }
+chrono = { version = "*", default-features = false, features = ["clock"] }
+sha256 = { version = "*", default-features = false, features = ["async"] }
+anyhow = { version = "*", default-features = false, features = ["std"] }
+regex = { version = "*", default-features = false, features = ["std", "perf"] }
+log = "*"
 rand = "*"
 base64 = "*"
-dirs = "5"
+dirs = "*"
 
 # Data Structures
-hashbrown = { version = "0.14", features = ["serde"] }
+hashbrown = { version = "*", features = ["serde"] }
 
 # Serialization & Deserialization
-serde_json = { version = "1", default-features = false, features = [
+serde_json = { version = "*", default-features = false, features = [
     "std",
     "preserve_order",
 ] }
-toml = { version = "0.8", default-features = false, features = [
+toml = { version = "*", default-features = false, features = [
     "preserve_order",
     "display",
     "parse",
 ] }
-serde = { version = "1", default-features = false, features = [
+serde = { version = "*", default-features = false, features = [
     "rc",
     "std",
     "derive",
 ] }
 
 # Async stuff
-async-trait = "0.1"
-futures = { version = "0.3", default-features = false, features = [
+async-trait = "*"
+futures = { version = "*", default-features = false, features = [
     "std",
     "async-await",
 ] }
-tokio = { version = "1", default-features = false, features = [
+tokio = { version = "*", default-features = false, features = [
     "macros",
     "rt-multi-thread",
     "sync",
     "fs",
     "signal",
 ] }
-tokio-stream = { version = "0.1", default-features = false }
+tokio-stream = { version = "*", default-features = false, features = ["net"] }
 
 # Web stuff
-reqwest = { version = "0.11", default-features = false, features = [
+reqwest = { version = "*", default-features = false, features = [
     "rustls-tls",
     "json",
 ] }
-axum = { version = "0.6", default-features = false, features = [
+axum = { version = "*", default-features = false, features = [
     "http1",
     "json",
     "macros",
     "tokio",
 ] }
-hyper = { version = "0.14", default-features = false, features = [
+tower = { version = "*", features = ["util"] }
+hyper-util = { version = "*", features = ["tokio", "server-auto", "http1"] }
+hyper = { version = "*", default-features = false, features = [
     "http1",
     "server",
-    "runtime",
-    "tcp",
 ] }
 
 # Arguments
-roff = "0.2"
-clap_complete = { version = "4", default-features = false }
-clap = { version = "4", default-features = false, features = [
+roff = "*"
+clap_complete = { version = "*", default-features = false }
+clap = { version = "*", default-features = false, features = [
     "usage",
     "help",
     "std",
@@ -116,10 +113,10 @@ clap = { version = "4", default-features = false, features = [
     "derive",
 ] }
 
-# GUI
+# GUI, keep in mind that we must use the same version of image as ixed!
 image = { version = "0.24", default-features = false, features = ["png"] }
-iced = { version = "0.10", features = ["tokio", "system", "advanced", "image"] }
-iced_aw = { version = "0.7", default-features = false, features = [
+iced = { version = "*", features = ["tokio", "system", "advanced", "image"] }
+iced_aw = { version = "*", default-features = false, features = [
     "split",
     "wrap",
     "badge",
@@ -129,7 +126,7 @@ iced_aw = { version = "0.7", default-features = false, features = [
 ] }
 
 # Proc macro things
-syn = "2"
-quote = { version = "1", default-features = false }
-proc-macro2 = { version = "1", default-features = false }
-proc-macro-error = { version = "1.0", default-features = false }
+syn = "*"
+quote = { version = "*", default-features = false }
+proc-macro2 = { version = "*", default-features = false }
+proc-macro-error = { version = "*", default-features = false }
diff --git a/amadeus/src/app.rs b/amadeus/src/app.rs
index 262a7dd4b4398625359a7fb0b83e762ce4c4477f..1392f672f41ebef3df1fc94c1dd57e47f82cf692 100644
--- a/amadeus/src/app.rs
+++ b/amadeus/src/app.rs
@@ -132,15 +132,11 @@ impl Amadeus {
     /// Commands to issue to clear data from the [Amadeus] application.
     fn clear() -> Command<Message> {
         Message::from_iter([
-            Message::ConfigMessage(config::Message::Infos(None)),
-            Message::MainPanelMessage(mainpanel::Message::Queue(mainpanel::queue::Message::Clear)),
-            Message::MainPanelMessage(mainpanel::Message::History(
-                mainpanel::history::Message::Clear,
-            )),
-            Message::MainPanelMessage(mainpanel::Message::Playlists(
-                mainpanel::playlists::Message::Clear,
-            )),
-            Message::SidebarMessage(sidebar::Message::ClearPlaylists),
+            Message::Config(config::Message::Infos(None)),
+            Message::MainPanel(mainpanel::Message::Queue(queue::Message::Clear)),
+            Message::MainPanel(mainpanel::Message::History(history::Message::Clear)),
+            Message::MainPanel(mainpanel::Message::Playlists(playlists::Message::Clear)),
+            Message::Sidebar(sidebar::Message::ClearPlaylists),
         ])
         .perform()
     }
@@ -197,12 +193,12 @@ impl Amadeus {
                 Message::from_err_ors(
                     res.map(|info| {
                         Message::from_iter([
-                            Message::ConfigMessage(config::Message::Infos(Some(info))),
+                            Message::Config(config::Message::Infos(Some(info))),
                             Message::ConnectionStatus(true),
                         ])
                     }),
                     [
-                        Message::ConfigMessage(config::Message::Infos(None)),
+                        Message::Config(config::Message::Infos(None)),
                         Message::ConnectionStatus(false),
                     ],
                 )
@@ -450,12 +446,12 @@ impl Amadeus {
             Message::from_err_or_elses(
                 res.map(|infos| {
                     Message::from_iter([
-                        Message::ConfigMessage(config::Message::Infos(Some(infos))),
+                        Message::Config(config::Message::Infos(Some(infos))),
                         Message::ConnectionStatus(true),
                     ])
                 }),
                 || {
-                    [Message::ConfigMessage(config::Message::Infos(None))]
+                    [Message::Config(config::Message::Infos(None))]
                         .into_iter()
                         .chain(flag.then_some(Message::MainPanelDisplay(MainPanelDisplay::Config)))
                 },
@@ -646,7 +642,7 @@ impl Application for Amadeus {
                         Message::ConnectionStatus(true),
                         Message::DatabaseEpoch(epoch),
                         Message::RefreshRequest(RefreshRequest::Playlists),
-                        Message::ConfigMessage(config::Message::Infos(Some(Infos {
+                        Message::Config(config::Message::Infos(Some(Infos {
                             version,
                             last_epoch: Some(epoch),
                         }))),
@@ -654,7 +650,7 @@ impl Application for Amadeus {
                     Ok(infos) => Message::from_iter([
                         Message::ConnectionStatus(true),
                         Message::RefreshRequest(RefreshRequest::Playlists),
-                        Message::ConfigMessage(config::Message::Infos(Some(infos))),
+                        Message::Config(config::Message::Infos(Some(infos))),
                     ]),
                     Err(_) => Message::ConnectionStatus(false),
                 })
@@ -664,18 +660,16 @@ impl Application for Amadeus {
 
                 let queue = Command::perform(self.get_queue(), |res| {
                     res.map(|queue| {
-                        Message::MainPanelMessage(mainpanel::Message::Queue(
-                            queue::Message::Reload(queue),
-                        ))
+                        Message::MainPanel(mainpanel::Message::Queue(queue::Message::Reload(queue)))
                     })
                     .unwrap_or(Message::ConnectionStatus(false))
                 });
 
                 let history = Command::perform(self.get_history(), |res| {
                     res.map(|history| {
-                        Message::MainPanelMessage(mainpanel::Message::History(
-                            history::Message::Reload(history),
-                        ))
+                        Message::MainPanel(mainpanel::Message::History(history::Message::Reload(
+                            history,
+                        )))
                     })
                     .unwrap_or(Message::ConnectionStatus(false))
                 });
@@ -705,7 +699,7 @@ impl Application for Amadeus {
             }
 
             // Config changed
-            Message::ConfigMessage(config) => self.handle_config_message(config),
+            Message::Config(config) => self.handle_config_message(config),
             Message::ConfigLoaded => self.command_init_ping(),
             Message::ReconnectToLektord => Command::batch([
                 send(KaraStore::into_clear(self.kara_store.clone())),
@@ -723,7 +717,7 @@ impl Application for Amadeus {
             },
 
             // Change what the main panel displays + We have informations to pass to it
-            Message::MainPanelMessage(message) => self.mainpanel.update(message).map(Message::from),
+            Message::MainPanel(message) => self.mainpanel.update(message).map(Message::from),
             Message::MainPanelDisplay(MainPanelDisplay::Config) => {
                 self.show_main_panel = false;
                 Command::none()
@@ -736,7 +730,7 @@ impl Application for Amadeus {
             }
 
             // A message for the side panel.
-            Message::SidebarMessage(message) => self.sidebar.update(message),
+            Message::Sidebar(message) => self.sidebar.update(message),
             Message::SideBarResize(size) => {
                 self.sidebar_size = Some(size);
                 Command::none()
diff --git a/amadeus/src/components/config/mod.rs b/amadeus/src/components/config/mod.rs
index e0ef98f6b7e434d97f7d25ff8622dee2a7e6e769..2f43feff33aa7107bb2081fb733685a682b4a7ab 100644
--- a/amadeus/src/components/config/mod.rs
+++ b/amadeus/src/components/config/mod.rs
@@ -232,7 +232,7 @@ mod serde_utils {
             fn visit_u16<E: serde::de::Error>(self, v: u16) -> Result<Self::Value, E> { Ok(super::clamp_time_interval(v as i64)) }
             fn visit_i8 <E: serde::de::Error>(self, v: i8 ) -> Result<Self::Value, E> { Ok(super::clamp_time_interval(v as i64)) }
             fn visit_u8 <E: serde::de::Error>(self, v: u8 ) -> Result<Self::Value, E> { Ok(super::clamp_time_interval(v as i64)) }
-            fn visit_i64<E: serde::de::Error>(self, v: i64) -> Result<Self::Value, E> { Ok(super::clamp_time_interval(v as i64)) }
+            fn visit_i64<E: serde::de::Error>(self, v: i64) -> Result<Self::Value, E> { Ok(super::clamp_time_interval(v)) }
             fn visit_u64<E: serde::de::Error>(self, v: u64) -> Result<Self::Value, E> {
                 Ok(super::clamp_time_interval(v.clamp(0, i64::MAX as u64) as i64))
             }
@@ -548,7 +548,7 @@ impl State {
                 input!(text!     "User",        "user",  &self.config.connect.user.user  => UserChanged),
                 input!(password! "Token",       "token", &self.config.connect.user.token => TokenChanged),
                 input!(password! "Kurisu Token" token_link, KURISU_TOKEN_LINK,
-                   self.config.connect.kurisu_token.as_ref().map(|token| token.as_str()).unwrap_or_default()
+                   self.config.connect.kurisu_token.as_deref().unwrap_or_default()
                    => KurisuTokenChanged
                 ),
             ]],
diff --git a/amadeus/src/main.rs b/amadeus/src/main.rs
index d5ff63038bf992f27d1ed9d0cdec24d6491f05b8..948df8f3829aaa21911c76255fd3d890cfdb1287 100644
--- a/amadeus/src/main.rs
+++ b/amadeus/src/main.rs
@@ -38,7 +38,6 @@ mod style_sheet;
 use crate::{app::Amadeus, components::config::AmadeusConfig};
 use anyhow::{Context, Result};
 use lektor_utils::*;
-use style_sheet::sizes::SIZE_FONT_NORMAL;
 
 fn main() -> Result<()> {
     logger::init(Some(log::Level::Debug)).expect("failed to install logger");
@@ -53,7 +52,7 @@ fn main() -> Result<()> {
         id: Some("Amadeus".to_string()),
         flags: config,
         default_font: iced::font::Font::DEFAULT,
-        default_text_size: SIZE_FONT_NORMAL.into(),
+        default_text_size: style_sheet::sizes::SIZE_FONT_NORMAL.into(),
         antialiasing: false,
         exit_on_close_request: false,
 
diff --git a/amadeus/src/message.rs b/amadeus/src/message.rs
index 53bf7889c271dd01b1b8289357fd7a18b06e8ce0..142cee24f30a69f43a6e1973b6027bb2789bae47 100644
--- a/amadeus/src/message.rs
+++ b/amadeus/src/message.rs
@@ -67,7 +67,7 @@ pub enum Message {
 
     /// Got a message from the config componenent, the config could be changed, or we try to get
     /// informations on the server.
-    ConfigMessage(config::Message),
+    Config(config::Message),
 
     /// The config was loaded, can start rendering the application.
     ConfigLoaded,
@@ -98,7 +98,7 @@ pub enum Message {
     MainPanelRequest(mainpanel::Request),
 
     /// Message for the main panel, response to a request that was made by the main panel.
-    MainPanelMessage(mainpanel::Message),
+    MainPanel(mainpanel::Message),
 
     /// Request to refresh some informations from lektord.
     RefreshRequest(RefreshRequest),
@@ -107,7 +107,7 @@ pub enum Message {
     KaraRequest(kara::Request),
 
     /// A message for the sidebar.
-    SidebarMessage(sidebar::Message),
+    Sidebar(sidebar::Message),
 
     /// Toggle fullscreen.
     ToggleFullScreen,
@@ -285,7 +285,7 @@ impl From<topbar::Request> for Message {
 
 impl From<mainpanel::Message> for Message {
     fn from(value: mainpanel::Message) -> Self {
-        Message::MainPanelMessage(value)
+        Message::MainPanel(value)
     }
 }
 
@@ -305,7 +305,7 @@ impl From<sidebar::Request> for Message {
             ShowHistory => Message::MainPanelDisplay(MainPanel(mainpanel::Show::History)),
             ShowSettings => Message::MainPanelDisplay(Config),
             RefreshPlaylists => Message::RefreshRequest(RefreshRequest::Playlists),
-            Scrolled(x) => Message::SidebarMessage(sidebar::Message::Scrolled(x)),
+            Scrolled(x) => Message::Sidebar(sidebar::Message::Scrolled(x)),
             ShowPlaylist(x) => Message::from_iter([
                 Message::RefreshRequest(RefreshRequest::Playlist(x.clone())),
                 Message::MainPanelDisplay(MainPanel(mainpanel::Show::Playlist(x))),
@@ -316,7 +316,7 @@ impl From<sidebar::Request> for Message {
 
 impl From<sidebar::Message> for Message {
     fn from(value: sidebar::Message) -> Self {
-        Message::SidebarMessage(value)
+        Message::Sidebar(value)
     }
 }
 
@@ -342,14 +342,14 @@ impl From<config::Message> for Message {
         match value {
             config::Message::None => Message::None,
             config::Message::OpenLinkInBrowser(x) => Message::OpenLinkInBrowser(x),
-            value => Message::ConfigMessage(value),
+            value => Message::Config(value),
         }
     }
 }
 
 impl From<history::Message> for Message {
     fn from(value: history::Message) -> Self {
-        Self::MainPanelMessage(mainpanel::Message::History(value))
+        Self::MainPanel(mainpanel::Message::History(value))
     }
 }
 
@@ -361,7 +361,7 @@ impl From<history::Request> for Message {
 
 impl From<queue::Message> for Message {
     fn from(value: queue::Message) -> Self {
-        Self::MainPanelMessage(mainpanel::Message::Queue(value))
+        Self::MainPanel(mainpanel::Message::Queue(value))
     }
 }
 
@@ -373,7 +373,7 @@ impl From<queue::Request> for Message {
 
 impl From<search::Message> for Message {
     fn from(value: search::Message) -> Self {
-        Self::MainPanelMessage(mainpanel::Message::Search(value))
+        Self::MainPanel(mainpanel::Message::Search(value))
     }
 }
 
@@ -385,7 +385,7 @@ impl From<search::Request> for Message {
 
 impl From<playlists::Message> for Message {
     fn from(value: playlists::Message) -> Self {
-        Self::MainPanelMessage(mainpanel::Message::Playlists(value))
+        Self::MainPanel(mainpanel::Message::Playlists(value))
     }
 }
 
diff --git a/build/.gitignore b/build/.gitignore
deleted file mode 100644
index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000
--- a/build/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/lektor_mpris/src/server.rs b/lektor_mpris/src/server.rs
index e0200030a767de26dd8e6b54cadb2ed5599b4096..cc12e6b32c94f1c9b19c9fbac8e0e047c09fb195 100644
--- a/lektor_mpris/src/server.rs
+++ b/lektor_mpris/src/server.rs
@@ -3,7 +3,7 @@
 
 use crate::{types::*, AsMpris};
 use lektor_utils::log;
-use zbus::{dbus_interface, Connection, ConnectionBuilder, SignalContext as ZSignalCtx};
+use zbus::{Connection, ConnectionBuilder, SignalContext};
 
 /// The adapter for MPRIS.
 #[derive(Debug)]
@@ -81,62 +81,62 @@ struct Main {
     desktop_entry: String,
 }
 
-#[dbus_interface(name = "org.mpris.MediaPlayer2")]
+#[zbus::interface(name = "org.mpris.MediaPlayer2")]
 impl Main {
     /// Quit method
-    #[dbus_interface(name = "Quit")]
+    #[zbus(name = "Quit")]
     fn quit(&self) {}
 
     /// Raise method
-    #[dbus_interface(name = "Raise")]
+    #[zbus(name = "Raise")]
     fn raise(&self) {}
 
     /// CanQuit property
-    #[dbus_interface(property, name = "CanQuit")]
+    #[zbus(property, name = "CanQuit")]
     fn can_quit(&self) -> bool {
         false
     }
 
     /// CanRaise property
-    #[dbus_interface(property, name = "CanRaise")]
+    #[zbus(property, name = "CanRaise")]
     fn can_raise(&self) -> bool {
         false
     }
 
     /// CanSetFullscreen property
-    #[dbus_interface(property, name = "CanSetFullscreen")]
+    #[zbus(property, name = "CanSetFullscreen")]
     fn can_set_fullscreen(&self) -> bool {
         false
     }
 
     /// DesktopEntry property
-    #[dbus_interface(property, name = "DesktopEntry")]
+    #[zbus(property, name = "DesktopEntry")]
     fn desktop_entry(&self) -> &str {
         &self.desktop_entry
     }
 
     /// Fullscreen property
-    #[dbus_interface(property, name = "Fullscreen")]
+    #[zbus(property, name = "Fullscreen")]
     fn fullscreen(&self) -> bool {
         false
     }
-    #[dbus_interface(property, name = "Fullscreen")]
+    #[zbus(property, name = "Fullscreen")]
     fn set_fullscreen(&self, _value: bool) {}
 
     /// HasTrackList property
-    #[dbus_interface(property, name = "HasTrackList")]
+    #[zbus(property, name = "HasTrackList")]
     fn has_track_list(&self) -> bool {
         true
     }
 
     /// Identity property
-    #[dbus_interface(property, name = "Identity")]
+    #[zbus(property, name = "Identity")]
     fn identity(&self) -> &str {
         &self.identity
     }
 
     /// SupportedMimeTypes property
-    #[dbus_interface(property, name = "SupportedMimeTypes")]
+    #[zbus(property, name = "SupportedMimeTypes")]
     fn supported_mime_types(&self) -> Vec<&str> {
         vec!["video/mkv"]
     }
@@ -144,138 +144,138 @@ impl Main {
     /// SupportedUriSchemes property. It should be `id` and `file` for lektord.
     /// Here we support `file` for only files in the database to enable the user
     /// to search the kara folder and drop the files to play them imediatly.
-    #[dbus_interface(property, name = "SupportedUriSchemes")]
+    #[zbus(property, name = "SupportedUriSchemes")]
     fn supported_uri_schemes(&self) -> Vec<&str> {
         vec!["id", "file"]
     }
 }
 
-#[dbus_interface(name = "org.mpris.MediaPlayer2.Player")]
+#[zbus::interface(name = "org.mpris.MediaPlayer2.Player")]
 impl<T: AsMpris + Send + Sync + Clone + 'static> Player<T> {
     /// Next method
-    #[dbus_interface(name = "Next")]
+    #[zbus(name = "Next")]
     fn next(&self) {
         self.0.play_next()
     }
 
     /// Pause method
-    #[dbus_interface(name = "Pause")]
+    #[zbus(name = "Pause")]
     fn pause(&self) {
         self.0.set_playback_status(PlaybackStatus::Paused.into())
     }
 
     /// Play method
-    #[dbus_interface(name = "Play")]
+    #[zbus(name = "Play")]
     fn play(&self) {
         self.0.set_playback_status(PlaybackStatus::Playing.into())
     }
 
     /// OpenUri method
-    #[dbus_interface(name = "OpenUri")]
+    #[zbus(name = "OpenUri")]
     fn open_uri(&self, uri: &str) {
         self.0.play_file(uri)
     }
 
     /// Toggle play pause status.
-    #[dbus_interface(name = "PlayPause")]
+    #[zbus(name = "PlayPause")]
     fn play_pause(&self) {
         self.0.toggle_playback_status()
     }
 
     /// Previous method
-    #[dbus_interface(name = "Previous")]
+    #[zbus(name = "Previous")]
     fn previous(&self) {
         self.0.play_previous()
     }
 
     /// Seek method
-    #[dbus_interface(name = "Seek")]
+    #[zbus(name = "Seek")]
     fn seek(&self, offset: TimeMicroSec) {
         let position = self.0.position().into() + offset;
         self.0.seek(None, position.into());
     }
 
     /// SetPosition method
-    #[dbus_interface(name = "SetPosition")]
+    #[zbus(name = "SetPosition")]
     fn set_position(&self, track_id: ObjectPath, position: TimeMicroSec) {
         self.0.seek(Some(track_id.into()), position.into());
     }
 
     /// Stop method
-    #[dbus_interface(name = "Stop")]
+    #[zbus(name = "Stop")]
     fn stop(&self) {
         log::warn!("ignore stop command")
     }
 
     /// CanControl property
-    #[dbus_interface(property, name = "CanControl")]
+    #[zbus(property, name = "CanControl")]
     fn can_control(&self) -> bool {
         true
     }
 
     /// CanPause property
-    #[dbus_interface(property, name = "CanPause")]
+    #[zbus(property, name = "CanPause")]
     fn can_pause(&self) -> bool {
         true
     }
 
     /// CanPlay property
-    #[dbus_interface(property, name = "CanPlay")]
+    #[zbus(property, name = "CanPlay")]
     fn can_play(&self) -> bool {
         true
     }
 
     /// CanSeek property
-    #[dbus_interface(property, name = "CanSeek")]
+    #[zbus(property, name = "CanSeek")]
     fn can_seek(&self) -> bool {
         false
     }
 
     /// LoopStatus property
-    #[dbus_interface(property, name = "LoopStatus")]
+    #[zbus(property, name = "LoopStatus")]
     fn loop_status(&self) -> LoopStatus {
         LoopStatus::None
     }
-    #[dbus_interface(property, name = "LoopStatus")]
+    #[zbus(property, name = "LoopStatus")]
     fn set_loop_status(&self, loop_status: LoopStatus) {
         log::warn!("ignore loop status {loop_status:?}")
     }
 
-    #[rustfmt::skip] #[dbus_interface(property, name = "MaximumRate")]    fn maximum_rate(&self) -> f64 { 1.0 }
-    #[rustfmt::skip] #[dbus_interface(property, name = "MinimumRate")]    fn minimum_rate(&self) -> f64 { 1.0 }
-    #[rustfmt::skip] #[dbus_interface(property, name = "MaximumRate")]    fn set_maximum_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
-    #[rustfmt::skip] #[dbus_interface(property, name = "MinimumRate")]    fn set_minimum_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
-    #[rustfmt::skip] #[dbus_interface(property, name = "Rate"       )]    fn rate(&self) -> f64 { 1.0 }
-    #[rustfmt::skip] #[dbus_interface(property, name = "Rate"       )]    fn set_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
+    #[rustfmt::skip] #[zbus(property, name = "MaximumRate")]    fn maximum_rate(&self) -> f64 { 1.0 }
+    #[rustfmt::skip] #[zbus(property, name = "MinimumRate")]    fn minimum_rate(&self) -> f64 { 1.0 }
+    #[rustfmt::skip] #[zbus(property, name = "MaximumRate")]    fn set_maximum_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
+    #[rustfmt::skip] #[zbus(property, name = "MinimumRate")]    fn set_minimum_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
+    #[rustfmt::skip] #[zbus(property, name = "Rate"       )]    fn rate(&self) -> f64 { 1.0 }
+    #[rustfmt::skip] #[zbus(property, name = "Rate"       )]    fn set_rate(&self, rate: f64) { log::warn!("ignore rate {rate}") }
 
     /// Shuffle property
-    #[dbus_interface(property, name = "Shuffle")]
+    #[zbus(property, name = "Shuffle")]
     fn shuffle(&self) -> bool {
         self.0.shuffle()
     }
-    #[dbus_interface(property, name = "Shuffle")]
+    #[zbus(property, name = "Shuffle")]
     fn set_shuffle(&self, shuffle: bool) {
         self.0.set_shuffle(shuffle);
     }
 
     /// Volume property
-    #[dbus_interface(property, name = "Volume")]
+    #[zbus(property, name = "Volume")]
     fn volume(&self) -> f64 {
         self.0.volume()
     }
-    #[dbus_interface(property, name = "Volume")]
+    #[zbus(property, name = "Volume")]
     fn set_volume(&self, volume: f64) {
         self.0.set_volume(volume)
     }
 
     /// PlaybackStatus property
-    #[dbus_interface(property, name = "PlaybackStatus")]
+    #[zbus(property, name = "PlaybackStatus")]
     fn playback_status(&self) -> PlaybackStatus {
         self.0.get_playback_status().into()
     }
 
     /// Position property
-    #[dbus_interface(property, name = "Position")]
+    #[zbus(property, name = "Position")]
     fn position(&self) -> TimeMicroSec {
         self.0.position().into()
     }
@@ -283,22 +283,22 @@ impl<T: AsMpris + Send + Sync + Clone + 'static> Player<T> {
     /// Metadata property. If there is a current kara playing, there must be at
     /// least a `mpris:trackid` value of type `o` which is the object path of
     /// the current kara id.
-    #[dbus_interface(property, name = "Metadata")]
+    #[zbus(property, name = "Metadata")]
     fn metadata(&self) -> TrackMetadata {
         self.0.get_current_metadata().into()
     }
 }
 
-#[dbus_interface(name = "org.mpris.MediaPlayer2.TrackList")]
+#[zbus::interface(name = "org.mpris.MediaPlayer2.TrackList")]
 impl<T: AsMpris + Send + Sync + Clone + 'static> TrackList<T> {
     /// AddTrack method
-    #[dbus_interface(name = "AddTrack")]
+    #[zbus(name = "AddTrack")]
     fn add_track(&self, uri: &str, after: ObjectPath, set_as_current: bool) {
         self.0.add_track(uri, after.into(), set_as_current)
     }
 
     /// GetTracksMetadata method
-    #[dbus_interface(name = "GetTracksMetadata")]
+    #[zbus(name = "GetTracksMetadata")]
     fn get_tracks_metadata(&self, tracks_ids: Vec<ObjectPath>) -> Vec<TrackMetadata> {
         let tracks = tracks_ids.into_iter().map(From::from).collect();
         self.0
@@ -309,25 +309,25 @@ impl<T: AsMpris + Send + Sync + Clone + 'static> TrackList<T> {
     }
 
     /// GoTo method
-    #[dbus_interface(name = "GoTo")]
+    #[zbus(name = "GoTo")]
     fn go_to(&self, track_id: ObjectPath) {
         self.0.go_to(track_id.into())
     }
 
     /// RemoveTrack method
-    #[dbus_interface(name = "RemoveTrack")]
+    #[zbus(name = "RemoveTrack")]
     fn remove_track(&self, track_id: ObjectPath) {
         self.0.remove_track(track_id.into())
     }
 
     /// CanEditTracks property
-    #[dbus_interface(property, name = "CanEditTracks")]
+    #[zbus(property, name = "CanEditTracks")]
     fn can_edit_tracks(&self) -> bool {
         true
     }
 
     /// Tracks property
-    #[dbus_interface(property, name = "Tracks")]
+    #[zbus(property, name = "Tracks")]
     fn tracks(&self) -> Vec<ObjectPath> {
         self.0
             .get_queue_content()
@@ -337,33 +337,33 @@ impl<T: AsMpris + Send + Sync + Clone + 'static> TrackList<T> {
     }
 
     /// TrackAdded signal
-    #[dbus_interface(signal, name = "TrackAdded")]
+    #[zbus(signal, name = "TrackAdded")]
     async fn track_added(
-        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        #[zbus(signal_context)] ctxt: SignalContext<'_>,
         metadata: TrackMetadata,
         after: ObjectPath,
     ) -> zbus::Result<()>;
 
     /// TrackListReplaced signal
-    #[dbus_interface(signal, name = "TrackListReplaced")]
+    #[zbus(signal, name = "TrackListReplaced")]
     async fn track_list_replaced(
-        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        #[zbus(signal_context)] ctxt: SignalContext<'_>,
         tracks: Vec<ObjectPath>,
         current: ObjectPath,
     ) -> zbus::Result<()>;
 
     /// TrackMetadataChanged signal
-    #[dbus_interface(signal, name = "TrackMetadataChanged")]
+    #[zbus(signal, name = "TrackMetadataChanged")]
     async fn track_metadata_changed(
-        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        #[zbus(signal_context)] ctxt: SignalContext<'_>,
         track_id: ObjectPath,
         metadata: TrackMetadata,
     ) -> zbus::Result<()>;
 
     /// TrackRemoved signal
-    #[dbus_interface(signal, name = "TrackRemoved")]
+    #[zbus(signal, name = "TrackRemoved")]
     async fn track_removed(
-        #[zbus(signal_context)] ctxt: ZSignalCtx<'_>,
+        #[zbus(signal_context)] ctxt: SignalContext<'_>,
         track_id: ObjectPath,
     ) -> zbus::Result<()>;
 }
diff --git a/lektor_mpris/src/types.rs b/lektor_mpris/src/types.rs
index 350c0b18b16810554d9e7f81cfb7473c1dd7d552..93afd3dee889d203d5cdcfb421841721eb1f0e3a 100644
--- a/lektor_mpris/src/types.rs
+++ b/lektor_mpris/src/types.rs
@@ -66,6 +66,12 @@ pub enum ObjectPath {
 
 // Implementations
 
+impl TimeMicroSec {
+    pub fn as_micro_sec(&self) -> i64 {
+        self.0
+    }
+}
+
 impl FromIterator<(String, String)> for TrackMetadata {
     fn from_iter<T: IntoIterator<Item = (String, String)>>(iter: T) -> Self {
         Self(iter.into_iter().collect())
@@ -130,34 +136,23 @@ impl From<ZValue<'_>> for ObjectPath {
 
 impl From<ObjectPath> for ZValue<'_> {
     fn from(value: ObjectPath) -> Self {
-        let string = 'string: {
-            use ObjectPath::*;
-            return ZValue::ObjectPath(
-                match value {
-                    // Static things
-                    NoTrack => ZObjectPath::try_from("/org/mpris/MediaPlayer2/TrackList/NoTrack"),
-                    None => ZObjectPath::try_from("/org/lektor/MPRIS/None"),
-
-                    // Formated as strings
-                    Id(id) => break 'string format!("/org/lektor/MPRIS/Id/{id}"),
-                    Position(position) => {
-                        break 'string format!("/org/lektor/MPRIS/Position/{position}")
-                    }
-                }
-                .expect("incorrect serialization"),
-            );
+        use ObjectPath::*;
+        let path = match value {
+            None => "/org/lektor/MPRIS/None".try_into(),
+            NoTrack => "/org/mpris/MediaPlayer2/TrackList/NoTrack".try_into(),
+            Id(id) => format!("/org/lektor/MPRIS/Id/{id}").try_into(),
+            Position(position) => format!("/org/lektor/MPRIS/Position/{position}").try_into(),
         };
-        ZValue::ObjectPath(ZObjectPath::try_from(string).expect("incorrect serialization"))
+        ZValue::ObjectPath(path.expect("incorrect serialization"))
     }
 }
 
 impl From<LoopStatus> for ZValue<'_> {
     fn from(value: LoopStatus) -> Self {
-        use LoopStatus::*;
         match value {
-            None => "None",
-            Track => "Track",
-            Playlist => "Playlist",
+            LoopStatus::None => "None",
+            LoopStatus::Track => "Track",
+            LoopStatus::Playlist => "Playlist",
         }
         .into()
     }
@@ -165,11 +160,10 @@ impl From<LoopStatus> for ZValue<'_> {
 
 impl From<PlaybackStatus> for ZValue<'_> {
     fn from(value: PlaybackStatus) -> Self {
-        use PlaybackStatus::*;
         match value {
-            Paused => "Paused",
-            Playing => "Playing",
-            Stopped => "Stopped",
+            PlaybackStatus::Paused => "Paused",
+            PlaybackStatus::Playing => "Playing",
+            PlaybackStatus::Stopped => "Stopped",
         }
         .into()
     }
diff --git a/lektor_utils/src/logger.rs b/lektor_utils/src/logger.rs
index 2d8b74a95623290b8987a1e69359f216f5aae9c6..4807d78175e4b4e3bc16dea72e7d0dd993a08d84 100644
--- a/lektor_utils/src/logger.rs
+++ b/lektor_utils/src/logger.rs
@@ -1,30 +1,50 @@
-use log::{Level, Metadata, Record, SetLoggerError};
-use std::{borrow::Cow, sync::atomic::AtomicU8};
+//! Small and simple implementation of a logger, don't need too much stuff like tracing and
+//! others...
 
-struct SimpleLogger {
-    level: AtomicU8,
-}
+use anyhow::anyhow;
+use log::{Level, LevelFilter, Metadata, Record};
+use std::{
+    borrow::Cow,
+    sync::atomic::{AtomicU8, Ordering},
+};
 
+/// Simple logger!
+///
+/// We will print to stdout and filter levels by their assigned number.
 #[repr(transparent)]
-struct SimpleLoggerRef {
-    pub inner: SimpleLogger,
-}
+struct SimpleLogger(AtomicU8);
 
-static LOGGER: SimpleLoggerRef = SimpleLoggerRef {
-    inner: SimpleLogger {
-        level: AtomicU8::new(0),
-    },
-};
+/// Ze logger!
+static LOGGER: SimpleLogger = SimpleLogger(AtomicU8::new(0));
 
 impl SimpleLogger {
-    fn level(&self) -> Level {
-        // Always display errors and warnings.
-        match self.level.load(std::sync::atomic::Ordering::SeqCst) {
+    /// Get the level filter for the logger.
+    fn level(&self) -> LevelFilter {
+        match self.0.load(Ordering::SeqCst) {
             0 => Level::Warn,
             1 => Level::Info,
             2 => Level::Debug,
             _ => Level::Trace,
         }
+        .to_level_filter()
+    }
+
+    /// Set the level by a flag.
+    fn set_enum(&self, lvl: Level) -> LevelFilter {
+        self.set_int(match lvl {
+            Level::Trace => 3,
+            Level::Debug => 2,
+            Level::Info => 1,
+            Level::Warn | Level::Error => 0,
+        })
+    }
+
+    /// Set the level by a verbose count.
+    fn set_int(&self, lvl: u8) -> LevelFilter {
+        self.0.store(lvl, Ordering::SeqCst);
+        let lvl = self.level();
+        log::set_max_level(lvl);
+        lvl
     }
 }
 
@@ -58,29 +78,20 @@ impl log::Log for SimpleLogger {
     fn flush(&self) {}
 }
 
+/// Set the log level with a flag.
 pub fn level(lvl: Level) {
-    level_int(match lvl {
-        Level::Trace => 3,
-        Level::Debug => 2,
-        Level::Info => 1,
-        Level::Warn | Level::Error => 0,
-    })
+    LOGGER.set_enum(lvl);
 }
 
-pub fn level_int(lvl: u8) {
-    let seqcst = std::sync::atomic::Ordering::SeqCst;
-    LOGGER.inner.level.store(lvl, seqcst);
-    log::set_max_level(LOGGER.inner.level().to_level_filter());
+/// Same as [self::level], but as a verbose level.
+pub fn verbose(lvl: u8) {
+    LOGGER.set_int(lvl);
 }
 
-pub fn init(lvl: Option<Level>) -> Result<(), SetLoggerError> {
-    log::set_logger(&LOGGER.inner).map(|()| {
-        log::set_max_level(match lvl {
-            None => LOGGER.inner.level().to_level_filter(),
-            Some(lvl) => {
-                level(lvl);
-                lvl.to_level_filter()
-            }
-        });
-    })
+/// Init the logger.
+pub fn init(lvl: Option<Level>) -> anyhow::Result<()> {
+    log::set_logger(&LOGGER).map_err(|err| anyhow!("failed to install logger: {err}"))?;
+    lvl.map(level)
+        .unwrap_or_else(|| log::set_max_level(LOGGER.level()));
+    Ok(())
 }
diff --git a/lektord/Cargo.toml b/lektord/Cargo.toml
index b5c77dff441279ac718ffc4cde4477a3c3569635..682aeef6b66033d11f270a6bf1e7268708c9a36b 100644
--- a/lektord/Cargo.toml
+++ b/lektord/Cargo.toml
@@ -13,12 +13,17 @@ serde_json.workspace = true
 
 rand.workspace = true
 anyhow.workspace = true
+hashbrown.workspace = true
 
 futures.workspace = true
+async-trait.workspace = true
+
 axum.workspace = true
 tokio.workspace = true
+tokio-stream.workspace = true
 hyper.workspace = true
-async-trait.workspace = true
+hyper-util.workspace = true
+tower.workspace = true
 
 clap.workspace = true
 
diff --git a/lektord/build.rs b/lektord/build.rs
index eb01e8cce5495cd9aa2afcc6e7bb20afbadcf500..819be18a7585d179dcca23957eda8431ed875bdc 100644
--- a/lektord/build.rs
+++ b/lektord/build.rs
@@ -19,9 +19,8 @@ macro_rules! cmd {
                 "command failed with:\n{}",
                 std::str::from_utf8(&stderr[..]).unwrap().trim()
             );
-        } else {
-            (stdout, stderr)
         }
+        (stdout, stderr)
     }};
 }
 
diff --git a/lektord/src/app/mod.rs b/lektord/src/app/mod.rs
index 74cfc9dd26de33342af7a7bb7b9c8d9fbb69596f..b0c20a484a8a8a03f8862041ca4bd8c04334ee42 100644
--- a/lektord/src/app/mod.rs
+++ b/lektord/src/app/mod.rs
@@ -8,14 +8,12 @@ mod routes;
 use crate::LektorConfig;
 use anyhow::{anyhow, Context, Result};
 use axum::{
-    http::{Request, StatusCode},
+    extract::Request,
+    http::{response, StatusCode},
     middleware::Next,
-    response::IntoResponse,
-    response::Response,
+    response::{IntoResponse, Response},
     routing::{delete, get, post, put},
-    Router,
 };
-use hyper::body::HttpBody;
 use lektor_mpris::MPRISAdapter;
 use lektor_nkdb::{Database, DatabaseDiskStorage};
 use lektor_payloads::LektorUser;
@@ -26,14 +24,17 @@ use tokio::sync::{oneshot::Sender, RwLock};
 
 /// Create the application to serve. Place it into a different function to be able to test it with
 /// the tokio test framework.
-pub async fn app(config: LektorConfig) -> Result<(Router, tokio::sync::oneshot::Receiver<()>)> {
+pub async fn app(
+    config: LektorConfig,
+) -> Result<(axum::Router, tokio::sync::oneshot::Receiver<()>)> {
     /// Try to declare the routes in a more legible way without having an ugly formating.
     macro_rules! router {
         (
             $($str: literal -> $($what: ident: $func: path),+);+
         ) => {
             router! {
-                Router::new(); $($str -> $($what: $func),+);+
+                axum::Router::new();
+                $($str -> $($what: $func),+);+
             }
         };
 
@@ -117,21 +118,23 @@ pub async fn app(config: LektorConfig) -> Result<(Router, tokio::sync::oneshot::
 }
 
 /// Log requests and their responsces if they failed.
-async fn log_requests<B>(request: Request<B>, next: Next<B>) -> Response {
-    let msg = format!("{}@{}", request.method(), request.uri());
-    log::trace!("got request: {msg}");
-    let mut response = next.run(request).await;
-    if !response.status().is_success() {
-        match response.body_mut().data().await {
-            Some(Ok(data)) => match std::str::from_utf8(&data) {
-                Ok(data) => log::warn!("request {msg} failed with: {data}"),
-                Err(_) => log::warn!("request {msg} failed with {}B non utf8 data", data.len()),
-            },
-            Some(Err(err)) => log::warn!("request {msg} failed with error: {err:?}"),
-            None => log::warn!("request {msg} failed without any additional informations"),
-        }
+async fn log_requests(request: Request, next: Next) -> Response {
+    let msg = format!("request {}@{}", request.method(), request.uri());
+    log::trace!("got {msg}");
+
+    let (parts @ response::Parts { status, .. }, body) = next.run(request).await.into_parts();
+    if status.is_success() {
+        return Response::from_parts(parts, body);
+    }
+
+    match axum::body::to_bytes(body, usize::MAX).await {
+        Err(error) => log::warn!("{msg} failed with {status}: {error}"),
+        Ok(data) => match std::str::from_utf8(&data) {
+            Ok(error) => log::warn!("{msg} failed with {status}: {error}"),
+            Err(_) => log::warn!("{msg} failed with {status} and non-utf8 data blob"),
+        },
     }
-    response
+    StatusCode::BAD_REQUEST.into_response()
 }
 
 /// The state of the internal server
diff --git a/lektord/src/app/mpris.rs b/lektord/src/app/mpris.rs
index 27e25be74c9de2902018024720dc623de0d68a43..aca188775853274ae671f8e1e21ca7f4b60d9024 100644
--- a/lektord/src/app/mpris.rs
+++ b/lektord/src/app/mpris.rs
@@ -1,8 +1,7 @@
-use std::sync::Arc;
-
 use crate::LektorStateWeakPtr;
 use lektor_mpris::AsMpris;
 use lektor_nkdb::Kara;
+use std::sync::Arc;
 
 /// The play state, convertible to the thing liked by MPRIS.
 pub struct PlayState(lektor_nkdb::PlayState);
@@ -96,33 +95,62 @@ impl AsMpris for LektorStateWeakPtr {
     }
 }
 
+impl From<PlayState> for lektor_nkdb::PlayState {
+    fn from(PlayState(value): PlayState) -> Self {
+        value
+    }
+}
+
 impl From<lektor_mpris::types::PlaybackStatus> for PlayState {
-    fn from(_value: lektor_mpris::types::PlaybackStatus) -> Self {
-        todo!()
+    fn from(value: lektor_mpris::types::PlaybackStatus) -> Self {
+        use {lektor_mpris::types::PlaybackStatus, lektor_nkdb::PlayState};
+        match value {
+            PlaybackStatus::Stopped => Self(PlayState::Stop),
+            PlaybackStatus::Playing => Self(PlayState::Play),
+            PlaybackStatus::Paused => Self(PlayState::Pause),
+        }
     }
 }
 
 impl From<PlayState> for lektor_mpris::types::PlaybackStatus {
-    fn from(_value: PlayState) -> Self {
-        todo!()
+    fn from(PlayState(value): PlayState) -> Self {
+        match value {
+            lektor_nkdb::PlayState::Stop => Self::Stopped,
+            lektor_nkdb::PlayState::Play => Self::Playing,
+            lektor_nkdb::PlayState::Pause => Self::Paused,
+        }
     }
 }
 
 impl From<lektor_mpris::types::TimeMicroSec> for Time {
-    fn from(_value: lektor_mpris::types::TimeMicroSec) -> Self {
-        todo!()
+    fn from(value: lektor_mpris::types::TimeMicroSec) -> Self {
+        Time(value.as_micro_sec().clamp(0, i64::MAX) as u64)
     }
 }
 
 impl From<Time> for lektor_mpris::types::TimeMicroSec {
-    fn from(_value: Time) -> Self {
-        todo!()
+    fn from(value: Time) -> Self {
+        (value.0.clamp(0, i64::MAX as u64) as i64).into()
     }
 }
 
 impl From<TrackMdt> for lektor_mpris::types::TrackMetadata {
-    fn from(_value: TrackMdt) -> Self {
-        todo!()
+    fn from(TrackMdt(kara): TrackMdt) -> Self {
+        let mut kara_makers: Vec<_> = kara.kara_makers.iter().cloned().collect();
+        kara_makers.sort();
+        let kara_makers = kara_makers.join(", ");
+
+        let mut language: Vec<_> = kara.language.iter().cloned().collect();
+        language.sort();
+        let language = language.join(", ");
+
+        lektor_mpris::types::TrackMetadata::from_iter([
+            ("Song Title".to_string(), kara.song_title.clone()),
+            ("Song Source".to_string(), kara.song_source.clone()),
+            ("Sont Type".to_string(), kara.song_type.to_string()),
+            ("Kara Makers".to_string(), kara_makers),
+            ("Languages".to_string(), language),
+        ])
     }
 }
 
diff --git a/lektord/src/app/routes.rs b/lektord/src/app/routes.rs
index 5b8d0d9b79871c2235437f133bb1f296fc267d2a..5c4364e0f3ee98de587fe9931cf7d74a703cbce8 100644
--- a/lektord/src/app/routes.rs
+++ b/lektord/src/app/routes.rs
@@ -9,11 +9,10 @@ use crate::*;
 use anyhow::{anyhow, Error};
 use axum::{
     extract::{Path, State},
-    http::{HeaderValue, StatusCode},
+    http::{header::CONTENT_TYPE, HeaderValue, StatusCode},
     response::{IntoResponse, Response},
     Json,
 };
-use hyper::header::CONTENT_TYPE;
 use lektor_nkdb::*;
 use lektor_payloads::*;
 use lektor_utils::{decode_base64_json, log};
diff --git a/lektord/src/listen.rs b/lektord/src/listen.rs
deleted file mode 100644
index c359694e6c8cee5cf63540cafc93b44d9dffc5a9..0000000000000000000000000000000000000000
--- a/lektord/src/listen.rs
+++ /dev/null
@@ -1,59 +0,0 @@
-//! Stuff to listen from multiple addresses. Only TCP for now, see latter how to do UNIX domain
-//! sockets...
-
-#![forbid(unsafe_code)]
-
-use anyhow::Result;
-use hyper::server::{accept::Accept, conn::AddrIncoming};
-use lektor_utils::*;
-use std::{
-    net::SocketAddr,
-    pin::Pin,
-    task::{Context, Poll},
-};
-
-/// Get the addr list to listen to, can be dirrectly passed to the bind function of the axum
-/// server struct.
-#[derive(Debug)]
-pub struct AddrIncomingCombined(Vec<AddrIncoming>);
-
-impl<'a> FromIterator<&'a SocketAddr> for AddrIncomingCombined {
-    fn from_iter<T: IntoIterator<Item = &'a SocketAddr>>(iter: T) -> Self {
-        let print_err = |err| log::error!("failed to bind address: {err}");
-        let iter = iter
-            .into_iter()
-            .flat_map(|addr| AddrIncoming::bind(addr).map_err(print_err).ok());
-        Self(iter.collect())
-    }
-}
-
-impl AddrIncomingCombined {
-    pub fn err(self) -> Result<Self> {
-        match &self.0[..] {
-            [] => anyhow::bail!("no address to listen to"),
-            addrs => {
-                let sockets: Vec<_> = addrs.iter().map(|addr| addr.local_addr()).collect();
-                log::debug!("listening on {sockets:?}");
-                Ok(self)
-            }
-        }
-    }
-}
-
-impl Accept for AddrIncomingCombined {
-    type Conn = <AddrIncoming as Accept>::Conn;
-    type Error = <AddrIncoming as Accept>::Error;
-
-    fn poll_accept(
-        mut self: Pin<&mut Self>,
-        cx: &mut Context<'_>,
-    ) -> std::task::Poll<Option<Result<Self::Conn, Self::Error>>> {
-        for conn in &mut self.0 {
-            if let Poll::Ready(Some(value)) = Pin::new(conn).poll_accept(cx) {
-                return Poll::Ready(Some(value));
-            }
-        }
-
-        Poll::Pending
-    }
-}
diff --git a/lektord/src/main.rs b/lektord/src/main.rs
index 1c698749fe2508faed212daf9038ee8b20b20b59..f1d72a3278a4744a679baa16c6e69cf732f88e30 100644
--- a/lektord/src/main.rs
+++ b/lektord/src/main.rs
@@ -3,27 +3,37 @@ pub mod c_wrapper;
 mod cmd;
 mod config;
 mod error;
-mod listen;
 
 include!(concat!(env!("OUT_DIR"), "/lektord_build_infos.rs"));
 
-use crate::{app::*, config::*, error::*, listen::*};
+use crate::{app::*, config::*, error::*};
 use anyhow::{Context, Result};
 use cmd::SubCommand;
+use futures::{stream::FuturesUnordered, TryStreamExt as _};
 use lektor_utils::*;
+
+// Server things
+
+use hyper::service::service_fn;
+use hyper_util::{
+    rt::{TokioExecutor, TokioIo},
+    server::conn::auto::Builder as ServerBuilder,
+};
+use std::net::SocketAddr;
 use std::sync::atomic::{AtomicU64, Ordering};
-use tokio::{signal, sync::oneshot::Receiver};
+use tokio::{net::TcpListener, signal, sync::oneshot::Receiver};
+use tower::Service;
 
 fn main() -> Result<()> {
-    logger::init(Some(log::Level::Debug)).expect("failed to install logger");
+    logger::init(Some(log::Level::Debug))?;
     #[cfg(target_os = "linux")]
     appimage::detect_appimage()?;
 
     let config = lektor_utils::config::get_or_write_default_config::<LektorConfig>("lektord")?;
     let args = <cmd::Args as clap::Parser>::parse();
-    lektor_utils::logger::level(config.log);
+    logger::level(config.log);
     if args.verbose != 0 {
-        lektor_utils::logger::level_int(args.verbose);
+        logger::verbose(args.verbose);
     }
 
     match args.action.unwrap_or_default() {
@@ -39,41 +49,79 @@ fn main() -> Result<()> {
             args => unreachable!("{args:#?}"),
         },
 
-        SubCommand::Start => {
-            log::info!("starting the lektord daemon");
-            tokio::runtime::Builder::new_multi_thread()
-                .worker_threads(config.workers) // Thread count from the config file.
-                .thread_name_fn(|| {
-                    static COUNT: AtomicU64 = AtomicU64::new(0);
-                    format!("lektord-{}", COUNT.fetch_add(1, Ordering::SeqCst))
-                })
-                .enable_all()
-                .thread_stack_size(3 * 1024 * 1024) // 3Mio for each thread, should be enaugh
-                .build()?
-                .block_on(async move {
-                    lektor_utils::config::write_config_async("lektord", config.clone()).await?; // Write to apply changes...
-                    let addrs = AddrIncomingCombined::from_iter(&config.listen).err()?;
-                    let (app, shutdown) = app(config)
-                        .await
-                        .with_context(|| "failed to build service")?;
-                    hyper::Server::builder(addrs)
-                        .serve(app.into_make_service())
-                        .with_graceful_shutdown(shutdown_signal(shutdown))
-                        .await?;
-                    Ok(())
-                })
-        }
+        SubCommand::Start => tokio::runtime::Builder::new_multi_thread()
+            .worker_threads(config.workers) // Thread count from the config file.
+            .thread_name_fn(|| {
+                static COUNT: AtomicU64 = AtomicU64::new(0);
+                format!("lektord-{}", COUNT.fetch_add(1, Ordering::SeqCst))
+            })
+            .enable_all()
+            .thread_stack_size(3 * 1024 * 1024) // 3Mio for each thread, should be enaugh
+            .build()?
+            .block_on(launch_server(config)),
 
         args => unreachable!("{args:?}"),
     }
 }
 
+/// Launches the server, for each socket to listen to we have one task. We do that to be able to
+/// handle each sockets in a concurrent way.
+async fn launch_server(config: LektorConfig) -> Result<()> {
+    // Write to apply any changes...
+    log::info!("starting the lektord daemon");
+    lektor_utils::config::write_config_async("lektord", config.clone()).await?;
+
+    // Init the application.
+    let addrs = config.listen.clone();
+    let (app, shutdown) = app(config).await.context("failed to build service")?;
+
+    // Launch an instance for each socket to listen to.
+    FuturesUnordered::from_iter(addrs.into_iter().map(|listen| async move {
+        TcpListener::bind(listen)
+            .await
+            .map(|socket| (listen, socket))
+            .with_context(|| format!("failed to bind to {listen}"))
+    }))
+    .try_collect::<Vec<_>>()
+    .await?
+    .into_iter()
+    .for_each(|(addr, socket)| {
+        tokio::spawn(server_instance(addr, socket, app.clone()));
+    });
+
+    // Wait for terminazon...
+    shutdown_signal(shutdown).await;
+    Ok(())
+}
+
+/// Have the instance of the server for one socket that we listen to. For each client we will
+/// create a new task to be able to handle clients concurrently for one socket.
+async fn server_instance(addr: SocketAddr, socket: TcpListener, app: axum::Router) {
+    loop {
+        let Ok((stream, client)) = socket.accept().await else {
+            log::error!("failed to accept socket at {addr}");
+            return;
+        };
+        let app = app.clone(); // One thread per client, they all share the same state!
+        tokio::spawn(async move {
+            ServerBuilder::new(TokioExecutor::new())
+                .serve_connection(
+                    TokioIo::new(stream),
+                    service_fn(move |req| app.clone().call(req)),
+                )
+                .await
+                .inspect_err(|err| log::error!("failed to serve {client} from {addr}: {err}"))
+        });
+    }
+}
+
 /// Gracefull ctrl+c handling.
 async fn shutdown_signal(shutdown: Receiver<()>) {
     let shutdown = async {
         let _ = shutdown.await;
         log::info!("shutdown signal!")
     };
+
     let ctrl_c = async {
         signal::ctrl_c()
             .await
diff --git a/lkt/src/main.rs b/lkt/src/main.rs
index 4d550b13e27a88d1eaa268bc794d8d6b79b49f52..07f68aa916b35f667a381085b83985bec7b1a038 100644
--- a/lkt/src/main.rs
+++ b/lkt/src/main.rs
@@ -38,8 +38,8 @@ fn main() -> Result<()> {
     }
 
     let config = lektor_utils::config::get_or_write_default_config::<LktConfig>("lkt")?;
-    lektor_utils::logger::level(config.log);
-    lektor_utils::logger::level_int(args.verbose);
+    logger::level(config.log);
+    logger::verbose(args.verbose);
     tokio::runtime::Builder::new_current_thread()
         .enable_all()
         .build()?
diff --git a/utils/scripts/docker/setup_cross.bash b/utils/scripts/docker/setup_cross.bash
index a56aeffcb0bed8a424c4231cebd8ad649919decd..116c8f1a89a65e640501a00706cdfe58b90e8497 100755
--- a/utils/scripts/docker/setup_cross.bash
+++ b/utils/scripts/docker/setup_cross.bash
@@ -4,10 +4,11 @@ set -xe
 PKG_BASE="imagemagick make ninja git binutils patch base-devel unzip protobuf"
 PKG_MINGW="mingw-w64-binutils mingw-w64-crt mingw-w64-gcc mingw-w64-headers mingw-w64-winpthreads"
 
-AUR_BOOTSTRAP_MINGW="mingw-w64-x264-bootstrap mingw-w64-headers-bootstrap mingw-w64-freetype2-bootstrap mingw-w64-cairo-bootstrap "
+AUR_BOOTSTRAP_MINGW="mingw-w64-headers-bootstrap mingw-w64-freetype2-bootstrap mingw-w64-cairo-bootstrap "
 AUR_BOOTSTRAP_MINGW+="mingw-w64-cmake mingw-w64-extra-cmake-modules mingw-w64-make mingw-w64-configure mingw-w64-meson mingw-w64-pkg-config "
+AUR_BOOTSTRAP_MINGW+="mingw-w64-spirv-headers mingw-w64-spirv-tools "
 
-AUR_MINGW="mingw-w64-mpv mingw-w64-bzip2 mingw-w64-expat mingw-w64-fontconfig mingw-w64-freeglut mingw-w64-freetype2 "
+AUR_MINGW="mingw-w64-x264 mingw-w64-mpv mingw-w64-bzip2 mingw-w64-expat mingw-w64-fontconfig mingw-w64-freeglut mingw-w64-freetype2 "
 AUR_MINGW+="mingw-w64-libdbus mingw-w64-libiconv mingw-w64-libjpeg-turbo mingw-w64-libpng mingw-w64-libtiff mingw-w64-libxml2 "
 AUR_MINGW+="mingw-w64-openssl mingw-w64-openjpeg mingw-w64-openjpeg2 mingw-w64-pcre mingw-w64-pdcurses mingw-w64-protobuf "
 AUR_MINGW+="mingw-w64-readline mingw-w64-sdl2 mingw-w64-termcap mingw-w64-tools mingw-w64-zlib mingw-w64-gettext "