diff --git a/indexing-and-querying-code/Cargo.lock b/indexing-and-querying-code/Cargo.lock
index a2487f6..fc6bc1a 100644
--- a/indexing-and-querying-code/Cargo.lock
+++ b/indexing-and-querying-code/Cargo.lock
@@ -1052,6 +1052,20 @@ dependencies = [
"winapi-util",
]
+[[package]]
+name = "indexing-and-querying-code"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "indoc",
+ "qdrant-client",
+ "swiftide",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
[[package]]
name = "indexmap"
version = "1.9.3"
@@ -2023,20 +2037,6 @@ dependencies = [
"uuid",
]
-[[package]]
-name = "swiftide-example"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "clap",
- "indoc",
- "qdrant-client",
- "swiftide",
- "tokio",
- "tracing",
- "tracing-subscriber",
-]
-
[[package]]
name = "syn"
version = "2.0.71"
diff --git a/ragas/.gitignore b/ragas/.gitignore
new file mode 100644
index 0000000..cbf210b
--- /dev/null
+++ b/ragas/.gitignore
@@ -0,0 +1,3 @@
+target/
+*.json
+.ipynb_checkpoints/
diff --git a/ragas/.mise.toml b/ragas/.mise.toml
new file mode 100644
index 0000000..c8ddcd4
--- /dev/null
+++ b/ragas/.mise.toml
@@ -0,0 +1,2 @@
+[tools]
+python = "latest"
diff --git a/ragas/Cargo.lock b/ragas/Cargo.lock
new file mode 100644
index 0000000..e0eb2ce
--- /dev/null
+++ b/ragas/Cargo.lock
@@ -0,0 +1,2935 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ahash"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
+dependencies = [
+ "cfg-if",
+ "getrandom",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
+
+[[package]]
+name = "arc-swap"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
+
+[[package]]
+name = "async-convert"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d416feee97712e43152cd42874de162b8f9b77295b1c85e5d92725cc8310bae"
+dependencies = [
+ "async-trait",
+]
+
+[[package]]
+name = "async-openai"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f7e40b158d5356b3497edb35610a408cb6339e68c91c7521bc68fbec83b2521"
+dependencies = [
+ "async-convert",
+ "backoff",
+ "base64",
+ "bytes",
+ "derive_builder",
+ "eventsource-stream",
+ "futures",
+ "rand",
+ "reqwest",
+ "reqwest-eventsource",
+ "secrecy",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+[[package]]
+name = "auto_enums"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1899bfcfd9340ceea3533ea157360ba8fa864354eccbceab58e1006ecab35393"
+dependencies = [
+ "derive_utils",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+
+[[package]]
+name = "axum"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "sync_wrapper 1.0.1",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+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 = "backoff"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
+dependencies = [
+ "futures-core",
+ "getrandom",
+ "instant",
+ "pin-project-lite",
+ "rand",
+ "tokio",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "bitflags"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bstr"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
+
+[[package]]
+name = "cc"
+version = "1.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "066fce287b1d4eafef758e89e09d724a24808a9196fe9756b8ca90e86d0719a2"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "clap"
+version = "4.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11d8838454fda655dafd3accb2b6e2bea645b9e4078abe84a22ceb947235c5cc"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
+
+[[package]]
+name = "combine"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "darling"
+version = "0.20.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.20.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.20.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7"
+dependencies = [
+ "derive_builder_macro",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "derive_builder_macro"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b"
+dependencies = [
+ "derive_builder_core",
+ "syn",
+]
+
+[[package]]
+name = "derive_utils"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61bb5a1014ce6dfc2a378578509abe775a5aa06bff584a547555d9efdb81b926"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "either"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "eventsource-stream"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74fef4569247a5f429d9156b9d0a2599914385dd189c539334c625d8099d90ab"
+dependencies = [
+ "futures-core",
+ "nom",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+
+[[package]]
+name = "futures-task"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+
+[[package]]
+name = "futures-timer"
+version = "3.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
+
+[[package]]
+name = "futures-util"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "gimli"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+
+[[package]]
+name = "globset"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "globwalk"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
+dependencies = [
+ "bitflags",
+ "ignore",
+ "walkdir",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "http",
+ "indexmap 2.4.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
+[[package]]
+name = "http"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "hyper"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
+dependencies = [
+ "futures-util",
+ "http",
+ "hyper",
+ "hyper-util",
+ "rustls",
+ "rustls-native-certs",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls",
+ "tower-service",
+ "webpki-roots",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793"
+dependencies = [
+ "hyper",
+ "hyper-util",
+ "pin-project-lite",
+ "tokio",
+ "tower-service",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
+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.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "ignore"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+dependencies = [
+ "crossbeam-deque",
+ "globset",
+ "log",
+ "memchr",
+ "regex-automata",
+ "same-file",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.5",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
+
+[[package]]
+name = "instant"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
+[[package]]
+name = "itertools"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+
+[[package]]
+name = "js-sys"
+version = "0.3.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.155"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
+
+[[package]]
+name = "lock_api"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
+[[package]]
+name = "md-5"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
+dependencies = [
+ "cfg-if",
+ "digest",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "wasi",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.36.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+[[package]]
+name = "pest"
+version = "2.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95"
+dependencies = [
+ "memchr",
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "prost"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca"
+dependencies = [
+ "anyhow",
+ "itertools",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2"
+dependencies = [
+ "prost",
+]
+
+[[package]]
+name = "pulldown-cmark"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "666f0f59e259aea2d72e6012290c09877a780935cc3c18b1ceded41f3890d59c"
+dependencies = [
+ "bitflags",
+ "memchr",
+ "unicase",
+]
+
+[[package]]
+name = "qdrant-client"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26955138c3afae5f9d36decd09f1e4e02e266132359b8631093e9cddb1662600"
+dependencies = [
+ "anyhow",
+ "derive_builder",
+ "futures-util",
+ "prost",
+ "prost-types",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "tonic",
+]
+
+[[package]]
+name = "quinn"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156"
+dependencies = [
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto",
+ "quinn-udp",
+ "rustc-hash",
+ "rustls",
+ "socket2",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-proto"
+version = "0.11.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd"
+dependencies = [
+ "bytes",
+ "rand",
+ "ring",
+ "rustc-hash",
+ "rustls",
+ "slab",
+ "thiserror",
+ "tinyvec",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285"
+dependencies = [
+ "libc",
+ "once_cell",
+ "socket2",
+ "tracing",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "ragas"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "indoc",
+ "qdrant-client",
+ "swiftide",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "redis"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e902a69d09078829137b4a5d9d082e0490393537badd7c91a3d69d14639e115f"
+dependencies = [
+ "arc-swap",
+ "async-trait",
+ "bytes",
+ "combine",
+ "futures",
+ "futures-util",
+ "itoa",
+ "num-bigint",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "rustls-native-certs",
+ "rustls-pemfile",
+ "rustls-pki-types",
+ "ryu",
+ "sha1_smol",
+ "socket2",
+ "tokio",
+ "tokio-retry",
+ "tokio-rustls",
+ "tokio-util",
+ "url",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
+
+[[package]]
+name = "reqwest"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
+dependencies = [
+ "base64",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-rustls",
+ "hyper-util",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "mime_guess",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "quinn",
+ "rustls",
+ "rustls-native-certs",
+ "rustls-pemfile",
+ "rustls-pki-types",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper 1.0.1",
+ "tokio",
+ "tokio-rustls",
+ "tokio-util",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "webpki-roots",
+ "winreg",
+]
+
+[[package]]
+name = "reqwest-eventsource"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "632c55746dbb44275691640e7b40c907c16a2dc1a5842aa98aaec90da6ec6bde"
+dependencies = [
+ "eventsource-stream",
+ "futures-core",
+ "futures-timer",
+ "mime",
+ "nom",
+ "pin-project-lite",
+ "reqwest",
+ "thiserror",
+]
+
+[[package]]
+name = "ring"
+version = "0.17.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "getrandom",
+ "libc",
+ "spin",
+ "untrusted",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+
+[[package]]
+name = "rustls"
+version = "0.23.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
+dependencies = [
+ "log",
+ "once_cell",
+ "ring",
+ "rustls-pki-types",
+ "rustls-webpki",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile",
+ "rustls-pki-types",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
+dependencies = [
+ "base64",
+ "rustls-pki-types",
+]
+
+[[package]]
+name = "rustls-pki-types"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
+
+[[package]]
+name = "rustls-webpki"
+version = "0.102.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e"
+dependencies = [
+ "ring",
+ "rustls-pki-types",
+ "untrusted",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
+
+[[package]]
+name = "ryu"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "schannel"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "secrecy"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e"
+dependencies = [
+ "serde",
+ "zeroize",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.207"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.207"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1_smol"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
+
+[[package]]
+name = "sha2"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+
+[[package]]
+name = "socket2"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "strum"
+version = "0.26.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+dependencies = [
+ "strum_macros",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.26.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn",
+]
+
+[[package]]
+name = "subtle"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+
+[[package]]
+name = "swiftide"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0db17921bbb10f39b326959414ed6919d37ab581b540537c2f647cd5a0d3ec58"
+dependencies = [
+ "swiftide-core",
+ "swiftide-indexing",
+ "swiftide-integrations",
+ "swiftide-query",
+]
+
+[[package]]
+name = "swiftide-core"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee009a70454d5f0fb16a21e438c3703161bbc1a083e9f48da3540b60b58b0408"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "derive_builder",
+ "futures-util",
+ "itertools",
+ "lazy_static",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "strum",
+ "strum_macros",
+ "tera",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+ "uuid",
+]
+
+[[package]]
+name = "swiftide-indexing"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0abd8ffaabedb0d9cd163395ce6264515d6bf8834ff065ba3c265297b087b018"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "derive_builder",
+ "futures-util",
+ "ignore",
+ "indoc",
+ "itertools",
+ "num_cpus",
+ "serde",
+ "serde_json",
+ "strum",
+ "strum_macros",
+ "swiftide-core",
+ "swiftide-macros",
+ "text-splitter",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+]
+
+[[package]]
+name = "swiftide-integrations"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a46937c3fbd44fb5e011159fd21e3bd1b7d9be2e0a51c394746bb7cb6b461b6"
+dependencies = [
+ "anyhow",
+ "async-openai",
+ "async-trait",
+ "chrono",
+ "derive_builder",
+ "futures-util",
+ "itertools",
+ "qdrant-client",
+ "redis",
+ "regex",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "strum",
+ "strum_macros",
+ "swiftide-core",
+ "swiftide-macros",
+ "tokio",
+ "tracing",
+ "tree-sitter",
+ "tree-sitter-javascript",
+ "tree-sitter-python",
+ "tree-sitter-ruby",
+ "tree-sitter-rust",
+ "tree-sitter-typescript",
+]
+
+[[package]]
+name = "swiftide-macros"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f895f84ff3454d94c2d64e499a5410bb29ebdea9b8df61a515a345060755f78"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "swiftide-query"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346a1ca8dd9f2db0edd0314fe3b2215059f76bff2091f0317593a38650194041"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "derive_builder",
+ "futures-util",
+ "indoc",
+ "num_cpus",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "swiftide-core",
+ "tokio",
+ "tokio-stream",
+ "tracing",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+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 = "tera"
+version = "1.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee"
+dependencies = [
+ "globwalk",
+ "lazy_static",
+ "pest",
+ "pest_derive",
+ "regex",
+ "serde",
+ "serde_json",
+ "unic-segment",
+]
+
+[[package]]
+name = "text-splitter"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f280573deec490e745c503ecc1d0e17104e98936eaefd7b0aa4b1422c74b317"
+dependencies = [
+ "ahash",
+ "auto_enums",
+ "either",
+ "itertools",
+ "once_cell",
+ "pulldown-cmark",
+ "regex",
+ "strum",
+ "thiserror",
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.39.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "parking_lot",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-retry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f"
+dependencies = [
+ "pin-project",
+ "rand",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
+dependencies = [
+ "rustls",
+ "rustls-pki-types",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tonic"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum",
+ "base64",
+ "bytes",
+ "flate2",
+ "h2",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-timeout",
+ "hyper-util",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "rustls-native-certs",
+ "rustls-pemfile",
+ "socket2",
+ "tokio",
+ "tokio-rustls",
+ "tokio-stream",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "indexmap 1.9.3",
+ "pin-project",
+ "pin-project-lite",
+ "rand",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
+name = "tracing"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+dependencies = [
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+dependencies = [
+ "nu-ansi-term",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "tree-sitter"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df7cc499ceadd4dcdf7ec6d4cbc34ece92c3fa07821e287aedecd4416c516dca"
+dependencies = [
+ "cc",
+ "regex",
+]
+
+[[package]]
+name = "tree-sitter-javascript"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8710a71bc6779e33811a8067bdda3ed08bed1733296ff915e44faf60f8c533d7"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "tree-sitter-python"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4066c6cf678f962f8c2c4561f205945c84834cce73d981e71392624fdc390a9"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "tree-sitter-ruby"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0031f687c0772f2dad7b77104c43428611099a1804c81244ada21560f41f0b1"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "tree-sitter-rust"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "277690f420bf90741dea984f3da038ace46c4fe6047cba57a66822226cde1c93"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "tree-sitter-typescript"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecb35d98a688378e56c18c9c159824fd16f730ccbea19aacf4f206e5d5438ed9"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+
+[[package]]
+name = "unic-char-property"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
+dependencies = [
+ "unic-char-range",
+]
+
+[[package]]
+name = "unic-char-range"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
+
+[[package]]
+name = "unic-common"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
+
+[[package]]
+name = "unic-segment"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23"
+dependencies = [
+ "unic-ucd-segment",
+]
+
+[[package]]
+name = "unic-ucd-segment"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700"
+dependencies = [
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
+]
+
+[[package]]
+name = "unic-ucd-version"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
+
+[[package]]
+name = "unicase"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
+
+[[package]]
+name = "untrusted"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+
+[[package]]
+name = "url"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "uuid"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
+dependencies = [
+ "getrandom",
+ "md-5",
+ "serde",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
+
+[[package]]
+name = "wasm-streams"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.26.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
+dependencies = [
+ "rustls-pki-types",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "winreg"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+dependencies = [
+ "byteorder",
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
diff --git a/ragas/Cargo.toml b/ragas/Cargo.toml
new file mode 100644
index 0000000..9997a0d
--- /dev/null
+++ b/ragas/Cargo.toml
@@ -0,0 +1,25 @@
+[package]
+name = "ragas"
+publish = false
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+anyhow = "1.0.86"
+clap = { version = "4.5.9", features = ["derive"] }
+swiftide = { features = [
+ "qdrant",
+ "redis",
+ "openai",
+ "tree-sitter",
+], version = "0.11.1" }
+tokio = { version = "1.38.0", features = ["full"] }
+tracing-subscriber = "0.3.18"
+tracing = "0.1.40"
+qdrant-client = "1.11.1"
+indoc = "2.0.5"
+
+[features]
+default = ["chunk", "metadata"]
+chunk = []
+metadata = []
diff --git a/ragas/compose.yml b/ragas/compose.yml
new file mode 100644
index 0000000..ae24282
--- /dev/null
+++ b/ragas/compose.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ qdrant:
+ image: qdrant/qdrant:v1.9.2
+ ports:
+ - "6333:6333"
+ - "6334:6334" # grpc
+ volumes:
+ - qdrant-data:/qdrant/storage
+ redis:
+ image: redis:7-alpine
+ ports:
+ - 6397:6379
+ volumes:
+ - redis-data:/data
+volumes:
+ qdrant-data:
+ redis-data:
diff --git a/ragas/notebook.ipynb b/ragas/notebook.ipynb
new file mode 100644
index 0000000..467e9c3
--- /dev/null
+++ b/ragas/notebook.ipynb
@@ -0,0 +1,588 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "115ddde1",
+ "metadata": {},
+ "source": [
+ "# Swiftide evaluation with Ragas\n",
+ "\n",
+ "This notebook demonstrates how to evaluate a Swiftide query pipeline with Ragas. The rust implementation is a bit contrived to make it more configurable. However, the main thing is running the query pipeline with an evaluator, and then exporting the result of that evaluator to a JSON file compatible with a HF dataset.\n",
+ "\n",
+ "In the Rust code we use all features enabled as the base line, capturing the answers as the 'ground truth'.\n",
+ "\n",
+ "**tl&dr; pretty charts at the bottom**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8bbd3c1e-bc19-46ba-8b26-8881b2ef1001",
+ "metadata": {
+ "notebookRunGroups": {
+ "groupValue": "2"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Run with all features and use the answers as the ground truths\n",
+ "!RUST_LOG=swiftide=info cargo run -- --language rust --path . --output base.json --record-ground-truth \"How is swiftide used?\" \"How are arguments passed?\" \"How is Ragas used?\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "605df33f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Run with chunking enabled and QA metadata disabled\n",
+ "!RUST_LOG=swiftide=info cargo run --no-default-features --features=chunk -- --language rust --path . --output metadata.json --record-ground-truth --file base.json"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c806589e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Run with chunking disabled \n",
+ "!RUST_LOG=swiftide=info cargo run --no-default-features --features=metadata -- --language rust --path . --output chunk.json --record-ground-truth --file base.json"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c42996ce",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Run with chunking and metadata disabled\n",
+ "!RUST_LOG=swiftide=info cargo run --no-default-features -- --language rust --path . --output nothing.json --record-ground-truth --file base.json"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "60a56162",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "83505227bdd643beb7cb1d1685b49784",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Generating everything split: 0 examples [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "6344adc79ea14245bbdb032ea19a7a3d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Generating metadata split: 0 examples [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "4040a303cb86487783f7730f0afaf6ad",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Generating chunk split: 0 examples [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9f95c181e259471391a26b0b07166051",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Generating nothing split: 0 examples [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "DatasetDict({\n",
+ " everything: Dataset({\n",
+ " features: ['answer', 'contexts', 'ground_truth', 'question'],\n",
+ " num_rows: 3\n",
+ " })\n",
+ " metadata: Dataset({\n",
+ " features: ['answer', 'contexts', 'ground_truth', 'question'],\n",
+ " num_rows: 3\n",
+ " })\n",
+ " chunk: Dataset({\n",
+ " features: ['answer', 'contexts', 'ground_truth', 'question'],\n",
+ " num_rows: 3\n",
+ " })\n",
+ " nothing: Dataset({\n",
+ " features: ['answer', 'contexts', 'ground_truth', 'question'],\n",
+ " num_rows: 3\n",
+ " })\n",
+ "})"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from datasets import load_dataset\n",
+ "files = { \n",
+ " \"everything\": \"base.json\",\n",
+ " \"metadata\": \"metadata.json\",\n",
+ " \"chunk\": \"chunk.json\",\n",
+ " \"nothing\": \"nothing.json\"\n",
+ "}\n",
+ "dataset = load_dataset(\"json\", data_files=files)\n",
+ "\n",
+ "dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "fb3b137f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "3faf633f6d764dd7b2a6da87d1bd5720",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Evaluating: 0%| | 0/12 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "5d5eec27da5b42fca8a854eb28224575",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Evaluating: 0%| | 0/12 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "2f42e8d6712c4ebea0abab9e561b394a",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Evaluating: 0%| | 0/12 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "5d41e78ad08b4291911d66d084915211",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Evaluating: 0%| | 0/12 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " answer | \n",
+ " contexts | \n",
+ " ground_truth | \n",
+ " question | \n",
+ " answer_relevancy | \n",
+ " faithfulness | \n",
+ " context_recall | \n",
+ " context_precision | \n",
+ " dataset | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " ```markdown\\nSwiftide is used for indexing cod... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nSwiftide is used for indexing cod... | \n",
+ " How is swiftide used? | \n",
+ " 0.900142 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " everything | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " [\"\\nstruct Args {\\n #[arg(short, long)]\\n ... | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " How are arguments passed? | \n",
+ " 0.914773 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " everything | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " ```markdown\\nRagas is used in the context of t... | \n",
+ " [\"\\n\\nasync fn query(\\n questions: Evaluati... | \n",
+ " ```markdown\\nRagas is used in the context of t... | \n",
+ " How is Ragas used? | \n",
+ " 0.894912 | \n",
+ " 1.000000 | \n",
+ " 0.75 | \n",
+ " 1.0 | \n",
+ " everything | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " ```markdown\\nArguments are passed using a stru... | \n",
+ " [\"\\nstruct Args {\\n #[arg(short, long)]\\n ... | \n",
+ " ```markdown\\nArguments are passed using a stru... | \n",
+ " How are arguments passed? | \n",
+ " 0.941746 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " metadata | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " ```markdown\\nRagas is used in the context of e... | \n",
+ " [\"\\n\\nasync fn query(\\n questions: Evaluati... | \n",
+ " ```markdown\\nRagas is used in the context of e... | \n",
+ " How is Ragas used? | \n",
+ " 0.922148 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " metadata | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " ```markdown\\nSwiftide is used to index code an... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nSwiftide is used to index code an... | \n",
+ " How is swiftide used? | \n",
+ " 0.860102 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " metadata | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " ```markdown\\nRagas is used in the context of e... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nRagas is used in the context of e... | \n",
+ " How is Ragas used? | \n",
+ " 0.930633 | \n",
+ " 0.928571 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " chunk | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " ```markdown\\nSwiftide is used in the context o... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nSwiftide is used in the context o... | \n",
+ " How is swiftide used? | \n",
+ " 0.927046 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " chunk | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " How are arguments passed? | \n",
+ " 0.791580 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " chunk | \n",
+ "
\n",
+ " \n",
+ " 0 | \n",
+ " ## How is Ragas used?\\n\\nRagas is used in the ... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ## How is Ragas used?\\n\\nRagas is used in the ... | \n",
+ " How is Ragas used? | \n",
+ " 0.913439 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " nothing | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " ```markdown\\nSwiftide is used for indexing cod... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nSwiftide is used for indexing cod... | \n",
+ " How is swiftide used? | \n",
+ " 0.927010 | \n",
+ " 1.000000 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " nothing | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " [\"use swiftide::{\\n indexing::{\\n lo... | \n",
+ " ```markdown\\nArguments are passed in the conte... | \n",
+ " How are arguments passed? | \n",
+ " 0.785230 | \n",
+ " 0.944444 | \n",
+ " 1.00 | \n",
+ " 1.0 | \n",
+ " nothing | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " answer \\\n",
+ "0 ```markdown\\nSwiftide is used for indexing cod... \n",
+ "1 ```markdown\\nArguments are passed in the conte... \n",
+ "2 ```markdown\\nRagas is used in the context of t... \n",
+ "0 ```markdown\\nArguments are passed using a stru... \n",
+ "1 ```markdown\\nRagas is used in the context of e... \n",
+ "2 ```markdown\\nSwiftide is used to index code an... \n",
+ "0 ```markdown\\nRagas is used in the context of e... \n",
+ "1 ```markdown\\nSwiftide is used in the context o... \n",
+ "2 ```markdown\\nArguments are passed in the conte... \n",
+ "0 ## How is Ragas used?\\n\\nRagas is used in the ... \n",
+ "1 ```markdown\\nSwiftide is used for indexing cod... \n",
+ "2 ```markdown\\nArguments are passed in the conte... \n",
+ "\n",
+ " contexts \\\n",
+ "0 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "1 [\"\\nstruct Args {\\n #[arg(short, long)]\\n ... \n",
+ "2 [\"\\n\\nasync fn query(\\n questions: Evaluati... \n",
+ "0 [\"\\nstruct Args {\\n #[arg(short, long)]\\n ... \n",
+ "1 [\"\\n\\nasync fn query(\\n questions: Evaluati... \n",
+ "2 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "0 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "1 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "2 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "0 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "1 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "2 [\"use swiftide::{\\n indexing::{\\n lo... \n",
+ "\n",
+ " ground_truth \\\n",
+ "0 ```markdown\\nSwiftide is used for indexing cod... \n",
+ "1 ```markdown\\nArguments are passed in the conte... \n",
+ "2 ```markdown\\nRagas is used in the context of t... \n",
+ "0 ```markdown\\nArguments are passed using a stru... \n",
+ "1 ```markdown\\nRagas is used in the context of e... \n",
+ "2 ```markdown\\nSwiftide is used to index code an... \n",
+ "0 ```markdown\\nRagas is used in the context of e... \n",
+ "1 ```markdown\\nSwiftide is used in the context o... \n",
+ "2 ```markdown\\nArguments are passed in the conte... \n",
+ "0 ## How is Ragas used?\\n\\nRagas is used in the ... \n",
+ "1 ```markdown\\nSwiftide is used for indexing cod... \n",
+ "2 ```markdown\\nArguments are passed in the conte... \n",
+ "\n",
+ " question answer_relevancy faithfulness context_recall \\\n",
+ "0 How is swiftide used? 0.900142 1.000000 1.00 \n",
+ "1 How are arguments passed? 0.914773 1.000000 1.00 \n",
+ "2 How is Ragas used? 0.894912 1.000000 0.75 \n",
+ "0 How are arguments passed? 0.941746 1.000000 1.00 \n",
+ "1 How is Ragas used? 0.922148 1.000000 1.00 \n",
+ "2 How is swiftide used? 0.860102 1.000000 1.00 \n",
+ "0 How is Ragas used? 0.930633 0.928571 1.00 \n",
+ "1 How is swiftide used? 0.927046 1.000000 1.00 \n",
+ "2 How are arguments passed? 0.791580 1.000000 1.00 \n",
+ "0 How is Ragas used? 0.913439 1.000000 1.00 \n",
+ "1 How is swiftide used? 0.927010 1.000000 1.00 \n",
+ "2 How are arguments passed? 0.785230 0.944444 1.00 \n",
+ "\n",
+ " context_precision dataset \n",
+ "0 1.0 everything \n",
+ "1 1.0 everything \n",
+ "2 1.0 everything \n",
+ "0 1.0 metadata \n",
+ "1 1.0 metadata \n",
+ "2 1.0 metadata \n",
+ "0 1.0 chunk \n",
+ "1 1.0 chunk \n",
+ "2 1.0 chunk \n",
+ "0 1.0 nothing \n",
+ "1 1.0 nothing \n",
+ "2 1.0 nothing "
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from ragas.metrics import (\n",
+ " answer_relevancy,\n",
+ " faithfulness,\n",
+ " context_recall,\n",
+ " context_precision,\n",
+ ")\n",
+ "\n",
+ "import pandas as pd\n",
+ "\n",
+ "from ragas import evaluate\n",
+ "\n",
+ "# Run evaluate on each dataset, add a column with the dataset name, then concat into single dataframe\n",
+ "all_results = []\n",
+ "for key in files:\n",
+ " result = evaluate(dataset[key], metrics=[answer_relevancy,faithfulness,context_recall,context_precision]).to_pandas()\n",
+ " result['dataset'] = key\n",
+ " all_results.append(result)\n",
+ " \n",
+ "df = pd.concat(all_results)\n",
+ "df\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "bf4e1a2a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/MAAAJvCAYAAAA3L4EvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACVoElEQVR4nOzdeZyNdf/H8feZldmN3YxthhmMZezGnmzDkGTLEklRYy0VcouoZIksIckacf8sJUXkjkJSVJJKtiwZzDAzmP1cvz/cc26nmWFmzHbG6/l4eNzOdV3f7/W5zjlf3e9zfa/rMhmGYQgAAAAAANgMu/wuAAAAAAAAZA1hHgAAAAAAG0OYBwAAAADAxhDmAQAAAACwMYR5AAAAAABsDGEeAAAAAAAbQ5gHAAAAAMDGEOYBAAAAALAxhHkAAAAAAGwMYR4AgP86c+aMBg8erPr16yswMFC7du3K75KQw86fP6/AwEBt2rQpv0sBAOC+EOYBoBDatGmTAgMDFRgYqO+//z7NesMw1KpVKwUGBmro0KH5UGHmtWnTxnIsgYGBCgkJUd++fbVz584c39e4ceP0xx9/aMyYMZoxY4Zq1qyZ4/t4UKSG5sDAQL377rvpbvPCCy8oMDBQdevWzdY+9uzZo/nz599PmQ+E+fPnW42hOnXqqHXr1ho2bJg2btyoxMTEbPdd0D6DxYsX8yMcgAcGYR4ACjFnZ2d9+umnaZZ/9913unTpkpycnPKhqqyrXr26ZsyYoRkzZmjw4MG6fPmyhg8frnXr1uXYPuLj43XkyBE99thj6t+/vx555BGVKVMmx/p/UDk7O2vbtm1plt+6dUu7d++Ws7Nztvves2ePFixYkKU2Pj4++vnnn/XII49ke7+2avLkyZoxY4YmTpyoHj166Pr165owYYJ69Oihv//+O1t9ZuczyE1LliwhzAN4YBDmAaAQa9WqlbZv367k5GSr5Z9++qmCgoJUsmTJfKosa0qXLq1HHnlEjzzyiJ5++mmtW7dOLi4uWrFixX33nZCQILPZrKioKEmSh4fHffeZ6tatWznWl61q1aqV/vzzT/32229Wy7/88kslJSWpadOmeVJHcnKyEhMTZTKZ5OzsLHt7+zzZb16Ji4u75zYdOnTQI488op49e2r48OH66KOPNHPmTJ04cUKjRo3KgyoBADmJMA8AhVjnzp11/fp17du3z7IsMTFRO3bsUJcuXdJtYzabtWLFCnXu3Fm1atVS06ZNNWnSJEVHR1ttt2vXLj3zzDNq3ry5atasqbZt22rhwoVKSUmx2m7AgAEKCwvTn3/+qQEDBqhOnTpq0aKFli5dmu3jKlmypPz8/HThwgXLsoiICI0fP15NmzZVzZo11blzZ/3f//2fVbuDBw8qMDBQ27Zt05w5c9SiRQvVqVNHb775ph566CFJ0owZMxQYGKg2bdpY2v36668aMmSI6tWrp7p162rgwIH68ccfrfpOvbThu+++0+TJkxUSEqJWrVpZvQe//fab+vfvrzp16qhdu3bavn27pNszJXr27KnatWurQ4cO2r9/v1XfFy5c0OTJk9WhQwfVrl1bjRs31siRI3X+/Pl0a/jhhx/05ptvqkmTJgoODlZ4eLjlx4o77dmzR/3791fdunVVr149PfbYY9q6davVNj/99JOeeuop1a9fX3Xq1FH//v31ww8/ZOZjkiQFBwfL19c3Tb9bt25V8+bN5eXllW67PXv2qG/fvgoODlbdunX1zDPP6MSJE5b148aN04cffihJVlPIpf9N8V+2bJlWrFihtm3bqlatWjp58mSG18yfPHlSo0aNUpMmTSyfw5w5cyzrb9y4oddff11t2rRRzZo1FRISoieffFLHjh276/GnTnFP7b9evXpq3Lixpk2bpoSEhDTbf/zxx+revbtq166tRo0aacyYMWnOmqd+n3755Rf169dPderU0dtvv33XOjLStWtX9ezZUz/99JPVvxPff/+9Ro4cqdatW6tmzZpq1aqV3njjDcXHx1u2udtnIEnLli1Tnz591LhxY9WuXVvdu3e3fOfvtG/fPj3++ONq0KCB6tatqw4dOqQ5nsTERM2bN0/t2rWz1DNjxgyrSwQCAwN169Ytbd682VLLuHHjsvW+AIAtcMjvAgAAucfHx0fBwcHatm2bJVju3btXsbGx6tSpk1avXp2mzaRJk7R582Z1795dAwYM0Pnz5/Xhhx/q119/1bp16+To6ChJ2rx5s1xcXPTkk0/KxcVF3377rebNm6cbN27o5ZdftuozOjpaQ4YMUbt27RQaGqodO3Zo1qxZCggIsNSVFUlJSbp06ZIlCF69elW9evWSyWRSv3795O3trb179+qVV17RjRs3NGjQIKv27777rhwdHfXUU08pMTFRLVu2lI+Pj958802FhYWpZcuWcnV1lSSdOHFC/fr1k6urq4YMGSIHBwetX79eAwYM0Jo1a1SnTh2rvqdMmSJvb2+Fh4dbnZmPjo7WsGHD1KlTJ3Xs2FHr1q3T888/L7PZrDfeeEN9+vRRWFiYli1bppEjR+qrr76Sm5ubJOno0aM6cuSIOnfurDJlyujChQtat26dnnjiCW3btk1Fixa1qmHatGny8PDQ8OHDdeHCBa1cuVKvvfaa5s6da9lm06ZNmjBhgqpWraqhQ4fK3d1dx48f19dff235oefAgQN6+umnVbNmTQ0fPlwmk0mbNm3SwIEDtXbtWtWuXTtTn1dYWJg++eQTjR07ViaTSVFRUdq3b59mzJihr7/+Os32W7Zs0bhx49S8eXONHTtWcXFxWrdunfr27avNmzfL19dXvXv31uXLly39pGfTpk1KSEhQr1695OTkJE9PT5nN5jTb/fbbb+rXr58cHBzUu3dv+fj46K+//tLu3bs1ZswYSdKrr76qHTt2qH///vL399f169f1ww8/6OTJkwoKCrrnezB69Gj5+PjohRde0I8//qjVq1crJibGqvZFixbpnXfeUWhoqHr06KGoqCitWbNG/fr105YtW6xmjVy/fl1PP/20OnfurK5du6p48eL3rCEjXbt21fr16/XNN9+oWbNmkqTt27crPj5ejz/+uLy8vPTzzz9rzZo1unTpkubNmydJ9/wMVq1apTZt2qhLly5KSkrStm3bNGrUKC1ZskStW7eWdHt8DR06VIGBgRo5cqScnJx09uxZHT582NKP2WzWs88+qx9++EG9evWSv7+//vjjD61cuVJnzpyx3JMh9RKC2rVrq1evXpKkChUqZPt9AYACzwAAFDobN240AgICjJ9//tlYs2aNUbduXSMuLs4wDMMYOXKkMWDAAMMwDOOhhx4ynnnmGUu7Q4cOGQEBAcYnn3xi1d/evXvTLE/t707/+te/jDp16hgJCQmWZf379zcCAgKMzZs3W5YlJCQYzZo1M0aMGHHPY3nooYeMwYMHG5GRkUZkZKRx/PhxY8yYMUZAQIAxdepUwzAMY8KECUazZs2MqKgoq7Zjxowx6tevb6n122+/NQICAoyHH344Tf3nzp0zAgICjPfff99q+XPPPWcEBQUZf/31l2VZRESEUbduXaNfv36WZanv+eOPP24kJydb9ZH6HmzdutWy7OTJk0ZAQIBRrVo148cff7Qs//rrr42AgABj48aNlmXpvddHjhxJ876m1jBo0CDDbDZblr/xxhtG9erVjZiYGMMwDCMmJsaoW7eu0bNnTyM+Pt6q39R2ZrPZaN++vTF48GCrvuLi4ow2bdoYTz75ZJqa7nTn+/nHH38YAQEBxqFDhwzDMIw1a9YYwcHBxq1bt4yXX37ZCA4OtrS7ceOG0aBBA2PixIlW/V25csWoX7++1fIpU6YYAQEBGe67Xr16RmRkZLrr7nx/+/XrZ9StW9e4cOFCuu+FYRhG/fr1jSlTptz1mNMzb948IyAgwBg2bJjV8smTJxsBAQHG8ePHDcMwjPPnzxvVq1c3Fi1aZLXd77//btSoUcNqeer3ad26dVmq4Z/vRaro6GgjICDACA8PtyxL7zu3ZMkSIzAw0Op9yugzSK+PxMREIywszHjiiScsy5YvX37X2gzDMLZs2WJUq1bN8v1JtW7dOiMgIMD44YcfLMuCg4ONl19+OcO+AKAwYZo9ABRyoaGhSkhI0H/+8x/duHFDX331VYZT7Ldv3y53d3c1a9ZMUVFRlj9BQUFycXHRwYMHLdsWKVLE8vcbN24oKipKDRo0UFxcnE6dOmXVr4uLi9UNx5ycnFSrVi2dO3cuU8fwzTffKCQkRCEhIXrkkUe0fft2PfLIIxo7dqwMw9AXX3yhNm3ayDAMq7qbN2+u2NjYNFOhu3XrZlV/RlJSUrRv3z61bdtW5cuXtywvVaqUwsLC9MMPP+jGjRtWbXr16pXu9dguLi7q3Lmz5bWfn588PDzk7+9vdXY/9e93vjd31pqUlKRr166pQoUK8vDw0K+//ppmX6mzFFI1aNBAKSkplssS9u3bp5s3b+qZZ55JcwO61HbHjx/XmTNn1KVLF127ds3ynt66dUshISE6dOhQume501O1alXL5Q3S7Xs2PPzww2lmFEjS/v37FRMTo86dO1t9lnZ2dqpTp47Vd/Be2rdvL29v77tuExUVpUOHDumxxx5TuXLlrNbd+R56eHjop59+UkRERKb3f6d+/fpZve7fv7+k2zNlJGnnzp0ym80KDQ21Ou4SJUqoYsWKaY7byclJ3bt3z1Yt/+Ti4iJJunnzpmXZnd+5W7duKSoqSnXr1pVhGOl+59JzZx/R0dGKjY1V/fr1rdqnzjb48ssvM/w+bd++Xf7+/vLz87N6b5o0aSJJWfpOAEBhwjR7ACjkvL29FRISok8//VTx8fFKSUlRhw4d0t327Nmzio2NVUhISLrrIyMjLX8/ceKE5s6dq2+//TZNoI2NjbV6XaZMGatgJEmenp76/fffM3UMderU0ejRo2UymVSkSBH5+/tbQkBkZKRiYmK0fv16rV+/Pt32/7xe3NfXN1P7jYqKUlxcnCpXrpxmnb+/v8xms/7++29VrVr1nn2n9x64u7unuWO+u7u7JCkmJsayLD4+XkuWLNGmTZsUEREhwzAs6/75XktKE0pT36vUPv/66y9Jsqr7n86cOSNJaS6ZuFNsbKw8PT0zXH+nsLAwLV++XIMGDdKRI0c0bNiwu+534MCB6a5PvfQgMzLzOaf+aBIQEHDX7caOHatx48apdevWCgoKUqtWrdStWzerH3nupmLFilavK1SoIDs7O8t9D86cOSPDMNS+fft02zs4WP9fttKlS+fY0yhSLwdJvbREki5evKh58+Zp9+7dae6X8c/xnpH//Oc/WrRokY4fP251bfud46BTp07697//rYkTJ2r27NkKCQlRu3bt1LFjR9nZ3T7ndPbsWZ08eTJT/y4BwIOEMA8AD4CwsDD961//0tWrV9WyZcsM79huNptVvHhxzZo1K931qWc5Y2Ji1L9/f7m5uWnkyJGqUKGCnJ2ddezYMc2aNSvNGbb7vXN4sWLFMrzreeq+unbtqkcffTTdbe68KZekTJ2Vz66MHrWW0XuQ0fI7A/vUqVMt16oHBwfL3d1dJpNJY8aMsdouVWoIuluf95K67UsvvaTq1aunu03qGd3MCAsL09tvv62JEyfKy8vLcm12RvudMWNGuk9byMp3KSc/506dOqlBgwbauXOn9u3bp2XLlmnp0qWaP39+tu778M8fdsxms0wmk5YuXZrhzI475eSx/fHHH5L+d315SkqKnnzyScu9Lvz8/OTi4qKIiAiNGzcuUzMyvv/+ez377LNq2LChXn31VZUsWVKOjo7auHGj1eMyixQpog8//FAHDx7UV199pa+//lqfffaZ1q9frw8++ED29vYym80KCAjQ+PHj090Xj5AE8KAizAPAA6Bdu3Z69dVX9eOPP1rdofufKlSooAMHDqhevXp3DQvfffedrl+/rgULFqhhw4aW5f+8u3pe8Pb2lqurq8xmc44/5szb21tF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",
+ "text/plain": [
+ "