From 4a0724b0b62ef715467875b040a890ce75a8a829 Mon Sep 17 00:00:00 2001 From: comex Date: Sun, 21 Jan 2024 20:49:23 -0800 Subject: [PATCH] Address security issues involving quote API Ref: https://github.com/advisories/GHSA-r7qv-8r2h-pg27 - Deprecate quote APIs in favor of `try_` equivalents that complain about nul bytes. - Also add a builder API, which allows re-enabling nul bytes without using the deprecated interface, and in the future can allow other things (as discussed in quoting_warning). - Add documentation about various security risks that remain, particularly with interactive shells. - Add fuzzers that actually verify round-trippability of the quote APIs against various shells, Python `shlex`, and C `wordexp`. - These are separate crates (as opposed to just being different files under `fuzz/fuzz_targets`) because they have different dependencies and build steps, and I don't want to agglomerate them all together. I've put them in the same workspace at least. - Also, check in Cargo.lock for the fuzzers, since they are binaries. - Add explicit MSRV of 1.46.0. This crate didn't previously have an explicit MSRV, but `cargo msrv` tells me that shlex 1.2.0 works down to Rust 1.36.0. Since this is a security fix, ideally the MSRV wouldn't be bumped at all, but that's not really feasible since the new API uses `#[non_exhaustive]`, which was unstable in Rust 1.36.0. In case anyone is stuck on old Rust versions, I separately released a shlex 1.2.1 that only has the fix for `{`/`}`/`\xa0`, without the API changes. However, even for the full release I'd still like to keep the MSRV reasonably old. I picked 1.46.0 because it's the first version that wouldn't require completely redoing the `const fn` bitmask. - Add more authors to Cargo.toml based on Git commits. --- .gitignore | 9 +- Cargo.toml | 9 +- fuzz/Cargo.lock | 476 ++++++++++++++++++ fuzz/Cargo.toml | 10 +- fuzz/fuzz_quote_python/Cargo.toml | 31 ++ fuzz/fuzz_quote_python/src/fuzz.rs | 56 +++ fuzz/fuzz_quote_real_shell/Cargo.toml | 24 + fuzz/fuzz_quote_real_shell/Dockerfile | 4 + fuzz/fuzz_quote_real_shell/basic-corpus/cr | 1 + .../fuzz_quote_real_shell/basic-corpus/long-a | 1 + .../basic-corpus/long-random | Bin 0 -> 100000 bytes .../basic-corpus/short-random | Bin 0 -> 400 bytes fuzz/fuzz_quote_real_shell/each-shell.sh | 70 +++ fuzz/fuzz_quote_real_shell/src/fuzz.rs | 419 +++++++++++++++ fuzz/fuzz_quote_wordexp/Cargo.toml | 27 + fuzz/fuzz_quote_wordexp/build.rs | 7 + fuzz/fuzz_quote_wordexp/src/fuzz.rs | 79 +++ fuzz/fuzz_quote_wordexp/src/wordexp_wrapper.c | 23 + fuzz/fuzz_targets/fuzz_next.rs | 2 +- src/bytes.rs | 380 ++++++++++++-- src/lib.rs | 264 ++++++++-- src/quoting_warning.md | 365 ++++++++++++++ 22 files changed, 2179 insertions(+), 78 deletions(-) create mode 100644 fuzz/Cargo.lock create mode 100644 fuzz/fuzz_quote_python/Cargo.toml create mode 100644 fuzz/fuzz_quote_python/src/fuzz.rs create mode 100644 fuzz/fuzz_quote_real_shell/Cargo.toml create mode 100644 fuzz/fuzz_quote_real_shell/Dockerfile create mode 100644 fuzz/fuzz_quote_real_shell/basic-corpus/cr create mode 100644 fuzz/fuzz_quote_real_shell/basic-corpus/long-a create mode 100644 fuzz/fuzz_quote_real_shell/basic-corpus/long-random create mode 100644 fuzz/fuzz_quote_real_shell/basic-corpus/short-random create mode 100755 fuzz/fuzz_quote_real_shell/each-shell.sh create mode 100644 fuzz/fuzz_quote_real_shell/src/fuzz.rs create mode 100644 fuzz/fuzz_quote_wordexp/Cargo.toml create mode 100644 fuzz/fuzz_quote_wordexp/build.rs create mode 100644 fuzz/fuzz_quote_wordexp/src/fuzz.rs create mode 100644 fuzz/fuzz_quote_wordexp/src/wordexp_wrapper.c create mode 100644 src/quoting_warning.md diff --git a/.gitignore b/.gitignore index cd23ebe..d36a04d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ -/target/ -Cargo.lock +nocommit/ +target/ +artifacts/ +corpus/ +/Cargo.lock **/*.rs.bk +.*.sw? +.sw? diff --git a/Cargo.toml b/Cargo.toml index f032f4e..c3644af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,13 @@ [package] name = "shlex" -version = "1.2.1" +version = "1.3.0" authors = [ "comex ", - "Fenhl " + "Fenhl ", + "Adrian Taylor ", + "Alex Touchet ", + "Daniel Parks ", + "Garrett Berg ", ] license = "MIT OR Apache-2.0" repository = "https://github.com/comex/rust-shlex" @@ -12,6 +16,7 @@ categories = [ "command-line-interface", "parser-implementations" ] +rust-version = "1.46.0" [features] std = [] diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock new file mode 100644 index 0000000..c7802cb --- /dev/null +++ b/fuzz/Cargo.lock @@ -0,0 +1,476 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bstr" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "fuzz_quote_python" +version = "0.0.0" +dependencies = [ + "cc", + "libfuzzer-sys", + "nu-pretty-hex", + "pyo3", + "shlex", +] + +[[package]] +name = "fuzz_quote_real_shell" +version = "0.0.0" +dependencies = [ + "bstr", + "libfuzzer-sys", + "nu-pretty-hex", + "rand", + "shlex", +] + +[[package]] +name = "fuzz_quote_wordexp" +version = "0.0.0" +dependencies = [ + "cc", + "libfuzzer-sys", + "nu-pretty-hex", + "shlex", +] + +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "indoc" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "nu-ansi-term" +version = "0.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "nu-pretty-hex" +version = "0.87.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "934849ad57ec319bddad52dc0fd7cd6c6bd7e9a80e79636cbf41e3e5c29ca6e2" +dependencies = [ + "nu-ansi-term", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pyo3" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a89dc7a5850d0e983be1ec2a463a171d20990487c3cfcd68b5363f1ee3d6fe0" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "parking_lot", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07426f0d8fe5a601f26293f300afd1a7b1ed5e78b2a705870c5f30893c5163be" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb7dec17e17766b46bca4f1a4215a85006b4c2ecde122076c562dd058da6cf1" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f738b4e40d50b5711957f142878cfa0f28e054aa0ebdfc3fd137a843f74ed3" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc910d4851847827daf9d6cdd4a823fbdaab5b8818325c5e97a86da79e8881f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[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 = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" + +[[package]] +name = "shlex-fuzz" +version = "0.0.0" +dependencies = [ + "libfuzzer-sys", + "shlex", +] + +[[package]] +name = "smallvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unindent" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 1533360..654c2e9 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "shlex-fuzz" version = "0.0.0" -authors = ["Automatically generated"] +authors = ["see main rust-shlex Cargo.toml for authors"] publish = false edition = "2018" @@ -14,9 +14,13 @@ libfuzzer-sys = "0.4" [dependencies.shlex] path = ".." -# Prevent this from interfering with workspaces [workspace] -members = ["."] +members = [ + ".", + "fuzz_quote_real_shell", + "fuzz_quote_python", + "fuzz_quote_wordexp", +] [[bin]] name = "fuzz_next" diff --git a/fuzz/fuzz_quote_python/Cargo.toml b/fuzz/fuzz_quote_python/Cargo.toml new file mode 100644 index 0000000..4045ed2 --- /dev/null +++ b/fuzz/fuzz_quote_python/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "fuzz_quote_python" +version = "0.0.0" +authors = ["see main rust-shlex Cargo.toml for authors"] +license = "MIT OR Apache-2.0" +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +nu-pretty-hex = "0.87.1" + +[dependencies.pyo3] +version = "0.20.2" +features = ["auto-initialize"] + +[dependencies.shlex] +path = "../.." + +[build-dependencies] +cc = "1.0" + +[[bin]] +name = "fuzz_quote_python" +path = "src/fuzz.rs" +test = false +doc = false + diff --git a/fuzz/fuzz_quote_python/src/fuzz.rs b/fuzz/fuzz_quote_python/src/fuzz.rs new file mode 100644 index 0000000..4932db0 --- /dev/null +++ b/fuzz/fuzz_quote_python/src/fuzz.rs @@ -0,0 +1,56 @@ +#![no_main] +#[macro_use] extern crate libfuzzer_sys; +use shlex::try_join; +use nu_pretty_hex::pretty_hex; + +use pyo3::prelude::*; + +fn shlex_split(words: &str) -> Result, String> { + Python::with_gil(|py| { + Ok(py + .import("shlex").unwrap() + .getattr("split").unwrap() + .call1((words,)) + .map_err(|e| e.to_string())? + .extract().unwrap()) + }) +} + +fn pretty_hex_multi<'a>(strings: impl IntoIterator) -> String { + let mut res = "[\n".to_owned(); + for string in strings { + res += &pretty_hex(&string); + res.push('\n'); + } + res.push(']'); + res +} + +fuzz_target!(|unquoted: &[u8]| { + // Treat the input as a list of words separated by nul chars. + let Ok(unquoted) = std::str::from_utf8(unquoted) else { + // ignore invalid utf-8 + return; + }; + let words: Vec<&str> = unquoted.split('\0').collect(); + let quoted: String = try_join(words.iter().cloned()).unwrap(); + let res = shlex_split("ed); + + match res { + Ok(expanded) => { + if expanded != words { + panic!("original: {}\nshlex.split output:{}\nquoted:\n{}", + pretty_hex_multi(words.iter().cloned()), + pretty_hex_multi(expanded.iter().map(|x| &**x)), + pretty_hex("ed)); + } + } + Err(err) => { + panic!("original: {}\nquoted:\n{}\nshlex.split error: {}", + pretty_hex_multi(words.iter().cloned()), + pretty_hex("ed), + err); + }, + } +}); + diff --git a/fuzz/fuzz_quote_real_shell/Cargo.toml b/fuzz/fuzz_quote_real_shell/Cargo.toml new file mode 100644 index 0000000..151b4a2 --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "fuzz_quote_real_shell" +version = "0.0.0" +authors = ["see main rust-shlex Cargo.toml for authors"] +license = "MIT OR Apache-2.0" +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +rand = "0.8.4" +bstr = "1.8.0" +nu-pretty-hex = "0.87.1" + +[dependencies.shlex] +path = "../.." + +[[bin]] +name = "fuzz_quote_real_shell" +path = "src/fuzz.rs" + diff --git a/fuzz/fuzz_quote_real_shell/Dockerfile b/fuzz/fuzz_quote_real_shell/Dockerfile new file mode 100644 index 0000000..abe5d8a --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/Dockerfile @@ -0,0 +1,4 @@ +FROM alpine:latest +RUN apk update +# coreutils and strace are not needed but convenient for debugging. +RUN apk add zsh bash dash busybox strace coreutils python3 fish mksh diff --git a/fuzz/fuzz_quote_real_shell/basic-corpus/cr b/fuzz/fuzz_quote_real_shell/basic-corpus/cr new file mode 100644 index 0000000..a12847e --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/basic-corpus/cr @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fuzz/fuzz_quote_real_shell/basic-corpus/long-a b/fuzz/fuzz_quote_real_shell/basic-corpus/long-a new file mode 100644 index 0000000..94bc766 --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/basic-corpus/long-a @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/fuzz/fuzz_quote_real_shell/basic-corpus/long-random b/fuzz/fuzz_quote_real_shell/basic-corpus/long-random new file mode 100644 index 0000000000000000000000000000000000000000..872c5fd47673e058bdd928ab356c31eb156a55c8 GIT binary patch literal 100000 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%0D6jz7djiq_*8%9Y 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 literal 0 HcmV?d00001 diff --git a/fuzz/fuzz_quote_real_shell/each-shell.sh b/fuzz/fuzz_quote_real_shell/each-shell.sh new file mode 100755 index 0000000..36391cd --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/each-shell.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env zsh +# Run a command for each of several configurations. +# Example: +# ./each-shell.sh 'cargo fuzz run --fuzz-dir . fuzz_quote_real_shell basic-corpus/*' +# ./each-shell.sh 'nohup cargo fuzz run --fuzz-dir . fuzz_quote_real_shell >&/tmp/out.$ident &' + +# TODO: This could be handled better. The choice of shell should probably just +# be part of the fuzz input. + +shells=( + 'zsh --no-rcs' + 'bash --norc' + 'dash +m' + 'fish --private --no-config' + 'mksh' +) + +running_on_linux=1 +if [[ `uname` == Darwin && "$FUZZ_USE_DOCKER" == 0 ]]; then + running_on_linux=0 +fi +# Add busybox unless we're running natively on macOS, since busybox doesn't run +# on macOS. +# (If you're on Linux but it's not installed, then too bad, install it.) +if (( running_on_linux )); then + shells+=('busybox ash +m') +fi +# Gather existing FUZZ_* environment variables just to make it easier to copy +# and paste individual commands from the debug output: +already_set=$(export | grep '^FUZZ_' | tr '\n' ' ') +for shell in $shells; do + for interactive in '-i' '+i'; do + for pty in 0 1; do + for lang in C en_US.UTF-8; do + ident="${shell%% *}.$interactive.pty$pty.$lang" + if [[ $shell == fish* && $ident != fish.-i.pty1.* ]]; then + # fish must have a pty because otherwise it buffers the + # entire stdin rather than responding live; and it must + # have -i because +i doesn't actually work. + continue + fi + if [[ $ident == zsh.-i.pty0.* ]]; then + # zsh in interactive mode forces the use of the tty instead of + # using stdin/stdout, so we can't test it without a pty. + continue + fi + if [[ $ident == zsh.+i.pty1.* && $running_on_linux == 0 ]]; then + # Fails due to a macOS kernel bug(?). In zsh, `shingetchar` + # really does not want to read past a newline. Instead of just + # just buffering any excess data, it uses a weird scheme where + # it tries a no-op lseek on the input fd. If that succeeds, it + # calls `read` with some reasonable buffer size and then, if it + # read too many bytes (i.e. past a newline), it lseeks + # backwards to the newline. If the no-op lseek fails, it falls + # back to reading one byte at a time. On macOS, lseek on a pty + # succeeds even though it does not do anything meaningful. + # Pipes don't have this issue. + continue + fi + prefix="FUZZ_USE_PTY=$pty FUZZ_SHELL=\"env LANG=$lang $shell $interactive\" " + echo ">> ${already_set}ident='$ident' $prefix $*" + eval "$prefix $*" || { + echo "FAIL: $ident" + exit 1 + } + done + done + done +done +echo 'all ok' diff --git a/fuzz/fuzz_quote_real_shell/src/fuzz.rs b/fuzz/fuzz_quote_real_shell/src/fuzz.rs new file mode 100644 index 0000000..bb6d71b --- /dev/null +++ b/fuzz/fuzz_quote_real_shell/src/fuzz.rs @@ -0,0 +1,419 @@ +#![no_main] +#[macro_use] extern crate libfuzzer_sys; +use std::sync::mpsc::{self, RecvTimeoutError}; +use std::thread; +use std::io::{Read, Write}; +use std::cell::RefCell; +use std::process::{Command, Stdio, ChildStdin}; +use std::time::Duration; +use std::sync::OnceLock; + +use rand::{distributions::Alphanumeric, Rng}; +use bstr::ByteSlice; +use nu_pretty_hex::pretty_hex; + +use shlex::bytes; + +#[derive(PartialEq, Debug)] +enum CompatMode { + Bash, + Zsh, + Dash, + BusyboxAsh, + Fish, + Mksh, + Other +} + +fn env_var_or(var: &str, default: &str) -> String { + match std::env::var(var) { + Ok(s) => s, + Err(std::env::VarError::NotPresent) => default.into(), + Err(std::env::VarError::NotUnicode(_)) => panic!("unicode"), + } +} + +fn env_bool(var: &str, default: bool) -> bool { + match &*env_var_or(var, "") { + "" => default, + "0" => false, + "1" => true, + _ => panic!("{} should be 0 or 1", var), + } +} + +fn env_u64(var: &str, default: u64) -> u64 { + match &*env_var_or(var, "") { + "" => default, + x => x.parse().unwrap(), + } +} + +struct Config { + fuzz_shell: String, + debug: bool, + use_docker: bool, + use_pty: bool, + cooked_pty: bool, // just for experimentation; this is expected to fail + compat_mode: CompatMode, + shell_is_interactive: bool, + fuzz_timeout: u64, +} + +static CONFIG: OnceLock = OnceLock::new(); +impl Config { + fn get() -> &'static Config { + CONFIG.get_or_init(|| { + let fuzz_shell = env_var_or("FUZZ_SHELL", "zsh --no-rcs"); + let use_pty = env_bool("FUZZ_USE_PTY", true); + let shell_is_interactive = env_bool("FUZZ_SHELL_IS_INTERACTIVE", { + // default: guess -i/+i from the string (very crude) + if fuzz_shell.contains(" -i") { + true + } else if fuzz_shell.contains(" +i") { + false + } else { + use_pty + } + }); + let compat_mode = match &*env_var_or("FUZZ_COMPAT_MODE", "") { + "bash" => CompatMode::Bash, + "zsh" => CompatMode::Zsh, + "dash" => CompatMode::Dash, + "busybox ash" => CompatMode::BusyboxAsh, + "fish" => CompatMode::Fish, + "mksh" => CompatMode::Mksh, + "other" => CompatMode::Other, + "" => { + // default: guess the shell from the string (somewhat dumbly) + if fuzz_shell.contains("bash") { + CompatMode::Bash + } else if fuzz_shell.contains("zsh") { + CompatMode::Zsh + } else if fuzz_shell.contains("dash") { + CompatMode::Dash + } else if fuzz_shell.contains("ash") { + CompatMode::BusyboxAsh + } else if fuzz_shell.contains("fish") { + CompatMode::Fish + } else if fuzz_shell.contains("mksh") { + CompatMode::Mksh + } else { + CompatMode::Other + } + }, + _ => panic!("invalid FUZZ_COMPAT_MODE") + }; + Config { + debug: env_bool("FUZZ_DEBUG", false), + use_docker: env_bool("FUZZ_USE_DOCKER", true), + use_pty, + cooked_pty: env_bool("FUZZ_COOKED_PTY", false), + compat_mode, + fuzz_shell, + shell_is_interactive, + fuzz_timeout: env_u64("FUZZ_TIMEOUT", 120), + } + }) + } +} + + +struct Shell { + stdout_receiver: mpsc::Receiver>, + stdout_buf: Vec, + stdin: ChildStdin, +} +impl Shell { + fn new() -> Shell { + let config = Config::get(); + let mut real_shell = config.fuzz_shell.clone(); + real_shell = format!("{} 2>&1", real_shell); + #[cfg(target_os = "macos")] + if !config.use_docker { + // Provide some protection for native macOS execution. Not actually secure (it doesn't + // block IPC) but should be good enough against _accidental_ bad commands. Probably. + let sandbox_profile = r#""" + (version 1) + (allow default) + (deny file-write*) + (allow file-write-data (literal "/dev/null")) + """#; + real_shell = format!("sandbox-exec -p {} sh -c {}", + shlex::try_quote(sandbox_profile).unwrap(), + shlex::try_quote(&real_shell).unwrap()); + } + if config.use_pty { + // Use python3 to set up a pty. Don't do it locally because then we're validating the + // pty relay layer of Docker for Mac and I've had issues with it. + real_shell = format!("exec python3 -c 'import sys, pty; exit(pty.spawn(sys.argv[1:]))' sh -c 'stty sane {} -echo; exec '{}", + if config.cooked_pty { "cooked" } else { "raw" }, + shlex::try_quote(&real_shell).unwrap()); + //real_shell = format!(r#"CMD={} socat -b1 - 'EXEC:sh -c "\"eval \\\"$CMD\\\"\"",pty,sane,raw,echo=0,nonblock'"#, shlex::quote(&real_shell)); + } + if config.use_docker { + // By default, run in a Docker container so that we don't cause random commands to be + // run on the host (if quoting is buggy), or clutter up the shell history file for + // interactive shells. + real_shell = format!("docker run --rm --log-opt max-size=1m -i {} $(docker build -q - < {}/Dockerfile) sh -c {}", + env_var_or("FUZZ_DOCKER_ARGS", ""), + shlex::try_quote(env!("CARGO_MANIFEST_DIR")).unwrap(), + shlex::try_quote(&real_shell).unwrap()); + } + if config.debug { + println!("=> {}", real_shell); + } + let cmd = Command::new("/bin/sh") + .arg("-c") + .arg(real_shell) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .expect("failed to execute shell"); + let mut stdout = cmd.stdout.unwrap(); + let stdin = cmd.stdin.unwrap(); + let (sender, receiver) = mpsc::channel(); + + // Read stdout on a separate thread to avoid deadlocking on pipe buffers. + thread::spawn(move || { + loop { + let mut buf: Vec = Vec::new(); + buf.resize(128, 0u8); + let size = stdout.read(&mut buf).expect("failed to read stdout"); + if size == 0 { + break; + } + buf.truncate(size); + if sender.send(buf).is_err() { break; } + } + }); + + let mut this = Shell { stdout_receiver: receiver, stdout_buf: Vec::new(), stdin }; + + this.wait_until_responsive(); + this + } + + // Keep reading until we find `delim`; return the output without `delim`. + fn read_until_delim(&mut self, delim: &[u8], timeout: Duration) -> Result, RecvTimeoutError> { + let mut pos = 0; + loop { + if Config::get().debug { + println!("READ: {}", pretty_hex(&self.stdout_buf)); + //println!(">> wanted: {}", pretty_hex(&delim)); + //if self.stdout_buf.find(b"zsh: no such event").is_some() { panic!("xxx"); } + } + if let Some(delim_pos) = self.stdout_buf[pos..].find(delim) { + let ret = self.stdout_buf[..pos + delim_pos].to_owned(); + self.stdout_buf.drain(0..(pos + delim_pos + delim.len())); + return Ok(ret); + } + pos = self.stdout_buf.len().saturating_sub(delim.len() - 1); + let new_data = self.stdout_receiver.recv_timeout(timeout)?; + self.stdout_buf.extend_from_slice(&new_data); + } + } + + // Write something. + fn write(&mut self, text: &[u8]) { + if Config::get().debug { + println!("WROTE: {}", pretty_hex(&text)); + } + self.stdin.write_all(text).expect("failed to write to shell stdin"); + self.stdin.flush().expect("failed to flush shell stdin"); // shouldn't be necessary + } + + // Wait until the shell listens to us. Also disable history logging in case this is an + // interactive shell. + fn wait_until_responsive(&mut self) { + let unset_histfile: &[u8] = if let CompatMode::Fish = Config::get().compat_mode { + b"" + } else { + b"; unset HISTFILE" + }; + for _ in 0..60 { + let delimiter = random_alphanum(); + self.write(&[ + b"echo ", + &delimiter[..1], + b"''", + &delimiter[1..], + unset_histfile, + b"\n", + ].concat()); + match self.read_until_delim(&delimiter, Duration::from_millis(500)) { + Ok(_) => return, + Err(RecvTimeoutError::Timeout) => (), + Err(RecvTimeoutError::Disconnected) => panic!("shell exited"), + } + }; + panic!("timeout waiting for shell to be responsive"); + } +} + +/// Return a byte string of 10 random alphanumeric characters. +/// +/// Used as delimiters around the stuff we actually want to quote. +/// +/// Using `rand` makes the fuzzer slightly less reproducible, but the specific string chosen +/// shouldn't make a difference, and having it be different every time reduces the chance of false +/// positive matches with interactive shells, in case the delimiter gets into shell history and +/// then the shell prints it as part of some autocompletion routine. +/// +/// (Though in theory, unsetting HISTFILE as done above should be enough to prevent it from getting +/// into shell history in the first place.) +fn random_alphanum() -> Vec { + rand::thread_rng() + .sample_iter(&Alphanumeric) + .take(10) + .collect() +} + +thread_local! { + static SHELL: RefCell = RefCell::new(Shell::new()); +} + +fuzz_target!(|unquoted: &[u8]| { + let mut unquoted: Vec = unquoted.into(); + { + // Strip nul characters. + for byte in unquoted.iter_mut() { + if *byte == 0 { + *byte = b'x'; + } + } + } + let config = Config::get(); + + /* + TODO: + let length_limit = match config.compat_mode { + // zsh in interactive mode gets very slow for long inputs. + CompatMode::Zsh if config.shell_is_interactive => Some(1024), + // busybox ash has a line length limit when reading from a pty (and we need to be + // conservative since this length is pre-quoting). + CompatMode::BusyboxAsh if config.use_pty => Some(256), + // Otherwise no length limit. + _ => None + }; + */ + let length_limit = Some(256); + + if let Some(limit) = length_limit { + unquoted.truncate(limit); + } + + // Disable certain types of input for shells that can't handle them. + // This is perhaps unnecessarily tightly dialed in to the quirks of specific shells, but I've + // found this helpful as a way understand those shells' behavior better. + + // Strip control characters in pty mode because they are special there and we cannot quote them + // properly while being POSIX-compatible (see crate documentation). + // And bash tries to interpret them even without a pty in interactive mode. + let strip_controls = config.use_pty || + (config.compat_mode == CompatMode::Bash && config.shell_is_interactive); + + // Strip \r in cases where shells turns it into \n. + // - bash: happens in interactive mode, using a pty, or both + // - zsh: happens if using a pty (can't test interactive mode without pty) + // - busybox ash: happens if using a pty (not in interactive mode) + // - fish: actually turns \n into \r\n, but we need to strip it from input + // In all cases, I verified using strace that this is happening in the shell rather than in the + // kernel's tty layer. The tty layer can be configured to do things like that, but apparently + // it's not the default. + let strip_crs = match config.compat_mode { + CompatMode::Bash => config.use_pty || config.shell_is_interactive, + CompatMode::Zsh | CompatMode::BusyboxAsh => config.use_pty, + CompatMode::Fish => config.use_pty, + CompatMode::Mksh => config.use_pty, + _ => false + }; + + // Ignore \r added by the shell. This assumes strip_crs is also on. + let ignore_added_crs = match config.compat_mode { + CompatMode::Fish => config.use_pty, + _ => false + }; + + // Strip characters with the high bit set only if the string as a whole is invalid UTF-8, + // because: + // - bash: sometimes strips bytes at the end that could be the beginning of a UTF-8 + // sequence, again if in interactive mode and/or using a pty + // XXX and also valid UTF-8? + // - zsh: goes through multibyte routines and will replace invalid characters with + // question marks, only if interactive + // - busybox ash: something similar, only if using a pty + // - fish: ditto + // Again, can't deal with this properly while being POSIX-compatible. (In theory we could make + // them safer by quoting, so the question marks wouldn't be treated as glob characters, but the + // string still wouldn't round-trip properly, so don't bother.) + let is_invalid_utf8 = std::str::from_utf8(&unquoted).is_err(); + let strip_8bit = match config.compat_mode { + CompatMode::Bash => config.use_pty || config.shell_is_interactive, + CompatMode::Zsh => config.shell_is_interactive && is_invalid_utf8, + CompatMode::BusyboxAsh | + CompatMode::Fish | + CompatMode::Mksh => config.use_pty && is_invalid_utf8, + CompatMode::Dash | + CompatMode::Other => false, + }; + + for byte in unquoted.iter_mut() { + if (strip_controls && byte.is_ascii_control() && *byte != b'\r' && *byte != b'\n') || + (*byte == b'\0') || + (strip_crs && *byte == b'\r') || + (strip_8bit && *byte >= 0x80) { + *byte = b'a' + (*byte % 26); + } + } + + //println!("len={}", unquoted.len()); + + // We already filtered out nul bytes so this should be successful. + let quoted = bytes::try_quote(&unquoted).unwrap(); + + SHELL.with(|ref_shell| { + let mut shell = ref_shell.borrow_mut(); + // Add a random prefix and suffix to ensure we can identify the output while ignoring the shell + // prompt. The prefix and suffix are alphanumeric so they don't need to be quoted. They are + // placed outside the double quotes just in case any shell cares about something being the + // first or last character in a double-quoted string (though it shouldn't). + // Also break up the prefix and suffix so that we don't get them back from shell echo. + let mut alphanum_prefix = random_alphanum(); + let mut alphanum_suffix = random_alphanum(); + // Add the literal string PREFIX to the end of the prefix, and SUFFIX to the start of the + // suffix, to make them more recognizable. + alphanum_prefix.extend_from_slice(b"PREFIX"); + alphanum_suffix.splice(0..0, *b"SUFFIX"); + // Write the command: + // printf %s "AAAPREFIX***SUFFIXBBB" + // ^^^---------------------random prefix + // ^^^------------quoted string + // ^^^---random suffix + let full_command = [ + b"printf %s ", + &alphanum_prefix[..1], + b"\"\"", + &alphanum_prefix[1..], + "ed, + &alphanum_suffix[..1], + b"\"\"", + &alphanum_suffix[1..], + b"\n" + ].concat(); + shell.write(&full_command); + let read_data = shell.read_until_delim(&alphanum_suffix, Duration::from_secs(config.fuzz_timeout)).unwrap(); + let prefix_pos = read_data.find(&alphanum_prefix).expect("did not find prefix"); + let mut read_data = &read_data[prefix_pos + alphanum_prefix.len() ..]; + let buf: Vec; + //println!("read back {} bytes", read_data.len()); + if ignore_added_crs { + buf = read_data.iter().cloned().filter(|&c| c != b'\r').collect(); + read_data = &buf[..]; + } + if read_data != unquoted { + panic!("original:\n{}\nread from shell:\n{}\nquoted:\n{}", + pretty_hex(&unquoted), pretty_hex(&read_data), pretty_hex("ed)); + } + }) +}); diff --git a/fuzz/fuzz_quote_wordexp/Cargo.toml b/fuzz/fuzz_quote_wordexp/Cargo.toml new file mode 100644 index 0000000..227431a --- /dev/null +++ b/fuzz/fuzz_quote_wordexp/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "fuzz_quote_wordexp" +version = "0.0.0" +authors = ["see main rust-shlex Cargo.toml for authors"] +license = "MIT OR Apache-2.0" +publish = false +edition = "2021" + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +nu-pretty-hex = "0.87.1" + +[dependencies.shlex] +path = "../.." + +[build-dependencies] +cc = "1.0" + +[[bin]] +name = "fuzz_quote_wordexp" +path = "src/fuzz.rs" +test = false +doc = false + diff --git a/fuzz/fuzz_quote_wordexp/build.rs b/fuzz/fuzz_quote_wordexp/build.rs new file mode 100644 index 0000000..938d843 --- /dev/null +++ b/fuzz/fuzz_quote_wordexp/build.rs @@ -0,0 +1,7 @@ +fn main() { + println!("cargo:rerun-if-changed=src/wordexp_wrapper.c"); + cc::Build::new() + .file("src/wordexp_wrapper.c") + .compile("wordexp_wrapper"); +} + diff --git a/fuzz/fuzz_quote_wordexp/src/fuzz.rs b/fuzz/fuzz_quote_wordexp/src/fuzz.rs new file mode 100644 index 0000000..e8fd11f --- /dev/null +++ b/fuzz/fuzz_quote_wordexp/src/fuzz.rs @@ -0,0 +1,79 @@ +#![no_main] +#[macro_use] extern crate libfuzzer_sys; +use shlex::bytes::try_join; +use std::ptr; +use std::ffi::{c_char, CStr, CString}; +use nu_pretty_hex::pretty_hex; + +extern "C" { + // wordexp_wrapper.c + fn wordexp_wrapper(words: *const c_char, wordv_p: *mut *mut *mut c_char, wordc_p: *mut usize) -> *const c_char; + fn wordfree_wrapper(); +} + +fn wordexp(words: Vec) -> Result>, String> { + unsafe { + let mut wordv: *mut *mut c_char = ptr::null_mut(); + let mut wordc: usize = 0; + let cwords = CString::new(words).unwrap(); + let err = wordexp_wrapper(cwords.as_ptr(), &mut wordv, &mut wordc); + if err.is_null() { + // success + let mut ret = Vec::new(); + for i in 0..wordc { + ret.push(CStr::from_ptr(*wordv.add(i)).to_bytes().to_owned()); + } + wordfree_wrapper(); + Ok(ret) + } else { + Err(CStr::from_ptr(err).to_string_lossy().to_string()) + } + } +} + +fn pretty_hex_multi<'a>(strings: impl IntoIterator) -> String { + let mut res = "[\n".to_owned(); + for string in strings { + res += &pretty_hex(&string); + res.push('\n'); + } + res.push(']'); + res +} + +fuzz_target!(|unquoted: &[u8]| { + // Treat the input as a list of words separated by nul chars. + let words: Vec<&[u8]> = unquoted.split(|&c| c == b'\0').collect(); + let quoted: Vec = try_join(words.iter().cloned()).unwrap(); + + let res = wordexp(quoted.clone()); + + match res { + Ok(expanded) => { + if expanded != words { + panic!("original: {}\nwordexp output:{}\nquoted:\n{}", + pretty_hex_multi(words.iter().cloned()), + pretty_hex_multi(expanded.iter().map(|x| &**x)), + pretty_hex("ed)); + } + } + Err(err) => { + #[cfg(target_os = "macos")] + if quoted.contains(&b'`') { + // macOS wordexp bug + return; + } + + if err == "WRDE_NOSPACE" { + // Input is probably too long. + return; + } + + panic!("original: {}\nquoted:\n{}\nwordexp error: {}", + pretty_hex_multi(words.iter().cloned()), + pretty_hex("ed), + err); + }, + } +}); + diff --git a/fuzz/fuzz_quote_wordexp/src/wordexp_wrapper.c b/fuzz/fuzz_quote_wordexp/src/wordexp_wrapper.c new file mode 100644 index 0000000..aea7242 --- /dev/null +++ b/fuzz/fuzz_quote_wordexp/src/wordexp_wrapper.c @@ -0,0 +1,23 @@ +#include +#include + +static _Thread_local wordexp_t we; + +const char *wordexp_wrapper(const char *words, char ***wordv_p, size_t *wordc_p) { + int res = wordexp(words, &we, WRDE_NOCMD | WRDE_SHOWERR | WRDE_UNDEF); + *wordv_p = we.we_wordv; + *wordc_p = we.we_wordc; + switch (res) { + case 0: return NULL; + case WRDE_BADCHAR: return "WRDE_BADCHAR"; + case WRDE_BADVAL: return "WRDE_BADVAL"; + case WRDE_CMDSUB: return "WRDE_CMDSUB"; + case WRDE_NOSPACE: return "WRDE_NOSPACE"; + case WRDE_SYNTAX: return "WRDE_SYNTAX"; + default: return "[unknown wordexp error]"; + } +} + +void wordfree_wrapper() { + wordfree(&we); +} diff --git a/fuzz/fuzz_targets/fuzz_next.rs b/fuzz/fuzz_targets/fuzz_next.rs index 64b7a2a..d93ed0c 100644 --- a/fuzz/fuzz_targets/fuzz_next.rs +++ b/fuzz/fuzz_targets/fuzz_next.rs @@ -5,6 +5,6 @@ use shlex::Shlex; fuzz_target!(|data: &[u8]| { if let Ok(s) = std::str::from_utf8(data) { let mut sh = Shlex::new(s); - while let Some(word) = sh.next() {} + while let Some(_word) = sh.next() {} } }); diff --git a/src/bytes.rs b/src/bytes.rs index 8d86ac2..af8daad 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -17,7 +17,7 @@ //! //! // `\x80` is invalid in UTF-8. //! let os_str = OsStr::from_bytes(b"a\x80b c"); -//! assert_eq!(quote(os_str.as_bytes()), &b"\"a\x80b c\""[..]); +//! assert_eq!(quote(os_str.as_bytes()), &b"'a\x80b c'"[..]); //! } //! ``` //! @@ -30,6 +30,10 @@ use alloc::borrow::Cow; use alloc::vec; #[cfg(test)] use alloc::borrow::ToOwned; +#[cfg(all(doc, not(doctest)))] +use crate::{self as shlex, quoting_warning}; + +use super::QuoteError; /// An iterator that takes an input byte string and splits it into the words using the same syntax as /// the POSIX shell. @@ -159,50 +163,345 @@ pub fn split(in_bytes: &[u8]) -> Option>> { if shl.had_error { None } else { Some(res) } } -/// Given a single word, return a byte string suitable to encode it as a shell argument. +/// A more configurable interface to quote strings. If you only want the default settings you can +/// use the convenience functions [`try_quote`] and [`try_join`]. /// -/// If given valid UTF-8, this will never produce invalid UTF-8. This is because it only -/// ever inserts valid ASCII characters before or after existing ASCII characters (or -/// returns two double quotes if the input was an empty string). It will never modify a -/// multibyte UTF-8 character. -pub fn quote(in_bytes: &[u8]) -> Cow<[u8]> { - if in_bytes.len() == 0 { - b"\"\""[..].into() - } else if in_bytes.iter().any(|c| match *c as char { - '|' | '&' | ';' | '<' | '>' | '(' | ')' | '$' | '`' | '\\' | '"' | '\'' | ' ' | '\t' | - '\r' | '\n' | '*' | '?' | '[' | '#' | '~' | '=' | '%' | '{' | '}' | - '\u{80}' ..= '\u{10ffff}' => true, - _ => false - }) { +/// The string equivalent is [`shlex::Quoter`]. +#[derive(Default, Debug, Clone)] +pub struct Quoter { + allow_nul: bool, + // TODO: more options +} + +impl Quoter { + /// Create a new [`Quoter`] with default settings. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Set whether to allow [nul bytes](quoting_warning#nul-bytes). By default they are not + /// allowed and will result in an error of [`QuoteError::Nul`]. + #[inline] + pub fn allow_nul(mut self, allow: bool) -> Self { + self.allow_nul = allow; + self + } + + /// Convenience function that consumes an iterable of words and turns it into a single byte string, + /// quoting words when necessary. Consecutive words will be separated by a single space. + pub fn join<'a, I: IntoIterator>(&self, words: I) -> Result, QuoteError> { + Ok(words.into_iter() + .map(|word| self.quote(word)) + .collect::>, QuoteError>>()? + .join(&b' ')) + } + + /// Given a single word, return a byte string suitable to encode it as a shell argument. + /// + /// If given valid UTF-8, this will never produce invalid UTF-8. This is because it only + /// ever inserts valid ASCII characters before or after existing ASCII characters (or + /// returns two single quotes if the input was an empty string). It will never modify a + /// multibyte UTF-8 character. + pub fn quote<'a>(&self, mut in_bytes: &'a [u8]) -> Result, QuoteError> { + if in_bytes.is_empty() { + // Empty string. Special case that isn't meaningful as only part of a word. + return Ok(b"''"[..].into()); + } + if !self.allow_nul && in_bytes.iter().any(|&b| b == b'\0') { + return Err(QuoteError::Nul); + } let mut out: Vec = Vec::new(); - out.push(b'"'); - for &c in in_bytes { - match c { - b'$' | b'`' | b'"' | b'\\' => out.push(b'\\'), - _ => () + while !in_bytes.is_empty() { + // Pick a quoting strategy for some prefix of the input. Normally this will cover the + // entire input, but in some case we might need to divide the input into multiple chunks + // that are quoted differently. + let (cur_len, strategy) = quoting_strategy(in_bytes); + if cur_len == in_bytes.len() && strategy == QuotingStrategy::Unquoted && out.is_empty() { + // Entire string can be represented unquoted. Reuse the allocation. + return Ok(in_bytes.into()); + } + let (cur_chunk, rest) = in_bytes.split_at(cur_len); + assert!(rest.len() < in_bytes.len()); // no infinite loop + in_bytes = rest; + append_quoted_chunk(&mut out, cur_chunk, strategy); + } + Ok(out.into()) + } + +} + +#[derive(PartialEq)] +enum QuotingStrategy { + /// No quotes and no backslash escapes. (If backslash escapes would be necessary, we use a + /// different strategy instead.) + Unquoted, + /// Single quoted. + SingleQuoted, + /// Double quotes, potentially with backslash escapes. + DoubleQuoted, + // TODO: add $'xxx' and "$(printf 'xxx')" styles +} + +/// Is this ASCII byte okay to emit unquoted? +const fn unquoted_ok(c: u8) -> bool { + match c as char { + // Allowed characters: + '+' | '-' | '.' | '/' | ':' | '@' | ']' | '_' | + '0'..='9' | 'A'..='Z' | 'a'..='z' + => true, + + // Non-allowed characters: + // From POSIX https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html + // "The application shall quote the following characters if they are to represent themselves:" + '|' | '&' | ';' | '<' | '>' | '(' | ')' | '$' | '`' | '\\' | '"' | '\'' | ' ' | '\t' | '\n' | + // "and the following may need to be quoted under certain circumstances[..]:" + '*' | '?' | '[' | '#' | '~' | '=' | '%' | + // Brace expansion. These ought to be in the POSIX list but aren't yet; + // see: https://www.austingroupbugs.net/view.php?id=1193 + '{' | '}' | + // Also quote comma, just to be safe in the extremely odd case that the user of this crate + // is intentionally placing a quoted string inside a brace expansion, e.g.: + // format!("echo foo{{a,b,{}}}" | shlex::quote(some_str)) + ',' | + // '\r' is allowed in a word by all real shells I tested, but is treated as a word + // separator by Python `shlex` | and might be translated to '\n' in interactive mode. + '\r' | + // '!' and '^' are treated specially in interactive mode; see quoting_warning. + '!' | '^' | + // Nul bytes and control characters. + '\x00' ..= '\x1f' | '\x7f' + => false, + '\u{80}' ..= '\u{10ffff}' => { + // This is unreachable since `unquoted_ok` is only called for 0..128. + // Non-ASCII bytes are handled separately in `quoting_strategy`. + // Can't call unreachable!() from `const fn` on old Rust, so... + unquoted_ok(c) + }, + } + // Note: The logic cited above for quoting comma might suggest that `..` should also be quoted, + // it as a special case of brace expansion). But it's not necessary. There are three cases: + // + // 1. The user wants comma-based brace expansion, but the untrusted string being `quote`d + // contains `..`, so they get something like `{foo,bar,3..5}`. + // => That's safe; both Bash and Zsh expand this to `foo bar 3..5` rather than + // `foo bar 3 4 5`. The presence of commas disables sequence expression expansion. + // + // 2. The user wants comma-based brace expansion where the contents of the braces are a + // variable number of `quote`d strings and nothing else. There happens to be exactly + // one string and it contains `..`, so they get something like `{3..5}`. + // => Then this will expand as a sequence expression, which is unintended. But I don't mind, + // because any such code is already buggy. Suppose the untrusted string *didn't* contain + // `,` or `..`, resulting in shell input like `{foo}`. Then the shell would interpret it + // as the literal string `{foo}` rather than brace-expanding it into `foo`. + // + // 3. The user wants a sequence expression and wants to supply an untrusted string as one of + // the endpoints or the increment. + // => Well, that's just silly, since the endpoints can only be numbers or single letters. +} + +/// Optimized version of `unquoted_ok`. +fn unquoted_ok_fast(c: u8) -> bool { + const UNQUOTED_OK_MASK: u128 = { + // Make a mask of all bytes in 0..<0x80 that pass. + let mut c = 0u8; + let mut mask = 0u128; + while c < 0x80 { + if unquoted_ok(c) { + mask |= 1u128 << c; } - out.push(c); + c += 1; } - out.push(b'"'); - out.into() + mask + }; + ((UNQUOTED_OK_MASK >> c) & 1) != 0 +} + +/// Is this ASCII byte okay to emit in single quotes? +fn single_quoted_ok(c: u8) -> bool { + match c { + // No single quotes in single quotes. + b'\'' => false, + // To work around a Bash bug, ^ is only allowed right after an opening single quote; see + // quoting_warning. + b'^' => false, + // Backslashes in single quotes are literal according to POSIX, but Fish treats them as an + // escape character. Ban them. Fish doesn't aim to be POSIX-compatible, but we *can* + // achieve Fish compatibility using double quotes, so we might as well. + b'\\' => false, + _ => true + } +} + +/// Is this ASCII byte okay to emit in double quotes? +fn double_quoted_ok(c: u8) -> bool { + match c { + // Work around Python `shlex` bug where parsing "\`" and "\$" doesn't strip the + // backslash, even though POSIX requires it. + b'`' | b'$' => false, + // '!' and '^' are treated specially in interactive mode; see quoting_warning. + b'!' | b'^' => false, + _ => true + } +} + +/// Given an input, return a quoting strategy that can cover some prefix of the string, along with +/// the size of that prefix. +/// +/// Precondition: input size is nonzero. (Empty strings are handled by the caller.) +/// Postcondition: returned size is nonzero. +#[cfg_attr(manual_codegen_check, inline(never))] +fn quoting_strategy(in_bytes: &[u8]) -> (usize, QuotingStrategy) { + const UNQUOTED_OK: u8 = 1; + const SINGLE_QUOTED_OK: u8 = 2; + const DOUBLE_QUOTED_OK: u8 = 4; + + let mut prev_ok = SINGLE_QUOTED_OK | DOUBLE_QUOTED_OK | UNQUOTED_OK; + let mut i = 0; + + if in_bytes[0] == b'^' { + // To work around a Bash bug, ^ is only allowed right after an opening single quote; see + // quoting_warning. + prev_ok = SINGLE_QUOTED_OK; + i = 1; + } + + while i < in_bytes.len() { + let c = in_bytes[i]; + let mut cur_ok = prev_ok; + + if c >= 0x80 { + // Normally, non-ASCII characters shouldn't require quoting, but see quoting_warning.md + // about \xa0. For now, just treat all non-ASCII characters as requiring quotes. This + // also ensures things are safe in the off-chance that you're in a legacy 8-bit locale that + // has additional characters satisfying `isblank`. + cur_ok &= !UNQUOTED_OK; + } else { + if !unquoted_ok_fast(c) { + cur_ok &= !UNQUOTED_OK; + } + if !single_quoted_ok(c){ + cur_ok &= !SINGLE_QUOTED_OK; + } + if !double_quoted_ok(c) { + cur_ok &= !DOUBLE_QUOTED_OK; + } + } + + if cur_ok == 0 { + // There are no quoting strategies that would work for both the previous characters and + // this one. So we have to end the chunk before this character. The caller will call + // `quoting_strategy` again to handle the rest of the string. + break; + } + + prev_ok = cur_ok; + i += 1; + } + + // Pick the best allowed strategy. + let strategy = if prev_ok & UNQUOTED_OK != 0 { + QuotingStrategy::Unquoted + } else if prev_ok & SINGLE_QUOTED_OK != 0 { + QuotingStrategy::SingleQuoted + } else if prev_ok & DOUBLE_QUOTED_OK != 0 { + QuotingStrategy::DoubleQuoted } else { - in_bytes.into() + unreachable!() + }; + debug_assert!(i > 0); + (i, strategy) +} + +fn append_quoted_chunk(out: &mut Vec, cur_chunk: &[u8], strategy: QuotingStrategy) { + match strategy { + QuotingStrategy::Unquoted => { + out.extend_from_slice(cur_chunk); + }, + QuotingStrategy::SingleQuoted => { + out.reserve(cur_chunk.len() + 2); + out.push(b'\''); + out.extend_from_slice(cur_chunk); + out.push(b'\''); + }, + QuotingStrategy::DoubleQuoted => { + out.reserve(cur_chunk.len() + 2); + out.push(b'"'); + for &c in cur_chunk.into_iter() { + if let b'$' | b'`' | b'"' | b'\\' = c { + // Add a preceding backslash. + // Note: We shouldn't actually get here for $ and ` because they don't pass + // `double_quoted_ok`. + out.push(b'\\'); + } + // Add the character itself. + out.push(c); + } + out.push(b'"'); + }, } } /// Convenience function that consumes an iterable of words and turns it into a single byte string, /// quoting words when necessary. Consecutive words will be separated by a single space. -pub fn join<'a, I: core::iter::IntoIterator>(words: I) -> Vec { - words.into_iter() - .map(quote) - .collect::>() - .join(&b' ') +/// +/// Uses default settings except that nul bytes are passed through, which [may be +/// dangerous](quoting_warning#nul-bytes), leading to this function being deprecated. +/// +/// Equivalent to [`Quoter::new().allow_nul(true).join(words).unwrap()`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The string equivalent is [shlex::join]. +#[deprecated(since = "1.3.0", note = "replace with `try_join(words)?` to avoid nul byte danger")] +pub fn join<'a, I: IntoIterator>(words: I) -> Vec { + Quoter::new().allow_nul(true).join(words).unwrap() +} + +/// Convenience function that consumes an iterable of words and turns it into a single byte string, +/// quoting words when necessary. Consecutive words will be separated by a single space. +/// +/// Uses default settings. The only error that can be returned is [`QuoteError::Nul`]. +/// +/// Equivalent to [`Quoter::new().join(words)`](Quoter). +/// +/// The string equivalent is [shlex::try_join]. +pub fn try_join<'a, I: IntoIterator>(words: I) -> Result, QuoteError> { + Quoter::new().join(words) +} + +/// Given a single word, return a string suitable to encode it as a shell argument. +/// +/// Uses default settings except that nul bytes are passed through, which [may be +/// dangerous](quoting_warning#nul-bytes), leading to this function being deprecated. +/// +/// Equivalent to [`Quoter::new().allow_nul(true).quote(in_bytes).unwrap()`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The string equivalent is [shlex::quote]. +#[deprecated(since = "1.3.0", note = "replace with `try_quote(str)?` to avoid nul byte danger")] +pub fn quote(in_bytes: &[u8]) -> Cow<[u8]> { + Quoter::new().allow_nul(true).quote(in_bytes).unwrap() +} + +/// Given a single word, return a string suitable to encode it as a shell argument. +/// +/// Uses default settings. The only error that can be returned is [`QuoteError::Nul`]. +/// +/// Equivalent to [`Quoter::new().quote(in_bytes)`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The string equivalent is [shlex::try_quote]. +pub fn try_quote(in_bytes: &[u8]) -> Result, QuoteError> { + Quoter::new().quote(in_bytes) } #[cfg(test)] const INVALID_UTF8: &[u8] = b"\xa1"; #[cfg(test)] -const INVALID_UTF8_DOUBLEQUOTED: &[u8] = b"\"\xa1\""; +const INVALID_UTF8_SINGLEQUOTED: &[u8] = b"'\xa1'"; #[test] #[allow(invalid_from_utf8)] @@ -254,19 +553,24 @@ fn test_lineno() { } #[test] +#[allow(deprecated)] fn test_quote() { + // Validate behavior with invalid UTF-8: + assert_eq!(quote(INVALID_UTF8), INVALID_UTF8_SINGLEQUOTED); + // Replicate a few tests from lib.rs. No need to replicate all of them. + assert_eq!(quote(b""), &b"''"[..]); assert_eq!(quote(b"foobar"), &b"foobar"[..]); - assert_eq!(quote(b"foo bar"), &b"\"foo bar\""[..]); - assert_eq!(quote(b"\""), &b"\"\\\"\""[..]); - assert_eq!(quote(b""), &b"\"\""[..]); - assert_eq!(quote(INVALID_UTF8), INVALID_UTF8_DOUBLEQUOTED); + assert_eq!(quote(b"foo bar"), &b"'foo bar'"[..]); + assert_eq!(quote(b"'\""), &b"\"'\\\"\""[..]); + assert_eq!(quote(b""), &b"''"[..]); } #[test] +#[allow(deprecated)] fn test_join() { + // Validate behavior with invalid UTF-8: + assert_eq!(join(vec![INVALID_UTF8]), INVALID_UTF8_SINGLEQUOTED); + // Replicate a few tests from lib.rs. No need to replicate all of them. assert_eq!(join(vec![]), &b""[..]); - assert_eq!(join(vec![&b""[..]]), &b"\"\""[..]); - assert_eq!(join(vec![&b"a"[..], &b"b"[..]]), &b"a b"[..]); - assert_eq!(join(vec![&b"foo bar"[..], &b"baz"[..]]), &b"\"foo bar\" baz"[..]); - assert_eq!(join(vec![INVALID_UTF8]), INVALID_UTF8_DOUBLEQUOTED); + assert_eq!(join(vec![&b""[..]]), b"''"); } diff --git a/src/lib.rs b/src/lib.rs index c03db53..aa5c306 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,21 +3,37 @@ // the MIT license , at your option. This file may not be // copied, modified, or distributed except according to those terms. -//! Same idea as (but implementation not directly based on) the Python shlex module. However, this -//! implementation does not support any of the Python module's customization because it makes -//! parsing slower and is fairly useless. You only get the default settings of shlex.split, which -//! mimic the POSIX shell: -//! +//! Parse strings like, and escape strings for, POSIX shells. //! -//! This implementation also deviates from the Python version in not treating `\r` specially, which -//! I believe is more compliant. -//! -//! This is a string-friendly wrapper around the [bytes] module that works on the underlying byte -//! slices. The algorithms in this crate are oblivious to UTF-8 high bytes, so working directly -//! with bytes is a safe micro-optimization. +//! Same idea as (but implementation not directly based on) the Python shlex module. //! //! Disabling the `std` feature (which is enabled by default) will allow the crate to work in //! `no_std` environments, where the `alloc` crate, and a global allocator, are available. +//! +//! ## Warning +//! +//! The [`try_quote`]/[`try_join`] family of APIs does not quote control characters (because they +//! cannot be quoted portably). +//! +//! This is fully safe in noninteractive contexts, like shell scripts and `sh -c` arguments (or +//! even scripts `source`d from interactive shells). +//! +//! But if you are quoting for human consumption, you should keep in mind that ugly inputs produce +//! ugly outputs (which may not be copy-pastable). +//! +//! And if by chance you are piping the output of [`try_quote`]/[`try_join`] directly to the stdin +//! of an interactive shell, you should stop, because control characters can lead to arbitrary +//! command injection. +//! +//! For more information, and for information about more minor issues, please see [quoting_warning]. +//! +//! ## Compatibility +//! +//! This crate's quoting functionality tries to be compatible with **any POSIX-compatible shell**; +//! it's tested against `bash`, `zsh`, `dash`, Busybox `ash`, and `mksh`, plus `fish` (which is not +//! POSIX-compatible but close enough). +//! +//! It also aims to be compatible with Python `shlex` and C `wordexp`. #![cfg_attr(not(feature = "std"), no_std)] @@ -31,6 +47,9 @@ use alloc::vec; use alloc::borrow::ToOwned; pub mod bytes; +#[cfg(all(doc, not(doctest)))] +#[path = "quoting_warning.md"] +pub mod quoting_warning; /// An iterator that takes an input string and splits it into the words using the same syntax as /// the POSIX shell. @@ -76,27 +95,151 @@ pub fn split(in_str: &str) -> Option> { if shl.had_error { None } else { Some(res) } } -/// Given a single word, return a string suitable to encode it as a shell argument. -pub fn quote(in_str: &str) -> Cow { - match bytes::quote(in_str.as_bytes()) { - Cow::Borrowed(out) => { - // Safety: given valid UTF-8, bytes::quote() will always return valid UTF-8. - unsafe { core::str::from_utf8_unchecked(out) }.into() - } - Cow::Owned(out) => { - // Safety: given valid UTF-8, bytes::quote() will always return valid UTF-8. - unsafe { String::from_utf8_unchecked(out) }.into() +/// Errors from [`Quoter::quote`], [`Quoter::join`], etc. (and their [`bytes`] counterparts). +/// +/// By default, the only error that can be returned is [`QuoteError::Nul`]. If you call +/// `allow_nul(true)`, then no errors can be returned at all. Any error variants added in the +/// future will not be enabled by default; they will be enabled through corresponding non-default +/// [`Quoter`] options. +/// +/// ...In theory. In the unlikely event that additional classes of inputs are discovered that, +/// like nul bytes, are fundamentally unsafe to quote even for non-interactive shells, the risk +/// will be mitigated by adding corresponding [`QuoteError`] variants that *are* enabled by +/// default. +#[non_exhaustive] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum QuoteError { + /// The input contained a nul byte. In most cases, shells fundamentally [cannot handle strings + /// containing nul bytes](quoting_warning#nul-bytes), no matter how they are quoted. But if + /// you're sure you can handle nul bytes, you can call `allow_nul(true)` on the `Quoter` to let + /// them pass through. + Nul, +} + +impl core::fmt::Display for QuoteError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + QuoteError::Nul => f.write_str("cannot shell-quote string containing nul byte"), } } } +#[cfg(feature = "std")] +impl std::error::Error for QuoteError {} + +/// A more configurable interface to quote strings. If you only want the default settings you can +/// use the convenience functions [`try_quote`] and [`try_join`]. +/// +/// The bytes equivalent is [`bytes::Quoter`]. +#[derive(Default, Debug, Clone)] +pub struct Quoter { + inner: bytes::Quoter, +} + +impl Quoter { + /// Create a new [`Quoter`] with default settings. + #[inline] + pub fn new() -> Self { + Self::default() + } + + /// Set whether to allow [nul bytes](quoting_warning#nul-bytes). By default they are not + /// allowed and will result in an error of [`QuoteError::Nul`]. + #[inline] + pub fn allow_nul(mut self, allow: bool) -> Self { + self.inner = self.inner.allow_nul(allow); + self + } + + /// Convenience function that consumes an iterable of words and turns it into a single string, + /// quoting words when necessary. Consecutive words will be separated by a single space. + pub fn join<'a, I: IntoIterator>(&self, words: I) -> Result { + // Safety: given valid UTF-8, bytes::join() will always return valid UTF-8. + self.inner.join(words.into_iter().map(|s| s.as_bytes())) + .map(|bytes| unsafe { String::from_utf8_unchecked(bytes) }) + } + + /// Given a single word, return a string suitable to encode it as a shell argument. + pub fn quote<'a>(&self, in_str: &'a str) -> Result, QuoteError> { + Ok(match self.inner.quote(in_str.as_bytes())? { + Cow::Borrowed(out) => { + // Safety: given valid UTF-8, bytes::quote() will always return valid UTF-8. + unsafe { core::str::from_utf8_unchecked(out) }.into() + } + Cow::Owned(out) => { + // Safety: given valid UTF-8, bytes::quote() will always return valid UTF-8. + unsafe { String::from_utf8_unchecked(out) }.into() + } + }) + } +} + +impl From for Quoter { + fn from(inner: bytes::Quoter) -> Quoter { + Quoter { inner } + } +} + +impl From for bytes::Quoter { + fn from(quoter: Quoter) -> bytes::Quoter { + quoter.inner + } +} + /// Convenience function that consumes an iterable of words and turns it into a single string, /// quoting words when necessary. Consecutive words will be separated by a single space. +/// +/// Uses default settings except that nul bytes are passed through, which [may be +/// dangerous](quoting_warning#nul-bytes), leading to this function being deprecated. +/// +/// Equivalent to [`Quoter::new().allow_nul(true).join(words).unwrap()`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The bytes equivalent is [bytes::join]. +#[deprecated(since = "1.3.0", note = "replace with `try_join(words)?` to avoid nul byte danger")] pub fn join<'a, I: IntoIterator>(words: I) -> String { - words.into_iter() - .map(quote) - .collect::>() - .join(" ") + Quoter::new().allow_nul(true).join(words).unwrap() +} + +/// Convenience function that consumes an iterable of words and turns it into a single string, +/// quoting words when necessary. Consecutive words will be separated by a single space. +/// +/// Uses default settings. The only error that can be returned is [`QuoteError::Nul`]. +/// +/// Equivalent to [`Quoter::new().join(words)`](Quoter). +/// +/// The bytes equivalent is [bytes::try_join]. +pub fn try_join<'a, I: IntoIterator>(words: I) -> Result { + Quoter::new().join(words) +} + +/// Given a single word, return a string suitable to encode it as a shell argument. +/// +/// Uses default settings except that nul bytes are passed through, which [may be +/// dangerous](quoting_warning#nul-bytes), leading to this function being deprecated. +/// +/// Equivalent to [`Quoter::new().allow_nul(true).quote(in_str).unwrap()`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The bytes equivalent is [bytes::quote]. +#[deprecated(since = "1.3.0", note = "replace with `try_quote(str)?` to avoid nul byte danger")] +pub fn quote(in_str: &str) -> Cow { + Quoter::new().allow_nul(true).quote(in_str).unwrap() +} + +/// Given a single word, return a string suitable to encode it as a shell argument. +/// +/// Uses default settings. The only error that can be returned is [`QuoteError::Nul`]. +/// +/// Equivalent to [`Quoter::new().quote(in_str)`](Quoter). +/// +/// (That configuration never returns `Err`, so this function does not panic.) +/// +/// The bytes equivalent is [bytes::try_quote]. +pub fn try_quote(in_str: &str) -> Result, QuoteError> { + Quoter::new().quote(in_str) } #[cfg(test)] @@ -141,18 +284,75 @@ fn test_lineno() { } #[test] +#[cfg_attr(not(feature = "std"), allow(unreachable_code, unused_mut))] fn test_quote() { - assert_eq!(quote("foobar"), "foobar"); - assert_eq!(quote("foo bar"), "\"foo bar\""); - assert_eq!(quote("\""), "\"\\\"\""); - assert_eq!(quote(""), "\"\""); - assert_eq!(quote("{foo,bar}"), "\"{foo,bar}\""); + // This is a list of (unquoted, quoted) pairs. + // But it's using a single long (raw) string literal with an ad-hoc format, just because it's + // hard to read if we have to put the test strings through Rust escaping on top of the escaping + // being tested. (Even raw string literals are noisy for short strings). + // Ad-hoc: "NL" is replaced with a literal newline; no other escape sequences. + let tests = r#" + <> => <''> + => + => <'foo bar'> + <"foo bar'"> => <"\"foo bar'\""> + <'foo bar'> => <"'foo bar'"> + <"> => <'"'> + <"'> => <"\"'"> + => <'hello!world'> + <'hello!world> => <"'hello"'!world'> + <'hello!> => <"'hello"'!'> + => <'hello ''^ world'> + => + => <'!world'"'"> + <{a, b}> => <'{a, b}'> + => <'NL'> + <^> => <'^'> + => + => <'NLx''^'> + => <'NL''^x'> + => <'NL ''^x'> + <{a,b}> => <'{a,b}'> + => <'a,b'> + + <'$> => <"'"'$'> + <"^> => <'"''^'> + "#; + let mut ok = true; + for test in tests.trim().split('\n') { + let parts: Vec = test + .replace("NL", "\n") + .split("=>") + .map(|part| part.trim().trim_start_matches('<').trim_end_matches('>').to_owned()) + .collect(); + assert!(parts.len() == 2); + let unquoted = &*parts[0]; + let quoted_expected = &*parts[1]; + let quoted_actual = try_quote(&parts[0]).unwrap(); + if quoted_expected != quoted_actual { + #[cfg(not(feature = "std"))] + panic!("FAIL: for input <{}>, expected <{}>, got <{}>", + unquoted, quoted_expected, quoted_actual); + #[cfg(feature = "std")] + println!("FAIL: for input <{}>, expected <{}>, got <{}>", + unquoted, quoted_expected, quoted_actual); + ok = false; + } + } + assert!(ok); } #[test] +#[allow(deprecated)] fn test_join() { assert_eq!(join(vec![]), ""); - assert_eq!(join(vec![""]), "\"\""); + assert_eq!(join(vec![""]), "''"); assert_eq!(join(vec!["a", "b"]), "a b"); - assert_eq!(join(vec!["foo bar", "baz"]), "\"foo bar\" baz"); + assert_eq!(join(vec!["foo bar", "baz"]), "'foo bar' baz"); +} + +#[test] +fn test_fallible() { + assert_eq!(try_join(vec!["\0"]), Err(QuoteError::Nul)); + assert_eq!(try_quote("\0"), Err(QuoteError::Nul)); } diff --git a/src/quoting_warning.md b/src/quoting_warning.md new file mode 100644 index 0000000..fab9857 --- /dev/null +++ b/src/quoting_warning.md @@ -0,0 +1,365 @@ +// vim: textwidth=99 +/* +Meta note: This file is loaded as a .rs file by rustdoc only. +*/ +/*! + +A more detailed version of the [warning at the top level](super#warning) about the `quote`/`join` +family of APIs. + +In general, passing the output of these APIs to a shell should recover the original string(s). +This page lists cases where it fails to do so. + +In noninteractive contexts, there are only minor issues. 'Noninteractive' includes shell scripts +and `sh -c` arguments, or even scripts `source`d from interactive shells. The issues are: + +- [Nul bytes](#nul-bytes) + +- [Overlong commands](#overlong-commands) + +If you are writing directly to the stdin of an interactive (`-i`) shell (i.e., if you are +pretending to be a terminal), or if you are writing to a cooked-mode pty (even if the other end is +noninteractive), then there is a **severe** security issue: + +- [Control characters](#control-characters-interactive-contexts-only) + +Finally, there are some [solved issues](#solved-issues). + +# List of issues + +## Nul bytes + +For non-interactive shells, the most problematic input is nul bytes (bytes with value 0). The +non-deprecated functions all default to returning [`QuoteError::Nul`] when encountering them, but +the deprecated [`quote`] and [`join`] functions leave them as-is. + +In Unix, nul bytes can't appear in command arguments, environment variables, or filenames. It's +not a question of proper quoting; they just can't be used at all. This is a consequence of Unix's +system calls all being designed around nul-terminated C strings. + +Shells inherit that limitation. Most of them do not accept nul bytes in strings even internally. +Even when they do, it's pretty much useless or even dangerous, since you can't pass them to +external commands. + +In some cases, you might fail to pass the nul byte to the shell in the first place. For example, +the following code uses [`join`] to tunnel a command over an SSH connection: + +```rust +std::process::Command::new("ssh") + .arg("myhost") + .arg("--") + .arg(join(my_cmd_args)) +``` + +If any argument in `my_cmd_args` contains a nul byte, then `join(my_cmd_args)` will contain a nul +byte. But `join(my_cmd_args)` is itself being passed as an argument to a command (the ssh +command), and command arguments can't contain nul bytes! So this will simply result in the +`Command` failing to launch. + +Still, there are other ways to smuggle nul bytes into a shell. How the shell reacts depends on the +shell and the method of smuggling. For example, here is Bash 5.2.21 exhibiting three different +behaviors: + +- With ANSI-C quoting, the string is truncated at the first nul byte: + ```bash + $ echo $'foo\0bar' | hexdump -C + 00000000 66 6f 6f 0a |foo.| + ``` + +- With command substitution, nul bytes are removed with a warning: + ```bash + $ echo $(printf 'foo\0bar') | hexdump -C + bash: warning: command substitution: ignored null byte in input + 00000000 66 6f 6f 62 61 72 0a |foobar.| + ``` + +- When a nul byte appears directly in a shell script, it's removed with no warning: + ```bash + $ printf 'echo "foo\0bar"' | bash | hexdump -C + 00000000 66 6f 6f 62 61 72 0a |foobar.| + ``` + +Zsh, in contrast, actually allows nul bytes internally, in shell variables and even arguments to +builtin commands. But if a variable is exported to the environment, or if an argument is used for +an external command, then the child process will see it silently truncated at the first nul. This +might actually be more dangerous, depending on the use case. + +## Overlong commands + +If you pass a long string into a shell, several things might happen: + +- It might succeed, yet the shell might have trouble actually doing anything with it. For example: + + ```bash + x=$(printf '%010000000d' 0); /bin/echo $x + bash: /bin/echo: Argument list too long + ``` + +- If you're using certain shells (e.g. Busybox Ash) *and* using a pty for communication, then the + shell will impose a line length limit, ignoring all input past the limit. + +- If you're using a pty in cooked mode, then by default, if you write so many bytes as input that + it fills the kernel's internal buffer, the kernel will simply drop those bytes, instead of + blocking waiting for the shell to empty out the buffer. In other words, random bits of input can + be lost, which is obviously insecure. + +Future versions of this crate may add an option to [`Quoter`] to check the length for you. + +## Control characters (*interactive contexts only*) + +Control characters are the bytes from `\x00` to `\x1f`, plus `\x7f`. `\x00` (the nul byte) is +discussed [above](#nul-bytes), but what about the rest? Well, many of them correspond to terminal +keyboard shortcuts. For example, when you press Ctrl-A at a shell prompt, your terminal sends the +byte `\x01`. The shell sees that byte and (if not configured differently) takes the standard +action for Ctrl-A, which is to move the cursor to the beginning of the line. + +This means that it's quite dangerous to pipe bytes to an interactive shell. For example, here is a +program that tries to tell Bash to echo an arbitrary string, 'safely': +```rust +use std::process::{Command, Stdio}; +use std::io::Write; + +let evil_string = "\x01do_something_evil; "; +let quoted = shlex::try_quote(evil_string).unwrap(); +println!("quoted string is {:?}", quoted); + +let mut bash = Command::new("bash") + .arg("-i") // force interactive mode + .stdin(Stdio::piped()) + .spawn() + .unwrap(); +let stdin = bash.stdin.as_mut().unwrap(); +write!(stdin, "echo {}\n", quoted).unwrap(); +``` + +Here's the output of the program (with irrelevant bits removed): + +```text +quoted string is "'\u{1}do_something_evil; '" +/tmp comex$ do_something_evil; 'echo ' +bash: do_something_evil: command not found +bash: echo : command not found +``` + +Even though we quoted it, Bash still ran an arbitrary command! + +This is not because the quoting was insufficient, per se. In single quotes, all input is supposed +to be treated as raw data until the closing single quote. And in fact, this would work fine +without the `"-i"` argument. + +But line input is a separate stage from shell syntax parsing. After all, if you type a single +quote on the keyboard, you wouldn't expect it to disable all your keyboard shortcuts. So a control +character always has its designated effect, no matter if it's quoted or backslash-escaped. + +Also, some control characters are interpreted by the kernel tty layer instead, like CTRL-C to send +SIGINT. These can be an issue even with noninteractive shells, but only if using a pty for +communication, as opposed to a pipe. + +To be safe, you just have to avoid sending them. + +### Why not just use hex escapes? + +In any normal programming languages, this would be no big deal. + +Any normal language has a way to escape arbitrary characters in strings by writing out their +numeric values. For example, Rust lets you write them in hexadecimal, like `"\x4f"` (or +`"\u{1d546}"` for Unicode). In this way, arbitrary strings can be represented using only 'nice' +simple characters. Any remotely suspicious character can be replaced with a numeric escape +sequence, where the escape sequence itself consists only of alphanumeric characters and some +punctuation. The result may not be the most readable[^choices], but it's quite safe from being +misinterpreted or corrupted in transit. + +Shell is not normal. It has no numeric escape sequences. + +There are a few different ways to quote characters (unquoted, unquoted-with-backslash, single +quotes, double quotes), but all of them involve writing the character itself. If the input +contains a control character, the output must contain that same character. + +### Mitigation: terminal filters + +In practice, automating interactive shells like in the above example is pretty uncommon these days. +In most cases, the only way for a programmatically generated string to make its way to the input of +an interactive shell is if a human copies and pastes it into their terminal. + +And many terminals detect when you paste a string containing control characters. iTerm2 strips +them out; gnome-terminal replaces them with alternate characters[^gr]; Kitty outright prompts for +confirmation. This mitigates the risk. + +But it's not perfect. Some other terminals don't implement this check or implement it incorrectly. +Also, these checks tend to not filter the tab character, which could trigger tab completion. In +most cases that's a non-issue, because most shells support paste bracketing, which disables tab and +some other control characters[^bracketing] within pasted text. But in some cases paste bracketing +gets disabled. + +### Future possibility: ANSI-C quoting + +I said that shell syntax has no numeric escapes, but that only applies to *portable* shell syntax. +Bash and Zsh support an obscure alternate quoting style with the syntax `$'foo'`. It's called +["ANSI-C quoting"][ansic], and inside it you can use all the escape sequences supported by C, +including hex escapes: + +```bash +$ echo $'\x41\n\x42' +A +B +``` + +But other shells don't support it — including Dash, a popular choice for `/bin/sh`, and Busybox's +Ash, frequently seen on stripped-down embedded systems. This crate's quoting functionality [tries +to be compatible](crate#compatibility) with those shells, plus all other POSIX-compatible shells. +That makes ANSI-C quoting a no-go. + +Still, future versions of this crate may provide an option to enable ANSI-C quoting, at the cost of +reduced portability. + +### Future possibility: printf + +Another option would be to invoke the `printf` command, which is required by POSIX to support octal +escapes. For example, you could 'escape' the Rust string `"\x01"` into the shell syntax `"$(printf +'\001')"`. The shell will execute the command `printf` with the first argument being literally a +backslash followed by three digits; `printf` will output the actual byte with value 1; and the +shell will substitute that back into the original command. + +The problem is that 'escaping' a string into a command substitution just feels too surprising. If +nothing else, it only works with an actual shell; [other languages' shell parsing +routines](crate#compatibility) wouldn't understand it. Neither would this crate's own parser, +though that could be fixed. + +Future versions of this crate may provide an option to use `printf` for quoting. + +### Special note: newlines + +Did you know that `\r` and `\n` are control characters? They aren't as dangerous as other control +characters (if quoted properly). But there's still an issue with them in interactive contexts. + +Namely, in some cases, interactive shells and/or the tty layer will 'helpfully' translate between +different line ending conventions. The possibilities include replacing `\r` with `\n`, replacing +`\n` with `\r\n`, and others. This can't result in command injection, but it's still a lossy +transformation which can result in a failure to round-trip (i.e. the shell sees a different string +from what was originally passed to `quote`). + +Numeric escapes would solve this as well. + +# Solved issues + +## Solved: Past vulnerability (GHSA-r7qv-8r2h-pg27 / RUSTSEC-2024-XXX) + +Versions of this crate before 1.3.0 did not quote `{`, `}`, and `\xa0`. + +See: +- +- (TODO: Add Rustsec link) + +## Solved: `!` and `^` + +There are two non-control characters which have a special meaning in interactive contexts only: `!` and +`^`. Luckily, these can be escaped adequately. + +The `!` character triggers [history expansion][he]; the `^` character can trigger a variant of +history expansion known as [Quick Substitution][qs]. Both of these characters get expanded even +inside of double-quoted strings\! + +If we're in a double-quoted string, then we can't just escape these characters with a backslash. +Only a specific set of characters can be backslash-escaped inside double quotes; the set of +supported characters depends on the shell, but it often doesn't include `!` and `^`.[^escbs] +Trying to backslash-escape an unsupported character produces a literal backslash: +```bash +$ echo "\!" +\! +``` + +However, these characters don't get expanded in single-quoted strings, so this crate just +single-quotes them. + +But there's a Bash bug where `^` actually does get partially expanded in single-quoted strings: +```bash +$ echo ' +> ^a^b +> ' + +!!:s^a^b +``` + +To work around that, this crate forces `^` to appear right after an opening single quote. For +example, the string `"^` is quoted into `'"''^'` instead of `'"^'`. This restriction is overkill, +since `^` is only meaningful right after a newline, but it's a sufficient restriction (after all, a +`^` character can't be preceded by a newline if it's forced to be preceded by a single quote), and +for now it simplifies things. + +## Solved: `\xa0` + +The byte `\xa0` may be treated as a shell word separator, specifically on Bash on macOS when using +the default UTF-8 locale, only when the input is invalid UTF-8. This crate handles the issue by +always using quotes for arguments containing this byte. + +In fact, this crate always uses quotes for arguments containing any non-ASCII bytes. This may be +changed in the future, since it's a bit unfriendly to non-English users. But for now it +minimizes risk, especially considering the large number of different legacy single-byte locales +someone might hypothetically be running their shell in. + +### Demonstration + +```bash +$ echo -e 'ls a\xa0b' | bash +ls: a: No such file or directory +ls: b: No such file or directory +``` +The normal behavior would be to output a single line, e.g.: +```bash +$ echo -e 'ls a\xa0b' | bash +ls: cannot access 'a'$'\240''b': No such file or directory +``` +(The specific quoting in the error doesn't matter.) + +### Cause + +Just for fun, here's why this behavior occurs: + +Bash decides which bytes serve as word separators based on the libc function [`isblank`][isblank]. +On macOS on UTF-8 locales, this passes for `\xa0`, corresponding to U+00A0 NO-BREAK SPACE. + +This is doubly unique compared to the other systems I tested (Linux/glibc, Linux/musl, and +Windows/MSVC). First, the other systems don't allow bytes in the range [0x80, 0xFF] to pass +isfoo functions in UTF-8 locales, even if the corresponding Unicode codepoint +does pass, as determined by the wide-character equivalent function, iswfoo. +Second, the other systems don't treat U+00A0 as blank (even using `iswblank`). + +Meanwhile, Bash checks for multi-byte sequences and forbids them from being treated as special +characters, so the proper UTF-8 encoding of U+00A0, `b"\xc2\xa0"`, is not treated as a word +separator. Treatment as a word separator only happens for `b"\xa0"` alone, which is illegal UTF-8. + +[ansic]: https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html +[he]: https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html +[qs]: https://www.gnu.org/software/bash/manual/html_node/Event-Designators.html +[isblank]: https://man7.org/linux/man-pages/man3/isblank.3p.html +[nul]: #nul-bytes + +[^choices]: This can lead to tough choices over which + characters to escape and which to leave as-is, especially when Unicode gets involved and you + have to balance the risk of confusion with the benefit of properly supporting non-English + languages. +
+
+ We don't have the luxury of those choices. + +[^gr]: For example, backspace (in Unicode lingo, U+0008 BACKSPACE) turns into U+2408 SYMBOL FOR BACKSPACE. + +[^bracketing]: It typically disables almost all handling of control characters by the shell proper, + but one necessary exception is the end-of-paste sequence itself (which starts with the control + character `\x1b`). In addition, paste bracketing does not suppress handling of control + characters by the kernel tty layer, such as `\x03` sending SIGINT (which typically clears the + currently typed command, making it dangerous in a similar way to `\x01`). + +[^escbs]: For example, Dash doesn't remove the backslash from `"\!"` because it simply doesn't know + anything about `!` as a special character: it doesn't support history expansion. On the other + end of the spectrum, Zsh supports history expansion and does remove the backslash — though only + in interactive mode. Bash's behavior is weirder. It supports history expansion, and if you + write `"\!"`, the backslash does prevent history expansion from occurring — but it doesn't get + removed! + +*/ + +// `use` declarations to make auto links work: +use ::{quote, join, Shlex, Quoter, QuoteError}; + +// TODO: add more about copy-paste and human readability.