[INFO] cloning repository https://github.com/chrisfentiman/creft [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/chrisfentiman/creft" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] cc05d4f0b26677a3f1ca3db7c5595a05eb0ec89a [INFO] testing chrisfentiman/creft against beta-2026-04-21 for beta-1.96-1 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fchrisfentiman%2Fcreft" "/workspace/builds/worker-3-tc2/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc2/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/chrisfentiman/creft [INFO] finished tweaking git repo https://github.com/chrisfentiman/creft [INFO] tweaked toml for git repo https://github.com/chrisfentiman/creft written to /workspace/builds/worker-3-tc2/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/chrisfentiman/creft on toolchain beta-2026-04-21 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/chrisfentiman/creft already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+beta-2026-04-21" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] e3bea511cca61e983496088fa050badd65fba3b9d124af955348f619fbe38044 [INFO] running `Command { std: "docker" "start" "-a" "e3bea511cca61e983496088fa050badd65fba3b9d124af955348f619fbe38044", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "e3bea511cca61e983496088fa050badd65fba3b9d124af955348f619fbe38044", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e3bea511cca61e983496088fa050badd65fba3b9d124af955348f619fbe38044", kill_on_drop: false }` [INFO] [stdout] e3bea511cca61e983496088fa050badd65fba3b9d124af955348f619fbe38044 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] c3d0d57d5db6e76d033fbb86cc537c57d28ecb391020ec090b7b2866d07e52f3 [INFO] running `Command { std: "docker" "start" "-a" "c3d0d57d5db6e76d033fbb86cc537c57d28ecb391020ec090b7b2866d07e52f3", kill_on_drop: false }` [INFO] [stderr] Compiling cc v1.2.58 [INFO] [stderr] Compiling httparse v1.10.1 [INFO] [stderr] Compiling once_cell v1.21.4 [INFO] [stderr] Compiling simd-adler32 v0.3.9 [INFO] [stderr] Compiling rustls v0.23.37 [INFO] [stderr] Compiling foldhash v0.2.0 [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling http v1.4.0 [INFO] [stderr] Compiling redb v3.1.3 [INFO] [stderr] Compiling signal-hook v0.4.4 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling console v0.16.3 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling webpki-roots v1.0.6 [INFO] [stderr] Compiling is-terminal v0.4.17 [INFO] [stderr] Compiling arraydeque v0.5.1 [INFO] [stderr] Compiling utf8-zero v0.8.1 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling miniz_oxide v0.8.9 [INFO] [stderr] Compiling unit-prefix v0.5.2 [INFO] [stderr] Compiling yansi v1.0.1 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling lexopt v0.3.2 [INFO] [stderr] Compiling shell-escape v0.1.5 [INFO] [stderr] Compiling flate2 v1.1.9 [INFO] [stderr] Compiling hashlink v0.11.0 [INFO] [stderr] Compiling indicatif v0.18.4 [INFO] [stderr] Compiling ureq-proto v0.6.0 [INFO] [stderr] Compiling yaml-rust2 v0.11.0 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling rustls-webpki v0.103.12 [INFO] [stderr] Compiling ureq v3.3.0 [INFO] [stderr] Compiling creft v0.3.4 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 33.73s [INFO] running `Command { std: "docker" "inspect" "c3d0d57d5db6e76d033fbb86cc537c57d28ecb391020ec090b7b2866d07e52f3", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "c3d0d57d5db6e76d033fbb86cc537c57d28ecb391020ec090b7b2866d07e52f3", kill_on_drop: false }` [INFO] [stdout] c3d0d57d5db6e76d033fbb86cc537c57d28ecb391020ec090b7b2866d07e52f3 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 678db6ecfc07c3f86a2c02bf84039c55fbeaf3b2aed42d0a8f53b1704b986289 [INFO] running `Command { std: "docker" "start" "-a" "678db6ecfc07c3f86a2c02bf84039c55fbeaf3b2aed42d0a8f53b1704b986289", kill_on_drop: false }` [INFO] [stderr] Compiling winnow v1.0.0 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling toml_datetime v1.1.0+spec-1.1.0 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling rstest_macros v0.26.1 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling predicates-core v1.0.10 [INFO] [stderr] Compiling float-cmp v0.10.0 [INFO] [stderr] Compiling relative-path v1.9.3 [INFO] [stderr] Compiling sdd v3.0.10 [INFO] [stderr] Compiling assert_cmd v2.2.0 [INFO] [stderr] Compiling termtree v0.5.1 [INFO] [stderr] Compiling glob v0.3.3 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling futures-timer v3.0.3 [INFO] [stderr] Compiling predicates-tree v1.0.13 [INFO] [stderr] Compiling pretty_assertions v1.4.1 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling scc v2.4.0 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling toml_parser v1.1.0+spec-1.1.0 [INFO] [stderr] Compiling toml_edit v0.25.8+spec-1.1.0 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling proc-macro-crate v3.5.0 [INFO] [stderr] Compiling bstr v1.12.1 [INFO] [stderr] Compiling predicates v3.1.4 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling serial_test_derive v3.4.0 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling rstest v0.26.1 [INFO] [stderr] Compiling creft v0.3.4 (/opt/rustwide/workdir) [INFO] [stderr] Compiling serial_test v3.4.0 [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 42.94s [INFO] running `Command { std: "docker" "inspect" "678db6ecfc07c3f86a2c02bf84039c55fbeaf3b2aed42d0a8f53b1704b986289", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "678db6ecfc07c3f86a2c02bf84039c55fbeaf3b2aed42d0a8f53b1704b986289", kill_on_drop: false }` [INFO] [stdout] 678db6ecfc07c3f86a2c02bf84039c55fbeaf3b2aed42d0a8f53b1704b986289 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] ab060ee54d8404fa96c3b9f5a248d84042d4d6df7e02b318d403b24ffd2dee72 [INFO] running `Command { std: "docker" "start" "-a" "ab060ee54d8404fa96c3b9f5a248d84042d4d6df7e02b318d403b24ffd2dee72", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.23s [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/creft-bcdc43decd1d45c4) [INFO] [stdout] [INFO] [stdout] running 1323 tests [INFO] [stdout] test catalog::tests::parse_catalog_empty_plugin_name_rejected ... ok [INFO] [stdout] test catalog::tests::parse_catalog_malformed_entry::case_1_missing_source ... ok [INFO] [stdout] test catalog::tests::parse_catalog_malformed_entry::case_2_bad_typed_source ... ok [INFO] [stdout] test catalog::tests::parse_catalog_duplicate_plugin_names_rejected ... ok [INFO] [stdout] test catalog::tests::parse_catalog_multiple_plugins ... ok [INFO] [stdout] test catalog::tests::parse_catalog_optional_fields_default ... ok [INFO] [stdout] test catalog::tests::parse_catalog_malformed_json_returns_catalog_parse_error ... ok [INFO] [stdout] test catalog::tests::parse_catalog_missing_plugins_key ... ok [INFO] [stdout] test catalog::tests::parse_catalog_error_names_catalog_source ... ok [INFO] [stdout] test cli::tests::completions_help_returns_help_variant ... ok [INFO] [stdout] test cli::tests::completions_with_shell_parses_correctly ... ok [INFO] [stdout] test cli::tests::docs_equals_form_returns_docs_search_variant ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_2_add ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_1_completions ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_3_list ... ok [INFO] [stdout] test cli::tests::completions_missing_shell_returns_missing_arg_error ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_4_doctor ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_7_up ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_8_init ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_1_add ... ok [INFO] [stdout] test cli::tests::docs_followed_by_flag_returns_docs_not_search ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_3_show ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_4_remove ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_5_up ... ok [INFO] [stdout] test catalog::tests::parse_catalog_typed_github_source ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_5_plugin ... ok [INFO] [stdout] test cli::tests::docs_flag_returns_docs_variant::case_6_settings ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_6_doctor ... ok [INFO] [stdout] test cli::tests::list_names_long_flag_sets_names_true ... ok [INFO] [stdout] test cli::tests::docs_with_query_returns_docs_search_variant ... ok [INFO] [stdout] test cli::tests::list_without_names_flag_defaults_false ... ok [INFO] [stdout] test cli::tests::list_names_short_flag_sets_names_true ... ok [INFO] [stdout] test cli::tests::plugin_install_accepts_source_without_plugin_flag ... ok [INFO] [stdout] test cli::tests::plugin_install_rejects_plugin_flag ... ok [INFO] [stdout] test cli::tests::plugin_install_short_flag_p_rejected ... ok [INFO] [stdout] test cli::tests::root_docs_bare_returns_root_help ... ok [INFO] [stdout] test cli::tests::up_bare_defaults_local_false ... ok [INFO] [stdout] test cli::tests::up_local_long_flag_sets_local_true ... ok [INFO] [stdout] test cli::tests::up_global_flag_rejected ... ok [INFO] [stdout] test cli::tests::up_system_with_local_flag_parses_both ... ok [INFO] [stdout] test cli::tests::up_local_short_flag_sets_local_true ... ok [INFO] [stdout] test cmd::run::tests::docs_block_content_preserved_fence_stripped ... ok [INFO] [stdout] test cmd::run::tests::executable_code_blocks_are_stripped ... ok [INFO] [stdout] test cli::tests::root_docs_with_query_returns_docs_search_all ... ok [INFO] [stdout] test catalog::tests::parse_catalog_empty_plugins_array ... ok [INFO] [stdout] test catalog::tests::parse_catalog_typed_git_source ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_equals_form_returns_value_without_index ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_for_bare_docs_flag ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_when_next_arg_is_flag ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_returns_none_when_no_docs_flag ... ok [INFO] [stdout] test cmd::run::tests::four_backtick_fence_stripped_by_matching_count ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_space_form_returns_value_and_index ... ok [INFO] [stdout] test cmd::run::tests::malformed_frontmatter_falls_back_to_skill_name_header ... ok [INFO] [stdout] test cmd::run::tests::three_backtick_inside_four_backtick_fence_not_closing ... ok [INFO] [stdout] test cmd::run::tests::prose_between_blocks_preserved ... ok [INFO] [stdout] test cmd::run::tests::skill_with_only_frontmatter_and_code_produces_header_only ... ok [INFO] [stdout] test cmd::run::tests::two_blank_lines_not_collapsed ... ok [INFO] [stdout] test cmd::run::tests::frontmatter_replaced_with_name_description_header ... ok [INFO] [stdout] test cmd::skill::tests::namespace_listing_strips_namespace_prefix_from_skill_names ... ok [INFO] [stdout] test cmd::skill::tests::namespace_listing_contains_required_structural_elements ... ok [INFO] [stdout] test cli::tests::docs_search_variant_per_command::case_2_list ... ok [INFO] [stdout] test cmd::run::tests::no_ansi_when_yansi_disabled ... ok [INFO] [stdout] test cmd::run::tests::headers_in_prose_receive_bold_markers ... ok [INFO] [stdout] test cmd::skill::tests::namespace_listing_includes_tagline ... ok [INFO] [stdout] test cmd::run::tests::space_form_query_excluded_from_filtered_args ... ok [INFO] [stdout] test cmd::run::tests::three_or_more_blank_lines_collapsed_to_two ... ok [INFO] [stdout] test cmd::skill::tests::namespace_listing_includes_namespace_name_in_usage_and_footer ... ok [INFO] [stdout] test cmd::skill::tests::namespace_listing_usage_appears_before_skills_header ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_color_at_first_position_is_grad_from ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_color_at_single_position_is_grad_from ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_color_at_last_position_is_grad_to ... ok [INFO] [stdout] test cmd::run::tests::extract_docs_query_handles_multi_word_style_query ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_line_empty_string ... ok [INFO] [stdout] test cmd::skill::tests::no_truncation_when_display_limit_is_none ... ok [INFO] [stdout] test cmd::skill::tests::truncation_footer_absent_when_entries_fit_within_limit ... ok [INFO] [stdout] test cmd::welcome::tests::cursor_guard_compiles_and_drop_impl_exists ... ok [INFO] [stdout] test cmd::welcome::tests::grad_from_and_grad_to_are_different_colors ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_line_contains_ansi_when_yansi_enabled ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_line_plain_when_yansi_disabled ... ok [INFO] [stdout] test cmd::skill::tests::truncation_footer_shown_when_entries_exceed_limit ... ok [INFO] [stdout] test cmd::welcome::tests::render_static_output_contains_required_content ... ok [INFO] [stdout] test cmd::welcome::tests::render_static_to_writer_fallback_emits_fixed_not_rgb_sequences ... ok [INFO] [stdout] test cmd::welcome::tests::reveal_frame_at_zero_contains_only_spaces_cr_lf_and_cursor_sequences ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_line_fallback_emits_no_rgb_sequences ... ok [INFO] [stdout] test cmd::welcome::tests::paint_fg_truecolor_emits_rgb_sequence ... ok [INFO] [stdout] test cmd::welcome::tests::paint_fg_fallback_emits_fixed_sequence_not_rgb ... ok [INFO] [stdout] test cmd::run::tests::equals_form_query_not_in_filtered_args ... ok [INFO] [stdout] test catalog::tests::parse_catalog_single_path_source ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_5_white ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_3_pure_blue ... ok [INFO] [stdout] test cmd::welcome::tests::reveal_frame_full_contains_all_logo_characters ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_gradient_endpoints_produce_reasonable_indices ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_4_black ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_1_pure_red ... ok [INFO] [stdout] test cmd::welcome::tests::reveal_frame_ends_with_cursor_up_to_logo_top ... ok [INFO] [stdout] test cmd::welcome::tests::underline_frame_at_zero_contains_no_underline_chars ... ok [INFO] [stdout] [INFO] [stdout]  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— [INFO] [stdout] β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”════╝β•š══β–ˆβ–ˆβ•”══╝ [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”╝β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—     β–ˆβ–ˆβ•‘    [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”══╝  β–ˆβ–ˆβ•”══╝     β–ˆβ–ˆβ•‘    [INFO] [stdout] [INFO] [stdout]  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— [INFO] [stdout] β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”════╝β•š══β–ˆβ–ˆβ•”══╝ [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”╝β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—     β–ˆβ–ˆβ•‘    [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”══╝  β–ˆβ–ˆβ•”══╝     β–ˆβ–ˆβ•‘    [INFO] [stdout] β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘        β–ˆβ–ˆβ•‘    [INFO] [stdout]  β•š═════╝β•š═╝  β•š═╝β•š══════╝β•š═╝        β•š═╝    [INFO] [stdout] [INFO] [stdout] Executable skills for Agents [INFO] [stdout] v0.3.4 [INFO] [stdout] [INFO] [stdout] Get started: [INFO] [stdout] creft add Create a skill from stdin [INFO] [stdout] creft list See available skills [INFO] [stdout] creft up Set up editor integrations [INFO] [stdout] [INFO] [stdout] Run creft --help for the full command reference. [INFO] [stdout] [INFO] [stdout] β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘        β–ˆβ–ˆβ•‘    [INFO] [stdout]  β•š═════╝β•š═╝  β•š═╝β•š══════╝β•š═╝        β•š═╝    [INFO] [stdout] [INFO] [stdout] Executable skills for Agents [INFO] [stdout] v0.3.4 [INFO] [stdout] [INFO] [stdout] Get started: [INFO] [stdout] creft add Create a skill from stdin [INFO] [stdout] creft list See available skills [INFO] [stdout] creft up Set up editor integrations [INFO] [stdout] [INFO] [stdout] Run creft --help for the full command reference. [INFO] [stdout] [INFO] [stdout] test cmd::welcome::tests::already_welcomed_false_when_no_marker ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_maps_to_known_index::case_2_pure_green ... ok [INFO] [stdout] test cmd::welcome::tests::underline_frame_starts_with_cursor_down_and_ends_with_cursor_up ... ok [INFO] [stdout] test cmd::welcome::tests::cmd_welcome_noop_when_marker_exists_and_no_force ... ok [INFO] [stdout] test cmd::welcome::tests::write_marker_content_is_version_string ... ok [INFO] [stdout] test cmd::welcome::tests::rgb_to_fixed_threshold_boundaries ... ok [INFO] [stdout] test cmd::welcome::tests::underline_frame_full_width_contains_expected_count_of_underline_chars ... ok [INFO] [stdout] test cmd::welcome::tests::write_marker_creates_file_and_already_welcomed_returns_true ... ok [INFO] [stdout] test cmd::welcome::tests::write_marker_creates_parent_directories ... ok [INFO] [stdout] test cmd::welcome::tests::cmd_welcome_writes_marker_after_run ... ok [INFO] [stdout] test cmd::welcome::tests::cmd_welcome_uses_static_path_when_not_a_tty ... ok [INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_1_bash ... ok [INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_2_zsh ... ok [INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_1_bash ... ok [INFO] [stdout] test completions::tests::generated_script_calls_list_names::case_3_fish ... ok [INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_2_zsh ... ok [INFO] [stdout] test cmd::welcome::tests::underline_frame_full_width_gradient_uses_grad_from_and_grad_to ... ok [INFO] [stdout] test completions::tests::generated_script_contains_shell_marker::case_3_fish ... ok [INFO] [stdout] test completions::tests::unsupported_shell_error_names_the_shell ... ok [INFO] [stdout] test completions::tests::unsupported_shell_returns_cli_parse_error ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_01_bash ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_02_sh ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_04_python ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_05_python3 ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_06_node ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_07_js ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_08_javascript ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_09_typescript ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_10_ts ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_11_perl ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_12_unknown ... ok [INFO] [stdout] test cmd::welcome::tests::logo_lines_fit_within_40_columns ... ok [INFO] [stdout] test doctor::tests::extract_commands_does_not_filter_regular_commands_with_equals_in_args ... ok [INFO] [stdout] test doctor::tests::interpreter_for_lang_maps_correctly::case_03_zsh ... ok [INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_3_subshell_assignment ... ok [INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_1_simple_assignment ... ok [INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_2_fail ... ok [INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_1_ok ... ok [INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_4_assignment_and_pipe ... ok [INFO] [stdout] test doctor::tests::extract_commands_skips_variable_assignments::case_2_numeric_assignment ... ok [INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_5_optional ... ok [INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_3_warn ... ok [INFO] [stdout] test doctor::tests::status_marker_formats_variant::case_4_info ... ok [INFO] [stdout] test doctor::tests::test_check_global_dir_no_home ... ok [INFO] [stdout] test completions::tests::fish_script_is_syntactically_valid ... ok [INFO] [stdout] test cmd::welcome::tests::gradient_line_single_char_uses_from_color ... ok [INFO] [stdout] test doctor::tests::check_shell_preference_with_no_detection_shows_none_message ... ok [INFO] [stdout] test doctor::tests::test_check_global_dir_not_exists ... ok [INFO] [stdout] test doctor::tests::test_check_block_deps_shell_checks_each_dep ... ok [INFO] [stdout] test completions::tests::zsh_script_is_syntactically_valid ... ok [INFO] [stdout] test doctor::tests::check_shell_preference_with_setting_shows_simple_label_and_name ... ok [INFO] [stdout] test doctor::tests::test_check_block_interpreter_not_found ... ok [INFO] [stdout] test doctor::tests::test_check_block_deps_node_missing_npm ... ok [INFO] [stdout] test doctor::tests::run_skill_check_with_shell_pref_does_not_affect_non_shell_blocks ... ok [INFO] [stdout] test doctor::tests::test_check_interpreter_bash_missing_is_fail ... ok [INFO] [stdout] test doctor::tests::test_check_interpreter_unknown_missing_is_optional ... ok [INFO] [stdout] test doctor::tests::test_check_interpreter_missing_git_is_optional ... ok [INFO] [stdout] [INFO] [stdout] test doctor::tests::test_check_global_dir_writable ... ok [INFO] [stdout] test doctor::tests::test_check_llm_provider_found ... ok [INFO] [stdout] test doctor::tests::test_check_local_dir_found ... ok [INFO] [stdout]  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— [INFO] [stdout] test doctor::tests::test_check_optional_tool_found ... ok [INFO] [stdout] test doctor::tests::test_check_optional_tool_missing ... ok [INFO] [stdout] β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”════╝β–ˆβ–ˆβ•”════╝β•š══β–ˆβ–ˆβ•”══╝ [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”╝β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—     β–ˆβ–ˆβ•‘    [INFO] [stdout] β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•”══β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”══╝  β–ˆβ–ˆβ•”══╝     β–ˆβ–ˆβ•‘    [INFO] [stdout] β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘        β–ˆβ–ˆβ•‘    [INFO] [stdout]  β•š═════╝β•š═╝  β•š═╝β•š══════╝β•š═╝        β•š═╝    [INFO] [stdout] [INFO] [stdout] Executable skills for Agents [INFO] [stdout] v0.3.4 [INFO] [stdout] [INFO] [stdout] Get started: [INFO] [stdout] creft add Create a skill from stdin [INFO] [stdout] creft list See available skills [INFO] [stdout] creft up Set up editor integrations [INFO] [stdout] [INFO] [stdout] Run creft --help for the full command reference. [INFO] [stdout] [INFO] [stdout] test doctor::tests::test_check_llm_provider_not_found_is_optional ... ok [INFO] [stdout] test doctor::tests::test_describe_source_owned_global ... ok [INFO] [stdout] test doctor::tests::run_skill_check_without_shell_pref_reports_block_lang_interpreter ... ok [INFO] [stdout] test doctor::tests::test_describe_source_owned_local ... ok [INFO] [stdout] test doctor::tests::test_describe_source_package ... ok [INFO] [stdout] test doctor::tests::test_check_packages_broken_manifest_reported ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_and_chain ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_filters_builtins ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_comments_skipped ... ok [INFO] [stdout] test doctor::tests::test_check_interpreter_missing_zsh_is_optional ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_multiline ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_pipe ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_simple ... ok [INFO] [stdout] test cmd::welcome::tests::cmd_welcome_force_runs_even_if_marker_exists ... ok [INFO] [stdout] test doctor::tests::test_extract_creft_calls_with_flags ... ok [INFO] [stdout] test doctor::tests::test_has_failures_ignores_optional ... ok [INFO] [stdout] test doctor::tests::test_extract_creft_calls_simple ... ok [INFO] [stdout] test doctor::tests::test_extract_creft_calls_in_subshell ... ok [INFO] [stdout] test doctor::tests::test_extract_commands_subshell ... ok [INFO] [stdout] test doctor::tests::test_global_check_includes_bash ... ok [INFO] [stdout] test doctor::tests::test_extract_creft_calls_filters_reserved ... ok [INFO] [stdout] test doctor::tests::test_global_check_returns_results ... ok [INFO] [stdout] test doctor::tests::test_render_global_does_not_panic ... ok [INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_empty_defaults_to_claude ... ok [INFO] [stdout] test doctor::tests::test_has_failures_with_all_ok ... ok [INFO] [stdout] test doctor::tests::test_has_failures_with_fail ... ok [INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_unknown_returns_as_is ... ok [INFO] [stdout] test doctor::tests::test_global_check_includes_packages ... ok [INFO] [stdout] test doctor::tests::test_render_skill_with_sub_reports_does_not_panic ... ok [INFO] [stdout] test doctor::tests::test_check_block_deps_python_missing_uv ... ok [INFO] [stdout] test doctor::tests::test_check_block_interpreter_found ... ok [INFO] [stdout] test doctor::tests::test_llm_provider_cli_name_known_providers ... ok [INFO] [stdout] test doctor::tests::test_report_has_failures_no_fails ... ok [INFO] [stdout] test doctor::tests::test_report_has_failures_propagates_from_sub_reports ... ok [INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_commands ... ok [INFO] [stdout] test doctor::tests::test_extract_creft_calls_namespace ... ok [INFO] [stdout] test doctor::tests::test_render_skill_does_not_panic ... ok [INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_deps ... ok [INFO] [stdout] test doctor::tests::test_render_skill_multi_dep_blocks_does_not_panic ... ok [INFO] [stdout] test doctor::tests::test_which_path_returns_absolute_path ... ok [INFO] [stdout] test doctor::tests::test_report_has_failures_with_fail_in_interpreter ... ok [INFO] [stdout] test error::tests::test_enrich_io_error_not_found_includes_context ... ok [INFO] [stdout] test error::tests::test_enrich_io_error_not_found_returns_interpreter_not_found ... ok [INFO] [stdout] test error::tests::test_enrich_io_error_other_passthrough_as_io ... ok [INFO] [stdout] test doctor::tests::run_skill_check_with_shell_pref_reports_resolved_interpreter_for_bash_block ... ok [INFO] [stdout] test doctor::tests::test_skill_check_prev_in_llm_block_is_info ... ok [INFO] [stdout] test doctor::tests::test_skill_check_prev_in_shell_block_warns_not_supported ... ok [INFO] [stdout] test error::tests::test_enrich_io_error_e2big_returns_setup ... ok [INFO] [stdout] test doctor::tests::test_which_path_finds_existing ... ok [INFO] [stdout] test error::tests::test_exit_code_execution_signaled ... ok [INFO] [stdout] test error::tests::test_exit_code_missing_arg ... ok [INFO] [stdout] test error::tests::test_exit_code_validation_failed ... ok [INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_io ... ok [INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_frontmatter ... ok [INFO] [stdout] test error::tests::test_is_quiet_execution_failed ... ok [INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigkill ... ok [INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigterm ... ok [INFO] [stdout] test error::tests::test_is_quiet_execution_signaled_sigint ... ok [INFO] [stdout] test error::tests::test_is_quiet_io ... ok [INFO] [stdout] test doctor::tests::test_skill_check_creft_prev_warns_removal ... ok [INFO] [stdout] test frontmatter::tests::test_parse_empty_name ... ok [INFO] [stdout] test frontmatter::tests::test_parse_basic ... ok [INFO] [stdout] test frontmatter::tests::test_parse_missing_delimiter ... ok [INFO] [stdout] test frontmatter::tests::test_parse_missing_close ... ok [INFO] [stdout] test doctor::tests::test_check_local_dir_not_found ... ok [INFO] [stdout] test error::tests::test_exit_code_execution_failed_returns_code_field ... ok [INFO] [stdout] test error::tests::test_exit_code_missing_env_var ... ok [INFO] [stdout] test doctor::tests::test_which_path_returns_none_for_nonexistent ... ok [INFO] [stdout] test frontmatter::tests::test_parse_with_args ... ok [INFO] [stdout] test completions::tests::bash_script_is_syntactically_valid ... ok [INFO] [stdout] test error::tests::test_exit_code_command_not_found ... ok [INFO] [stdout] test error::tests::test_exit_code_execution_failed_zero_code ... ok [INFO] [stdout] test frontmatter::tests::test_parse_with_env ... ok [INFO] [stdout] test error::tests::test_exit_code_wildcard_arm_returns_1_for_setup ... ok [INFO] [stdout] test error::tests::test_enrich_io_error_e2big_context_appears_in_message ... ok [INFO] [stdout] test error::tests::test_is_quiet_command_not_found ... ok [INFO] [stdout] test frontmatter::tests::test_parse_with_supports ... ok [INFO] [stdout] test error::tests::test_exit_code_package_not_found ... ok [INFO] [stdout] test frontmatter::tests::test_roundtrip ... ok [INFO] [stdout] test frontmatter::tests::test_roundtrip_ignores_legacy_pipe_field ... ok [INFO] [stdout] test frontmatter::tests::test_parse_without_supports ... ok [INFO] [stdout] test help::tests::all_render_docs_contain_usage_line ... ok [INFO] [stdout] test frontmatter::tests::test_roundtrip_with_supports ... ok [INFO] [stdout] test help::tests::builtins_descriptions_non_empty ... ok [INFO] [stdout] test help::tests::builtins_descriptions_under_50_chars ... ok [INFO] [stdout] test help::tests::builtins_returns_ten_entries ... ok [INFO] [stdout] test help::tests::builtins_sorted_alphabetically ... ok [INFO] [stdout] test help::tests::all_render_short_contain_docs_footer ... ok [INFO] [stdout] test help::tests::all_render_short_contain_usage_line ... ok [INFO] [stdout] test help::tests::render_version_matches_cargo_pkg_version ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_bare_outer_fence_consumes_content_and_does_not_cause_false_positive ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_four_bare_backticks_inside_three_backtick_block_is_not_a_closing_fence ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_no_false_positive_for_echo_with_backticks_inline ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_detects_inner_fence_that_would_close_outer ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_flags_only_problematic_block_in_multi_block_body ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_block_with_no_inner_fences ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_four_backtick_outer_with_inner_three ... ok [INFO] [stdout] test markdown::tests::check_fence_nesting_no_warning_for_unclosed_outer_block ... ok [INFO] [stdout] test markdown::tests::four_backtick_outer_fence_treats_inner_three_backtick_examples_as_literal_content ... ok [INFO] [stdout] test help::tests::no_docs_output_contains_built_in_tag ... ok [INFO] [stdout] test help::tests::render_docs_disabled_produces_no_ansi ... ok [INFO] [stdout] test help::tests::render_docs_enabled_produces_ansi_bold_on_headers ... ok [INFO] [stdout] test markdown::tests::test_deps_python ... ok [INFO] [stdout] test markdown::tests::test_docs_and_code ... ok [INFO] [stdout] test help::tests::render_docs_show_contains_blocks_flag ... ok [INFO] [stdout] test markdown::tests::test_deps_node ... ok [INFO] [stdout] test markdown::tests::test_empty_body ... ok [INFO] [stdout] test markdown::tests::test_llm_block_deps_are_empty ... ok [INFO] [stdout] test markdown::tests::test_llm_block_among_regular_blocks ... ok [INFO] [stdout] test help::tests::render_short_disabled_produces_no_ansi ... ok [INFO] [stdout] test markdown::tests::test_llm_block_invalid_yaml_records_error ... ok [INFO] [stdout] test markdown::tests::test_llm_block_empty_yaml_uses_defaults ... ok [INFO] [stdout] test help::tests::render_docs_add_contains_usage_line ... ok [INFO] [stdout] test markdown::tests::test_llm_block_model_only ... ok [INFO] [stdout] test markdown::tests::test_llm_block_no_separator_is_prompt ... ok [INFO] [stdout] test markdown::tests::test_llm_block_provider_only ... ok [INFO] [stdout] test markdown::tests::test_no_deps ... ok [INFO] [stdout] test markdown::tests::test_llm_block_params_field ... ok [INFO] [stdout] test markdown::tests::test_multiple_blocks ... ok [INFO] [stdout] test markdown::tests::test_no_lang_tag_ignored ... ok [INFO] [stdout] test markdown::tests::test_non_llm_blocks_have_no_llm_config ... ok [INFO] [stdout] test markdown::tests::test_llm_block_with_all_fields ... ok [INFO] [stdout] test help::tests::builtins_contains_expected_commands ... ok [INFO] [stdout] test markdown::tests::test_multiline_code ... ok [INFO] [stdout] test markdown::tests::test_non_llm_block_with_triple_dash_in_code ... ok [INFO] [stdout] test help::tests::all_render_short_under_20_lines ... ok [INFO] [stdout] test markdown::tests::test_llm_block_multiple_separators_only_first_splits ... ok [INFO] [stdout] test markdown::tests::test_single_bash_block ... ok [INFO] [stdout] test model::tests::needs_sponge::case_3_python ... ok [INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_1_hidden_top_level ... ok [INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_2_hidden_subcommand ... ok [INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_3_hidden_namespace ... ok [INFO] [stdout] test model::tests::needs_sponge::case_5_unknown_language ... ok [INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_4_underscore_mid_word ... ok [INFO] [stdout] test model::tests::is_hidden_matches_underscore_prefix_tokens::case_5_visible ... ok [INFO] [stdout] test model::tests::test_default_flag_type_is_string ... ok [INFO] [stdout] test model::tests::test_deserialize_ignores_pipe_field ... ok [INFO] [stdout] test model::tests::needs_sponge::case_1_llm ... ok [INFO] [stdout] test model::tests::test_deserialize_ignores_sequential_field ... ok [INFO] [stdout] test model::tests::test_global_root_no_home_returns_err ... ok [INFO] [stdout] test model::tests::test_find_local_root_returns_none_when_creft_home_set ... ok [INFO] [stdout] test model::tests::test_find_local_root_excludes_global_root ... ok [INFO] [stdout] test model::tests::needs_sponge::case_2_bash ... ok [INFO] [stdout] test model::tests::help_text_hides_empty_default ... ok [INFO] [stdout] test model::tests::needs_sponge::case_4_node ... ok [INFO] [stdout] test model::tests::test_default_env_required_is_true ... ok [INFO] [stdout] test model::tests::test_help_text ... ok [INFO] [stdout] test model::tests::test_help_text_ansi_arg_names_bold ... ok [INFO] [stdout] test model::tests::test_help_text_ansi_default_hints_not_bold ... ok [INFO] [stdout] test model::tests::test_find_local_root_finds_real_project_root ... ok [INFO] [stdout] test model::tests::test_help_text_arg_with_default ... ok [INFO] [stdout] test model::tests::test_help_text_arg_without_description_has_no_trailing_spaces ... ok [INFO] [stdout] test model::tests::test_help_text_env_optional ... ok [INFO] [stdout] test model::tests::test_help_text_usage_line_no_flags_no_args ... ok [INFO] [stdout] test model::tests::test_help_text_usage_line_with_optional_arg ... ok [INFO] [stdout] test model::tests::test_help_text_string_flag_with_default ... ok [INFO] [stdout] test model::tests::test_help_text_ansi_flag_labels_bold ... ok [INFO] [stdout] test model::tests::test_help_text_ansi_section_headers_bold ... ok [INFO] [stdout] test model::tests::test_help_text_bool_flag_no_value_hint ... ok [INFO] [stdout] test model::tests::test_llm_config_deserialize_defaults ... ok [INFO] [stdout] test model::tests::test_help_text_description_only_first_line ... ok [INFO] [stdout] test model::tests::test_llm_config_deserialize_full ... ok [INFO] [stdout] test model::tests::test_help_text_usage_line_with_options ... ok [INFO] [stdout] test model::tests::test_help_text_ansi_description_not_bold ... ok [INFO] [stdout] test model::tests::test_help_text_plain_and_ansi_same_structure ... ok [INFO] [stdout] test model::tests::test_llm_config_deserialize_provider_only ... ok [INFO] [stdout] test model::tests::test_name_parts_simple ... ok [INFO] [stdout] test model::tests::test_supports_feature_no_match ... ok [INFO] [stdout] test model::tests::test_name_parts_namespaced ... ok [INFO] [stdout] test model::tests::test_supports_feature_empty ... ok [INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_1_named_namespace ... ok [INFO] [stdout] test model::tests::test_supports_feature_match ... ok [INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_2_named_namespace_with_plugin ... ok [INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_3_root_namespace ... ok [INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_denied_when_not_global ... ok [INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_denied_when_not_registered ... ok [INFO] [stdout] test namespace::tests::access_registry_default_is_empty ... ok [INFO] [stdout] test namespace::tests::qualify_produces_correct_qualified_name::case_4_root_namespace_with_plugin ... ok [INFO] [stdout] test namespace::tests::resolve_local_name_qualifies_without_registry_check ... ok [INFO] [stdout] test namespace::tests::resolve_cross_namespace_name_succeeds_when_global ... ok [INFO] [stdout] test namespace::tests::resolve_local_name_with_plugin_qualifies_correctly ... ok [INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_1_two_part_name ... ok [INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_4_empty_string ... ok [INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_2_single_token ... ok [INFO] [stdout] test namespace::tests::access_registry_mark_and_check_global ... ok [INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_1_cmd ... ok [INFO] [stdout] test namespace::tests::skill_namespace_extracts_top_level_namespace::case_3_three_part_name ... ok [INFO] [stdout] test namespace::tests::access_error_display_includes_resource_name ... ok [INFO] [stdout] test registry::tests::activate_bare_plugin_name_activates_all_commands ... ok [INFO] [stdout] test namespace::tests::access_registry_starts_empty ... ok [INFO] [stdout] test registry::tests::activate_plugin_slash_cmd_activates_specific_command ... ok [INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_2_plugins ... ok [INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_3_install ... ok [INFO] [stdout] test registry::tests::collect_package_skills_excludes_invalid_yaml_frontmatter_file_from_results ... ok [INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_4_update ... ok [INFO] [stdout] test registry::tests::former_namespace_names_are_valid::case_5_uninstall ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_01_add ... ok [INFO] [stdout] test registry::tests::read_manifest_from_reads_catalog_json ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_03_show ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_04_remove ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_05_plugin ... ok [INFO] [stdout] test registry::tests::activate_prefers_literal_interpretation_when_first_segment_is_installed ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_06_settings ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_07_up ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_10_init ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_12_completions ... ok [INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_1_root_match ... ok [INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_2_root_mismatch ... ok [INFO] [stdout] test registry::tests::activate_qualified_owner_plugin_strips_owner_and_activates ... ok [INFO] [stdout] test model::tests::test_help_text_usage_line_with_required_arg ... ok [INFO] [stdout] test registry::tests::collect_plugin_skills_silently_skips_plain_markdown_without_frontmatter ... ok [INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_3_subdir_match ... ok [INFO] [stdout] test registry::tests::skill_name_from_path_dedup::case_4_subdir_different ... ok [INFO] [stdout] test registry::tests::activate_returns_package_not_found_when_neither_segment_is_installed ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_08_help ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_09_version ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_11_doctor ... ok [INFO] [stdout] test registry::tests::collect_plugin_skills_excludes_invalid_yaml_frontmatter_file_from_results ... ok [INFO] [stdout] test registry::tests::test_copy_dir_recursive_skips_symlinked_dirs ... ok [INFO] [stdout] test registry::tests::test_collect_package_skills_skips_symlinks ... ok [INFO] [stdout] test registry::tests::reserved_builtins_are_rejected::case_02_list ... ok [INFO] [stdout] test registry::tests::collect_package_skills_silently_skips_plain_markdown_without_frontmatter ... ok [INFO] [stdout] test registry::tests::read_manifest_from_returns_none_when_no_manifest ... ok [INFO] [stdout] test registry::tests::test_load_package_skill_not_found_file ... ok [INFO] [stdout] test registry::tests::test_copy_dir_recursive_skips_symlinks ... ok [INFO] [stdout] test registry::tests::test_load_package_skill_not_found_package ... ok [INFO] [stdout] test registry::tests::test_list_packages_returns_installed ... ok [INFO] [stdout] test registry::tests::test_load_package_skill_nested ... ok [INFO] [stdout] test registry::tests::test_manifest_full_fields ... ok [INFO] [stdout] test registry::tests::test_list_package_skills_excludes_non_md_files ... ok [INFO] [stdout] test registry::tests::test_manifest_optional_fields_absent ... ok [INFO] [stdout] test registry::tests::test_manifest_missing_required_field_name ... ok [INFO] [stdout] test registry::tests::test_manifest_missing_required_field_description ... ok [INFO] [stdout] test registry::tests::test_manifest_missing_required_field_version ... ok [INFO] [stdout] test registry::tests::test_list_package_skills_computes_names_from_paths ... ok [INFO] [stdout] test registry::tests::test_list_package_skills_nesting_cap ... ok [INFO] [stdout] test registry::tests::test_move_dir_empty_directory ... ok [INFO] [stdout] test registry::tests::test_list_package_skills_not_found ... ok [INFO] [stdout] test registry::tests::list_packages_reads_catalog_json ... ok [INFO] [stdout] test registry::tests::test_list_package_skills_excludes_dotfiles ... ok [INFO] [stdout] test registry::tests::test_load_package_skill_overrides_name ... ok [INFO] [stdout] test registry::tests::test_load_package_skill_too_few_tokens ... ok [INFO] [stdout] test registry::tests::test_move_dir_same_filesystem ... ok [INFO] [stdout] test registry::tests::test_packages_dir_creft_home_both_scopes_resolve_to_same_path ... ok [INFO] [stdout] test registry::tests::test_packages_dir_for_respects_scope_under_creft_home ... ok [INFO] [stdout] test registry::tests::test_packages_dir_uses_creft_home ... ok [INFO] [stdout] test registry::tests::test_packages_dir_different_from_commands_dir ... ok [INFO] [stdout] test registry::tests::test_list_packages_skips_invalid_manifest ... ok [INFO] [stdout] test registry::tests::test_skill_name_from_path_package_name_in_result ... ok [INFO] [stdout] test registry::tests::test_list_packages_empty_when_no_dir ... ok [INFO] [stdout] test registry::tests::read_manifest_from_ignores_directory_without_catalog ... ok [INFO] [stdout] test registry::tests::test_skill_file_path_rejects_traversal ... ok [INFO] [stdout] test registry::tests::test_skill_name_from_path_one_level_deep ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_invalid_chars ... ok [INFO] [stdout] test registry::tests::test_skill_name_from_path_simple ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_tabs_rejected ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_semicolon_rejected ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_empty ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_ma ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_whitespace_rejected ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_man ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_padding ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_username_password ... ok [INFO] [stdout] test registry::tests::test_skill_name_from_path_three_levels ... ok [INFO] [stdout] test registry_config::tests::test_deduplication_same_url_template ... ok [INFO] [stdout] test registry_config::tests::test_endpoints_for_scoped_configured ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_m ... ok [INFO] [stdout] test registry_config::tests::test_extract_host_basic ... ok [INFO] [stdout] test registry_config::tests::test_endpoints_for_scoped_unconfigured ... ok [INFO] [stdout] test registry_config::tests::test_extract_host_no_path ... ok [INFO] [stdout] test registry_config::tests::test_endpoints_for_unscoped ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_empty ... ok [INFO] [stdout] test registry_config::tests::test_extract_host_with_port ... ok [INFO] [stdout] test registry::tests::test_validate_manifest_name_ok ... ok [INFO] [stdout] test registry_config::tests::test_deduplication_case_insensitive ... ok [INFO] [stdout] test registry_config::tests::test_base64_encode_rfc4648_vectors ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_malformed_ignored ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_no_sections ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_skips_default ... ok [INFO] [stdout] test registry_config::tests::test_header_value_basic ... ok [INFO] [stdout] test registry_config::tests::test_header_value_bearer ... ok [INFO] [stdout] test registry_config::tests::test_is_valid_http_url_ftp_rejected ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_multiple ... ok [INFO] [stdout] test registry_config::tests::test_is_valid_http_url_file_scheme_rejected ... ok [INFO] [stdout] test registry_config::tests::test_is_valid_http_url_https ... ok [INFO] [stdout] test registry_config::tests::test_is_valid_http_url_http ... ok [INFO] [stdout] test registry_config::tests::test_deduplication_different_paths_not_deduped ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_basic ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_auth_token_matched ... ok [INFO] [stdout] test registry_config::tests::test_extract_uv_indexes_inline_comment_stripped ... ok [INFO] [stdout] test registry_config::tests::test_is_valid_http_url_empty_rejected ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_empty_file ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_ignores_comments ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_scoped_registry ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_url_with_trailing_slash ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_url_without_trailing_slash ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_case_insensitive_keys ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_extra_index_url_multiline ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_comment_lines_ignored ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_extra_index_url_single ... ok [INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_private_no_trailing_slash ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_embedded_credentials ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_index_url ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_no_global_section ... ok [INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_private_uses_simple_api ... ok [INFO] [stdout] test registry_config::tests::test_redact_url_empty_string ... ok [INFO] [stdout] test registry_config::tests::test_redact_url_no_credentials ... ok [INFO] [stdout] test registry_config::tests::test_pypi_endpoint_from_url_pypi_org_uses_json_api ... ok [INFO] [stdout] test registry_config::tests::test_redact_url_user_only_no_colon ... ok [INFO] [stdout] test registry_config::tests::test_registry_auth_bearer_debug_redacts_secret ... ok [INFO] [stdout] test registry_config::tests::test_resolve_npm_default_only ... ok [INFO] [stdout] test registry_config::tests::test_url_for_scoped_npm ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_basic_registry ... ok [INFO] [stdout] test registry_config::tests::test_redact_url_with_user_and_password ... ok [INFO] [stdout] test registry_config::tests::test_registry_auth_basic_debug_shows_username_redacts_password ... ok [INFO] [stdout] test registry_config::tests::test_resolve_pypi_default_only ... ok [INFO] [stdout] test registry_config::tests::test_parse_npmrc_malformed_lines_skipped ... ok [INFO] [stdout] test registry_config::tests::test_parse_pip_conf_colon_separator ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_command_returns_error_when_llm_config_absent ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_2_claude_with_model ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_5_ollama_with_model ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_3_gemini_with_model ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_4_codex ... ok [INFO] [stdout] test runner::blocks::node::tests::build_command_without_deps_returns_bare_node_command ... ok [INFO] [stdout] test runner::blocks::python::tests::build_command_no_deps_uses_python3 ... ok [INFO] [stdout] test runner::blocks::python::tests::build_command_with_deps_uses_uv_run_with ... ok [INFO] [stdout] test runner::blocks::shell::tests::build_command_bash_program_is_bash ... ok [INFO] [stdout] test runner::blocks::python::tests::build_command_with_single_dep_uses_uv_run_with ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_1_bash ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_1_claude_default ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_dispatches_provider::case_6_unknown_provider ... ok [INFO] [stdout] test runner::blocks::shell::tests::build_command_multi_token_interpreter_splits_into_program_and_arg::case_1_typescript ... ok [INFO] [stdout] test runner::blocks::llm::tests::build_llm_command_params_split_on_whitespace ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_2_sh ... ok [INFO] [stdout] test runner::blocks::shell::tests::build_command_multi_token_interpreter_splits_into_program_and_arg::case_2_ts ... ok [INFO] [stdout] test runner::blocks::shell::tests::build_command_appends_script_path_as_last_arg ... ok [INFO] [stdout] test registry_config::tests::test_url_for_simple ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_4_python ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_5_python3 ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_7_javascript ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_8_js ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_llm_uses_provider_as_program ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_9_unknown ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_3_zsh ... ok [INFO] [stdout] test runner::channel::tests::capped_term_width_does_not_exceed_max ... ok [INFO] [stdout] test runner::channel::tests::capped_term_width_does_not_shrink_narrow_terminals ... ok [INFO] [stdout] test runner::blocks::tests::runner_for_dispatches_to_expected_program::case_6_node ... ok [INFO] [stdout] test runner::channel::tests::channel_message_exit_without_code_defaults_to_zero ... ok [INFO] [stdout] test runner::channel::tests::channel_message_index_with_global_false_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_exit_with_code_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_index_deserializes_with_id ... ok [INFO] [stdout] test runner::channel::tests::channel_message_prompt_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_search_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_malformed_json_returns_error ... ok [INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_1_no_progress ... ok [INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_2_progress_50 ... ok [INFO] [stdout] test runner::channel::tests::channel_message_print_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_index_with_global_true_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_get_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_index_without_global_defaults_false ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_put_deserializes_with_id ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_put_global_true_deserializes ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_search_deserializes ... ok [INFO] [stdout] test runner::channel::tests::bash_ignoring_fd3_exits_cleanly ... ok [INFO] [stdout] test runner::channel::tests::child_fds_returns_correct_ends ... ok [INFO] [stdout] test runner::channel::tests::channel_message_unknown_type_returns_error ... ok [INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_3_progress_zero ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_put_global_false_deserializes ... ok [INFO] [stdout] test runner::channel::tests::bash_writes_to_fd3_are_readable_by_parent ... ok [INFO] [stdout] test runner::channel::tests::channel_message_store_put_without_global_defaults_to_none ... ok [INFO] [stdout] test runner::channel::tests::channel_message_status_deserializes::case_4_progress_hundred ... ok [INFO] [stdout] test runner::channel::tests::exit_signal_write_then_read_roundtrips ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_accumulates_documents_across_calls ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_first_document_searchable_after_second_call ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_includes_plugin_in_qualified_name ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_without_global_is_local ... ok [INFO] [stdout] test runner::channel::tests::handle_prompt_non_interactive_response_is_valid_json ... ok [INFO] [stdout] test runner::channel::tests::handle_prompt_non_interactive_writes_empty_response ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_cross_namespace_denied_when_not_global ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_second_document_searchable_after_accumulation ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_newline ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_double_quote ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_tab ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_cross_namespace_succeeds_when_global ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_multi_document_returns_content_not_doc_labels ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_response_valid_json_when_name_contains_backslash ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_returns_results_after_index ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_global_flag_propagates ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_returns_ack_with_id_and_ok ... ok [INFO] [stdout] test runner::channel::tests::close_child_ends_prevents_reader_hang ... ok [INFO] [stdout] test runner::channel::tests::handle_store_get_rejects_dotted_name ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_returns_empty_when_no_index ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_is_global_last_write_wins ... ok [INFO] [stdout] test runner::channel::tests::handle_index_message_qualifies_name_with_namespace ... ok [INFO] [stdout] test runner::channel::tests::json_escape_string_passthrough_for_plain_ascii ... ok [INFO] [stdout] test runner::channel::tests::handle_store_search_returns_empty_when_no_index_file ... ok [INFO] [stdout] test runner::channel::tests::new_produces_four_distinct_fds ... ok [INFO] [stdout] test runner::channel::tests::handle_store_get_returns_error_response_on_corrupt_database ... ok [INFO] [stdout] test runner::channel::tests::spawn_prompt_handler_exits_when_channel_closes ... ok [INFO] [stdout] test runner::channel::tests::handle_store_get_returns_empty_when_database_missing ... ok [INFO] [stdout] test runner::channel::tests::handle_search_message_returns_content_not_doc_id ... ok [INFO] [stdout] test runner::channel::tests::prompt_non_interactive_round_trip_does_not_deadlock ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_exits_on_eof_with_no_messages ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_handles_index_then_search_round_trip ... ok [INFO] [stdout] test runner::channel::tests::handle_store_get_returns_empty_value_for_missing_key ... ok [INFO] [stdout] test runner::channel::tests::handle_store_get_returns_value_for_existing_key ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_ignores_unknown_message_type ... ok [INFO] [stdout] test runner::channel::tests::handle_store_put_creates_redb_and_index_files ... ok [INFO] [stderr] hello [INFO] [stdout] test runner::channel::tests::handle_store_search_cross_namespace_succeeds_when_global ... ok [INFO] [stdout] test runner::channel::tests::handle_store_search_returns_matching_keys_after_put ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_drains_print_message_cleanly ... ok [INFO] [stdout] test runner::channel::tests::handle_store_search_returns_keys_via_fuzzy_fallback ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_empty_response_for_store_search ... ok [INFO] [stderr] test message [INFO] [stderr] Hello [INFO] [stdout] test runner::channel::tests::take_control_reader_is_idempotent ... ok [INFO] [stderr] Done [INFO] [stdout] test runner::channel::tests::take_response_writer_is_idempotent ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_clear_status_noop_when_no_status ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_progress_dropped_when_not_tty ... ok [INFO] [stdout] test runner::channel::tests::handle_store_search_returns_empty_when_no_match ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_empty_response_for_store_get ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic_without_indicator ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_clear_status_removes_indicator ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_ack_for_index ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_print_does_not_panic_with_active_indicator ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_no_ctx_writes_ack_for_store_put ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_search_with_no_index_returns_empty ... ok [INFO] [stdout] test runner::channel::tests::handle_store_put_returns_ack_with_id_and_ok ... ok [INFO] [stdout] test runner::channel::tests::handle_store_search_cross_namespace_denied_when_not_global ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_status_dropped_when_not_tty ... ok [INFO] [stdout] test runner::pipe::tests::test_dup_pipe_stdout_returns_readable_fd ... ok [INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_1_sh ... ok [INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_2_zsh ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_status_creates_indicator_when_tty ... ok [INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_3_python3 ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_5_js ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_index::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_end_with_newline ... ok [INFO] [stdout] test runner::preamble::tests::alias_resolves_to_preamble::case_4_javascript ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_index_id_has_index_prefix ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_index_parses_global_option_with_case ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_message_is_prefixed ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_index_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_case_extracts_error_field ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_search_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::bash_creft_search_error_case_writes_to_stderr ... ok [INFO] [stdout] test runner::preamble::tests::bash_preamble_has_digit_guard_for_progress ... ok [INFO] [stdout] test runner::preamble::tests::bash_preamble_contains_all_functions ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_put_id_has_store_put_prefix ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_get_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_put_includes_global_true_when_option_set ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_put_uses_creft_escape ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_progress_creates_indicator_when_tty ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_progress_saturates_above_100 ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_spinner_to_progress_does_not_panic ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_search_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_put_writes_to_fd3 ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_put_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_index_has_early_return_guard ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_index_defaults_global_to_false ... ok [INFO] [stdout] test runner::preamble::tests::bash_store_search_id_has_random_component ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_index_reads_sync_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_search_error_case_writes_to_stderr ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_search_error_message_is_prefixed ... ok [INFO] [stdout] test runner::preamble::tests::node_creft_search_reads_sync_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::node_preamble_contains_all_functions ... ok [INFO] [stdout] test runner::preamble::tests::node_store_get_reads_in_loop_until_newline ... ok [INFO] [stdout] test runner::preamble::tests::node_preamble_creft_status_accepts_progress_param ... ok [INFO] [stdout] test runner::preamble::tests::node_store_put_has_early_return_guard ... ok [INFO] [stdout] test runner::preamble::tests::node_store_put_omits_global_when_not_boolean ... ok [INFO] [stdout] test runner::preamble::tests::node_store_put_reads_sync_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::node_store_put_stringifies_name_key_value ... ok [INFO] [stdout] test runner::channel::tests::terminal_writer_progress_to_spinner_does_not_panic ... ok [INFO] [stdout] test runner::preamble::tests::node_preamble_creft_exit_defers_exit_until_stdout_drains ... ok [INFO] [stdout] test runner::preamble::tests::node_preamble_uses_typeof_require_guard ... ok [INFO] [stdout] test runner::preamble::tests::node_store_search_reads_sync_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::node_store_search_uses_random_id ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_get::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_put::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::all_preambles_contain_creft_search::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_put_type_field_is_store_put::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_contains_creft_store_search::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_2_python ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_get_type_field_is_store_get::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_1_bash ... ok [INFO] [stdout] test runner::preamble::tests::preamble_store_search_type_field_is_store_search::case_3_node ... ok [INFO] [stdout] test runner::preamble::tests::python_creft_index_accepts_options_dict ... ok [INFO] [stdout] test runner::preamble::tests::python_creft_search_error_case_writes_to_stderr ... ok [INFO] [stdout] test runner::preamble::tests::python_creft_index_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::python_store_get_extracts_value_field ... ok [INFO] [stdout] test runner::preamble::tests::python_creft_search_reads_json_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::python_store_get_reads_json_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::python_preamble_creft_exit_flushes_stdout ... ok [INFO] [stdout] test runner::preamble::tests::python_store_put_omits_global_when_not_in_options ... ok [INFO] [stdout] test runner::preamble::tests::python_store_put_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::python_creft_search_error_message_is_prefixed ... ok [INFO] [stdout] test runner::preamble::tests::python_store_search_extracts_results_field ... ok [INFO] [stdout] test runner::preamble::tests::python_preamble_contains_all_functions ... ok [INFO] [stdout] test runner::preamble::tests::python_store_search_reads_from_fd4 ... ok [INFO] [stdout] test runner::preamble::tests::python_preamble_creft_status_accepts_progress_param ... ok [INFO] [stdout] test runner::signal::tests::pipe_signal_guard_stores_and_clears_pgid ... ok [INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_3_empty ... ok [INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_1_llm ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_1_bash ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_2_sh ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_3_zsh ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_4_python ... ok [INFO] [stdout] test runner::preamble::tests::unsupported_language_returns_none::case_2_cobol ... ok [INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_node ... ok [INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_1_bash ... ok [INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_3_zsh ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_5_node ... ok [INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_python ... ok [INFO] [stdout] test runner::substitute::tests::test_no_shell_escape_python3 ... ok [INFO] [stdout] test runner::substitute::tests::shell_escape_neutralizes_subshell_injection::case_2_sh ... ok [INFO] [stdout] test runner::substitute::tests::should_shell_escape_classifies_lang::case_6_ruby ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_escape_single_quote_in_value ... ok [INFO] [stdout] test runner::substitute::tests::test_sponge_substitute_prev ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_no_escape_for_unknown_lang ... ok [INFO] [stdout] test runner::substitute::tests::test_sponge_substitute_prev_no_shell_escape ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_escape_default_not_escaped ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_escape_empty_string ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_escape_default_with_metachar_not_escaped ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_default ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_multiple ... ok [INFO] [stdout] test runner::substitute::tests::test_shell_escape_semicolon_injection ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_default_overridden ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_no_double_replace ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_4_already_upper ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_basic ... ok [INFO] [stdout] test runner::substitute::tests::test_substitute_unmatched_passes_through ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_empty_input_produces_empty_output ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_empty_value_preserved ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_1_lowercase ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_6_underscore_unchanged ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_5_mixed_case ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_2_hyphenated ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_3_python3 ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_name_normalization::case_3_multi_hyphen ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_1_sh ... ok [INFO] [stdout] test runner::tests::bound_pairs_to_env_preserves_order_and_count ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_2_zsh ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_5_js ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_4_javascript ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_6_typescript ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_8_perl ... ok [INFO] [stdout] test runner::tests::interpreter_maps_lang_to_executable::case_7_ts ... ok [INFO] [stdout] test runner::tests::make_execution_error_exit_code_returns_execution_failed ... ok [INFO] [stdout] test runner::tests::run_context_env_pairs_returns_str_refs ... ok [INFO] [stdout] test runner::tests::prepare_block_script_file_has_correct_extension ... ok [INFO] [stdout] test runner::tests::prepare_block_script_shebang_only_no_panic ... ok [INFO] [stdout] test runner::tests::prepare_block_script_some_preamble_prepends_preamble ... ok [INFO] [stdout] test runner::tests::prepare_block_script_shebang_without_preamble_unchanged ... ok [INFO] [stdout] test runner::tests::prepare_block_script_none_preamble_writes_code_only ... ok [INFO] [stdout] test runner::tests::make_execution_error_signal_returns_execution_signaled ... ok [INFO] [stdout] test runner::tests::run_context_cancel_shared_across_clone ... ok [INFO] [stdout] test runner::tests::run_context_clone_shares_cwd_and_env ... ok [INFO] [stdout] test runner::tests::run_context_is_cancelled_default_false ... ok [INFO] [stdout] test runner::tests::run_context_new_cwd_accessible ... ok [INFO] [stdout] test runner::tests::run_context_is_cancelled_true_after_flag_set ... ok [INFO] [stdout] test runner::tests::prepare_block_script_shebang_placed_before_preamble ... ok [INFO] [stdout] test runner::tests::test_check_env_missing_required_var_errors ... ok [INFO] [stdout] test runner::tests::test_e2big_enrichment ... ok [INFO] [stdout] test runner::tests::test_combined_short_with_value ... ok [INFO] [stdout] test runner::tests::test_arg_validation_invalid_regex_errors ... ok [INFO] [stdout] test runner::tests::test_execution_signaled_exit_code ... ok [INFO] [stdout] test runner::tests::test_enrich_io_error_other_errors_passthrough ... ok [INFO] [stdout] test runner::tests::test_extension_mapping ... ok [INFO] [stdout] test runner::tests::test_flag_bool_presence ... ok [INFO] [stdout] test runner::tests::test_flag_equals_syntax ... ok [INFO] [stdout] test runner::tests::test_arg_validation_invalid_value_errors ... ok [INFO] [stdout] test runner::tests::test_check_env_optional_missing_ok ... ok [INFO] [stdout] test runner::tests::test_flag_string_with_default_used_when_absent ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_handles_store_put_then_get_round_trip ... ok [INFO] [stdout] test runner::tests::test_flag_validation_valid_value_passes ... ok [INFO] [stdout] test runner::tests::test_combined_short_flags_bool_only ... ok [INFO] [stdout] test runner::tests::test_flag_validation_invalid_value_errors ... ok [INFO] [stdout] test runner::tests::test_optional_arg_no_default_template_errors ... ok [INFO] [stdout] test runner::tests::run_context_request_cancel_visible_to_clones ... ok [INFO] [stdout] test runner::tests::test_flag_validation_invalid_regex_errors ... ok [INFO] [stdout] test runner::tests::test_optional_arg_not_bound_when_absent ... ok [INFO] [stdout] test runner::tests::test_optional_arg_template_default_fires ... ok [INFO] [stdout] test runner::tests::run_context_request_cancel_sets_flag ... ok [INFO] [stdout] test runner::tests::test_arg_validation_valid_value_passes ... ok [INFO] [stdout] test runner::tests::test_optional_flag_no_default_binds_empty ... ok [INFO] [stdout] test runner::tests::test_optional_arg_uses_provided_value ... ok [INFO] [stdout] test runner::channel::tests::spawn_reader_handles_store_put_then_search_round_trip ... ok [INFO] [stdout] test runner::tests::test_optional_arg_with_frontmatter_default ... ok [INFO] [stdout] test runner::tests::test_required_arg_missing_errors ... ok [INFO] [stdout] test runner::tests::test_flag_string_no_default_absent_skipped ... ok [INFO] [stdout] test runner::tests::test_unknown_flag_errors ... ok [INFO] [stdout] get completed [INFO] [stdout] test search::index::tests::build_filter_contains_both_whole_token_and_ngram_hashes ... ok [INFO] [stdout] test runner::tests::pipe_chain_block_creft_index_and_search_receive_results ... ok [INFO] [stdout] test runner::tests::test_signal_detection ... ok [INFO] [stdout] test runner::tests::pipe_chain_block_creft_store_get_returns_empty_for_missing_key ... ok [INFO] [stdout] test runner::tests::single_block_creft_search_receives_response_without_hanging ... ok [INFO] [stdout] test search::index::tests::build_filter_contains_ngram_hashes ... ok [INFO] [stdout] test runner::tests::test_pipe_chain_multiple_failures ... ok [INFO] [stdout] test search::index::tests::build_filter_contains_whole_token_hashes ... ok [INFO] [stdout] test search::index::tests::document_with_no_tokens_excluded_from_token_queries ... ok [INFO] [stdout] test search::index::tests::empty_index_returns_no_results ... ok [INFO] [stdout] test search::index::tests::empty_query_returns_all_entries ... ok [INFO] [stdout] test search::index::tests::from_bytes_rejects_empty_slice ... ok [INFO] [stdout] test search::index::tests::exact_search_unchanged_after_combined_filter_build ... ok [INFO] [stdout] test search::index::tests::empty_index_round_trips_correctly ... ok [INFO] [stdout] test search::index::tests::from_bytes_rejects_truncated_data ... ok [INFO] [stdout] test search::index::tests::exact_search_not_affected_by_fuzzy_method ... ok [INFO] [stdout] test search::index::tests::len_and_is_empty_reflect_entry_count ... ok [INFO] [stdout] test search::index::tests::from_bytes_rejects_trailing_garbage ... ok [INFO] [stdout] test search::index::tests::round_trip_preserves_entry_count ... ok [INFO] [stdout] test search::index::tests::multi_token_query_matching_single_document ... ok [INFO] [stdout] test search::index::tests::round_trip_preserves_names_and_descriptions ... ok [INFO] [stdout] test search::index::tests::multi_token_query_and_semantics ... ok [INFO] [stdout] test search::index::tests::round_trip_preserves_search_behavior ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_returns_candidate_with_shared_trigrams ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_empty_query_returns_empty ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_short_query_bigrams_match_document_via_shared_bigram ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_empty_index_returns_empty ... ok [INFO] [stdout] test search::snippet::tests::context_at_end_of_document_does_not_overflow ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_single_char_query_returns_empty ... ok [INFO] [stdout] test search::index::tests::single_token_query_returns_matching_documents ... ok [INFO] [stdout] test search::snippet::tests::context_at_start_of_document_does_not_underflow ... ok [INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_1_context_zero ... ok [INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_2_context_one ... ok [INFO] [stdout] test search::snippet::tests::empty_query_terms_returns_empty_vec ... ok [INFO] [stdout] test search::snippet::tests::empty_text_returns_empty_vec ... ok [INFO] [stdout] test search::snippet::tests::fuzzy_snippets_context_lines_work_same_as_extract_snippets ... ok [INFO] [stdout] test search::snippet::tests::fuzzy_snippets_fallback_to_query_terms_when_no_matched_words ... ok [INFO] [stdout] test search::snippet::tests::fuzzy_snippets_no_match_returns_empty ... ok [INFO] [stdout] test search::snippet::tests::fuzzy_snippets_use_matched_words_not_query_terms ... ok [INFO] [stdout] test search::snippet::tests::matching_is_case_insensitive ... ok [INFO] [stdout] test search::snippet::tests::matching_is_substring ... ok [INFO] [stdout] test search::snippet::tests::no_matches_returns_empty_vec ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_requires_ratio_threshold_not_any_gram ... ok [INFO] [stdout] test search::snippet::tests::render_highlights_query_terms_in_matching_lines ... ok [INFO] [stdout] test search::index::tests::search_fuzzy_returns_candidate_for_typo_query ... ok [INFO] [stdout] test search::snippet::tests::render_includes_name_and_description ... ok [INFO] [stdout] test search::snippet::tests::render_returns_none_for_empty_results_slice ... ok [INFO] [stdout] test search::snippet::tests::render_multiple_docs_separated_by_blank_line ... ok [INFO] [stdout] test search::snippet::tests::render_produces_different_output_with_and_without_ansi ... ok [INFO] [stdout] test search::snippet::tests::render_returns_none_when_no_results_have_snippets ... ok [INFO] [stdout] test runner::channel::tests::handle_store_put_replaces_existing_key ... ok [INFO] [stdout] test search::snippet::tests::render_separates_non_adjacent_snippets_with_ellipsis ... ok [INFO] [stdout] test search::snippet::tests::render_with_show_namespace_false_omits_namespace_header ... ok [INFO] [stdout] test search::snippet::tests::render_with_show_namespace_true_includes_namespace_header ... ok [INFO] [stdout] test search::snippet::tests::single_match_returns_one_snippet_with_match_line ... ok [INFO] [stdout] test search::snippet::tests::render_skips_false_positive_results_but_shows_real_matches ... ok [INFO] [stdout] test search::snippet::tests::two_distant_matches_produce_two_snippets ... ok [INFO] [stdout] test search::snippet::tests::single_match_with_context_includes_surrounding_lines ... ok [INFO] [stdout] test search::store::tests::index_path_named_namespace_returns_dotted_idx ... ok [INFO] [stdout] test search::store::tests::index_path_with_plugin_prefix_returns_dotted_idx ... ok [INFO] [stdout] test search::snippet::tests::two_nearby_matches_within_context_merge_into_one_snippet ... ok [INFO] [stdout] test search::store::tests::load_index_returns_none_for_nonexistent_file ... ok [INFO] [stdout] test runner::channel::tests::handle_store_put_non_store_open_error_does_not_panic ... ok [INFO] [stdout] test search::store::tests::index_path_root_namespace_returns_root_idx ... ok [INFO] [stdout] test search::store::tests::load_index_returns_none_for_corrupt_bytes ... ok [INFO] [stdout] test search::index::tests::exact_search_and_semantics_unchanged ... ok [INFO] [stdout] test search::snippet::tests::context_window_size_controls_line_count::case_3_context_two ... ok [INFO] [stdout] hello [INFO] [stdout] test runner::tests::test_multi_block_default_pipes ... ok [INFO] [stdout] test runner::tests::test_pipe_single_block_passthrough ... ok [INFO] [stdout] test runner::tests::test_pipe_broken_pipe_silenced ... ok [INFO] [stdout] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0 [INFO] [stdout] test runner::tests::test_pipe_block0_fails ... ok [INFO] [stdout] test search::store::tests::strip_code_blocks_plain_emits_no_ansi_for_headers ... ok [INFO] [stdout] test search::store::tests::strip_code_blocks_plain_preserves_docs_block_content ... ok [INFO] [stdout] test search::store::tests::strip_code_blocks_plain_removes_bash_blocks ... ok [INFO] [stdout] test runner::tests::test_pipe_large_stdin_no_deadlock ... ok [INFO] [stdout] test search::store::tests::rebuild_namespace_index_creates_index_file_on_disk ... ok [INFO] [stdout] test search::tests::search_all_indexes_exact_not_affected_by_fuzzy_path ... ok [INFO] [stdout] test search::store::tests::rebuild_all_indexes_creates_builtin_idx ... ok [INFO] [stdout] 0 [INFO] [stdout] got: HELLO [INFO] [stdout] test runner::tests::test_pipe_last_block_fails_reports_error ... ok [INFO] [stdout] test search::tests::search_all_indexes_false_positive_has_empty_snippets ... ok [INFO] [stdout] test search::tests::search_all_indexes_finds_results_in_global_scope ... ok [INFO] [stdout] test runner::tests::test_pipe_empty_stdin_payload ... ok [INFO] [stdout] test search::store::tests::rebuild_namespace_index_excludes_skills_from_other_namespaces ... ok [INFO] [stdout] test runner::tests::test_pipe_three_blocks ... ok [INFO] [stdout] test search::tests::search_all_indexes_no_matches_returns_empty_without_error ... ok [INFO] [stdout] test search::store::tests::rebuild_builtin_index_contains_add_entry ... ok [INFO] [stdout] test search::tests::search_all_indexes_fuzzy_results_have_non_empty_snippets ... ok [INFO] [stdout] test search::tests::search_all_indexes_returns_matches_from_skill_index ... ok [INFO] [stdout] test search::tokenize::tests::duplicate_tokens_deduplicated ... ok [INFO] [stdout] test search::tests::search_all_indexes_combines_results_from_multiple_namespaces ... ok [INFO] [stdout] test search::tests::search_all_indexes_no_fuzzy_candidates_below_threshold_returns_empty ... ok [INFO] [stdout] test search::tests::search_all_indexes_returns_empty_when_no_index_files_exist ... ok [INFO] [stdout] test search::tests::search_all_indexes_returns_snippet_results_not_old_type ... ok [INFO] [stdout] test search::tests::search_all_indexes_fuzzy_results_sorted_by_tversky_score_descending ... ok [INFO] [stdout] test search::tokenize::tests::empty_text_returns_empty_vec ... ok [INFO] [stdout] test search::tokenize::tests::gram_set_is_case_insensitive ... ok [INFO] [stdout] test search::tokenize::tests::gram_set_produces_expected_grams::case_1_exit ... ok [INFO] [stdout] test search::tokenize::tests::gram_set_produces_expected_grams::case_2_heredoc ... ok [INFO] [stdout] test search::tokenize::tests::gram_set_two_char_input_yields_one_bigram ... ok [INFO] [stdout] test search::tokenize::tests::gram_set_empty_input_is_empty ... ok [INFO] [stdout] test search::tokenize::tests::hello_world_produces_two_hashes ... ok [INFO] [stdout] test search::tokenize::tests::hash_token_is_deterministic ... ok [INFO] [stdout] test search::tokenize::tests::hyphen_and_underscore_kept_within_tokens ... ok [INFO] [stdout] test search::tokenize::tests::ngrams_from_token_exactly_three_chars_yields_one_gram ... ok [INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_1 ... ok [INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_2 ... ok [INFO] [stdout] test search::tokenize::tests::min_token_length_two_chars::case_3 ... ok [INFO] [stdout] test search::tokenize::tests::ngrams_from_token_one_char_yields_nothing ... ok [INFO] [stdout] test search::tokenize::tests::ngrams_from_token_yields_sliding_window ... ok [INFO] [stdout] test search::tokenize::tests::punctuation_splits_into_separate_tokens ... ok [INFO] [stdout] test search::tokenize::tests::ngrams_from_token_two_chars_yields_nothing ... ok [INFO] [stdout] test search::tokenize::tests::punctuation_boundary_splits_adjacent_words ... ok [INFO] [stdout] test search::tokenize::tests::score_query_empty_document_returns_zero ... ok [INFO] [stdout] test search::tokenize::tests::score_query_empty_query_returns_zero ... ok [INFO] [stdout] test search::tokenize::tests::score_query_single_char_query_word_returns_zero ... ok [INFO] [stdout] test search::tokenize::tests::score_query_multi_word_averages_per_word_best_scores ... ok [INFO] [stdout] test search::tokenize::tests::score_query_no_match_returns_zero ... ok [INFO] [stdout] test search::tokenize::tests::score_query_single_word_best_match_in_document ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_empty_document_returns_empty_matches ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_deduplicates_same_doc_word ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_multi_word_returns_one_match_per_query_word ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_empty_query_returns_empty_matches ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_returns_best_matching_doc_word ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_returns_same_score_as_score_query ... ok [INFO] [stdout] test search::tokenize::tests::score_query_with_matches_zero_score_words_excluded_from_matches ... ok [INFO] [stdout] test search::tokenize::tests::three_word_text_produces_three_hashes ... ok [INFO] [stdout] test search::tokenize::tests::tokenization_is_case_insensitive ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_deduplicates_across_tokens ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_empty_returns_empty ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_five_char_token_produces_both_gram_sizes ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_multi_word_no_overlap_produces_union ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_four_char_token_produces_both_gram_sizes ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_is_case_insensitive ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_short_tokens_after_split_produce_grams ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_three_char_token_produces_three_hashes ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_disjoint_grams_returns_zero ... ok [INFO] [stdout] test search::store::tests::builtin_index_round_trips_via_load_index ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_two_char_token_produces_one_hash ... ok [INFO] [stdout] test search::tokenize::tests::tokenize_ngrams_whitespace_only_returns_empty ... ok [INFO] [stdout] test search::store::tests::remove_in_rebuilds_namespace_index_without_removed_skill ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_doc_grams_do_not_penalize ... ok [INFO] [stdout] test search::store::tests::rebuild_namespace_index_is_queryable_after_write ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_single_substitution_four_char_token_shares_bigram ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_identical_strings ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_is_asymmetric ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_no_shared_trigrams_returns_zero ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_typo_five_char_token_shares_trigrams ... ok [INFO] [stdout] test search::xor::tests::duplicate_keys_treated_as_deduplicated_set ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_typo_returns_partial_score ... ok [INFO] [stdout] test search::tokenize::tests::whitespace_only_returns_empty_vec ... ok [INFO] [stdout] test search::xor::tests::all_construction_keys_are_present ... ok [INFO] [stdout] test search::xor::tests::fingerprint8_is_deterministic ... ok [INFO] [stdout] test search::xor::tests::from_bytes_rejects_truncated_fingerprint_array ... ok [INFO] [stdout] test search::xor::tests::from_bytes_rejects_too_short_input ... ok [INFO] [stdout] test search::xor::tests::hash_to_positions_each_in_correct_block ... ok [INFO] [stdout] test search::store::tests::rebuild_all_indexes_creates_index_for_each_namespace ... ok [INFO] [stdout] test search::xor::tests::empty_filter_round_trips_correctly ... ok [INFO] [stdout] test search::xor::tests::mixsplit_distinct_inputs_distinct_outputs ... ok [INFO] [stdout] test search::xor::tests::mixsplit_is_deterministic ... ok [INFO] [stdout] test search::xor::tests::round_trip_all_construction_keys_survive ... ok [INFO] [stdout] test search::xor::tests::reduce_output_always_in_range ... ok [INFO] [stdout] test search::xor::tests::large_key_set_all_construction_keys_present ... ok [INFO] [stdout] test search::tokenize::tests::tversky_score_partial_recall_query_fully_contained_in_doc ... ok [INFO] [stdout] test search::xor::tests::false_positive_rate_below_one_percent ... ok [INFO] [stdout] test search::tests::search_all_indexes_skips_corrupt_files ... ok [INFO] [stdout] test search::xor::tests::empty_set_rejects_every_query ... ok [INFO] [stdout] test settings::tests::known_entries_default_description_is_non_empty ... ok [INFO] [stdout] test search::xor::tests::serialization_byte_length_matches_header_plus_fingerprints ... ok [INFO] [stdout] test search::xor::tests::single_key_present_and_neighbor_likely_absent ... ok [INFO] [stdout] test settings::tests::get_returns_none_for_missing_key ... ok [INFO] [stdout] test settings::tests::iter_returns_all_stored_pairs ... ok [INFO] [stdout] test settings::tests::known_entries_returns_one_entry_per_known_key ... ok [INFO] [stdout] test settings::tests::known_entries_shows_default_when_key_not_set ... ok [INFO] [stdout] test settings::tests::known_entries_shows_set_value_when_key_is_configured ... ok [INFO] [stdout] test settings::tests::load_returns_defaults_when_file_does_not_exist ... ok [INFO] [stdout] test settings::tests::load_parses_valid_json_file ... ok [INFO] [stdout] test settings::tests::load_returns_error_for_malformed_json ... ok [INFO] [stdout] test settings::tests::save_and_load_round_trips_values ... ok [INFO] [stdout] test settings::tests::iter_is_empty_on_default ... ok [INFO] [stdout] test settings::tests::known_defaults_and_known_keys_are_in_sync ... ok [INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_2_unknown_key ... ok [INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_3_empty_key ... ok [INFO] [stdout] test search::xor::tests::round_trip_preserves_false_positive_behavior ... ok [INFO] [stdout] test settings::tests::save_creates_parent_directories ... ok [INFO] [stdout] test settings::tests::save_produces_pretty_json_with_shell_key ... ok [INFO] [stdout] test settings::tests::set_accepts_known_keys_and_rejects_unknown::case_1_shell ... ok [INFO] [stdout] test settings::tests::set_none_value_is_stored_as_literal_none_string ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_02_gemini_directory ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_01_gemini_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_06_windsurf_rules_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_04_cursor_rules_file ... ok [INFO] [stdout] test settings::tests::set_unknown_key_error_lists_known_keys ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_03_cursor_directory ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_05_windsurf_directory ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_09_copilot_instructions_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_07_aider_conf_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_08_aider_conventions_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_11_codex_directory ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_10_codex_agents_file ... ok [INFO] [stdout] test setup::tests::detect_systems_recognizes_marker::case_12_claude_code_directory ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_content_has_dynamic_availability_check ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_content_has_valid_frontmatter ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_content_includes_creft_reference ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_global_no_home_errors ... ok [INFO] [stdout] test setup::tests::install_global_no_home_errors::case_1_aider ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_writes_correct_content ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_global_writes_to_home_creft ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_updates_stale_content ... ok [INFO] [stdout] test setup::tests::install_global_no_home_errors::case_3_gemini ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_creates_file_at_project_path ... ok [INFO] [stdout] test setup::tests::merge_session_start_hook_errors_on_root_json_array ... ok [INFO] [stdout] test setup::tests::install_global_no_home_errors::case_4_claude_code ... ok [INFO] [stdout] test setup::tests::install_global_no_home_errors::case_2_codex ... ok [INFO] [stdout] test setup::tests::read_modify_write_json_errors_on_invalid_json ... ok [INFO] [stdout] test setup::tests::read_modify_write_json_creates_file_when_missing ... ok [INFO] [stdout] test setup::tests::merge_session_start_hook_errors_on_hooks_non_object ... ok [INFO] [stdout] test setup::tests::test_creft_owned_file_classification ... ok [INFO] [stdout] test setup::tests::test_detect_no_gemini_when_absent ... ok [INFO] [stdout] test setup::tests::test_install_aider_global_creates_conventions_file ... ok [INFO] [stdout] test setup::tests::test_install_claude_code_hook_creates_settings_json ... ok [INFO] [stdout] test setup::tests::test_install_claude_code_hook_also_writes_skill_fallback ... ok [INFO] [stdout] test setup::tests::test_install_claude_code_global_path ... ok [INFO] [stdout] test setup::tests::read_modify_write_json_preserves_existing_keys ... ok [INFO] [stdout] test setup::tests::test_install_appends_to_existing_non_creft_file ... ok [INFO] [stdout] test setup::tests::test_install_copilot_global_errors ... ok [INFO] [stdout] test setup::tests::test_install_codex_project_path ... ok [INFO] [stdout] test setup::tests::test_install_claude_code_hook_idempotent_no_duplicate ... ok [INFO] [stdout] test setup::tests::test_install_cursor_global_errors ... ok [INFO] [stdout] test setup::tests::test_install_claude_code_hook_merges_preserving_user_hooks ... ok [INFO] [stdout] test setup::tests::test_install_gemini_does_not_write_static_file ... ok [INFO] [stdout] test setup::tests::test_install_creates_parent_directories ... ok [INFO] [stdout] test setup::tests::test_install_cursor_uses_mdc_extension ... ok [INFO] [stdout] test setup::tests::test_install_gemini_global_hook ... ok [INFO] [stdout] test setup::tests::test_install_gemini_hook_idempotent_no_duplicate ... ok [INFO] [stdout] test setup::tests::test_install_codex_global_path ... ok [INFO] [stdout] test setup::tests::test_install_gemini_project_hook ... ok [INFO] [stdout] test setup::tests::test_install_strategy_static_file_systems ... ok [INFO] [stdout] test setup::tests::test_install_skip_current_version ... ok [INFO] [stdout] test setup::tests::test_install_strategy_hook_systems ... ok [INFO] [stdout] test setup::tests::test_install_gemini_hook_merges_preserving_user_hooks ... ok [INFO] [stdout] test setup::tests::test_install_replaces_stale_creft_section_in_shared_file ... ok [INFO] [stdout] test setup::tests::test_install_windsurf_global_errors ... ok [INFO] [stdout] test setup::tests::test_install_upgrades_old_marker_to_current ... ok [INFO] [stdout] test setup::tests::test_install_windsurf_has_frontmatter ... ok [INFO] [stdout] test setup::tests::test_instructions_contain_discovery_commands ... ok [INFO] [stdout] test setup::tests::test_replace_creft_section_case_insensitive ... ok [INFO] [stdout] test setup::tests::test_replace_creft_section_replaces_content ... ok [INFO] [stdout] test setup::tests::test_install_updates_stale_version ... ok [INFO] [stdout] test setup::tests::test_replace_creft_section_preserves_content_after ... ok [INFO] [stdout] test setup::tests::test_system_names_round_trip ... ok [INFO] [stdout] test shell::tests::detect_creft_shell_overrides_settings ... ok [INFO] [stdout] test setup::tests::test_replace_creft_section_no_heading_appends ... ok [INFO] [stdout] test setup::tests::test_system_all_includes_gemini ... ok [INFO] [stdout] test setup::tests::test_system_aliases ... ok [INFO] [stdout] test shell::tests::detect_returns_bash_when_shell_is_full_path_bash ... ok [INFO] [stdout] test shell::tests::detect_returns_fish_when_creft_shell_is_fish_path ... ok [INFO] [stdout] test setup::tests::ensure_session_skill_is_idempotent ... ok [INFO] [stdout] test shell::tests::detect_returns_none_when_settings_shell_is_none_literal ... ok [INFO] [stdout] test shell::tests::detect_returns_none_when_shell_is_unset ... ok [INFO] [stdout] test shell::tests::detect_returns_settings_shell_when_creft_shell_absent ... ok [INFO] [stdout] test setup::tests::detect_systems_github_directory_alone_does_not_trigger_copilot ... ok [INFO] [stdout] test shell::tests::detect_returns_zsh_when_shell_is_bin_zsh ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_1_bash ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_5_python ... ok [INFO] [stdout] test shell::tests::detect_returns_none_when_creft_shell_is_none_literal ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_6_node ... ok [INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_2_bash_preference_overrides_zsh_block ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_3_zsh ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_2_sh ... ok [INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_3_ignores_preference_for_non_shell_block ... ok [INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_1_zsh_preference_overrides_bash_block ... ok [INFO] [stdout] test shell::tests::resolve_shell_applies_preference_to_shell_blocks_only::case_4_returns_none_when_no_preference ... ok [INFO] [stdout] test store::tests::test_commands_dir_for_uses_scope ... ok [INFO] [stdout] test store::tests::test_default_write_scope_creft_home_mode_is_global ... ok [INFO] [stdout] test store::tests::test_find_local_root_from_finds_creft_at_start ... ok [INFO] [stdout] test store::tests::collect_commands_excludes_invalid_yaml_frontmatter_file_from_results ... ok [INFO] [stdout] test store::tests::collect_commands_silently_skips_plain_markdown_without_frontmatter ... ok [INFO] [stdout] test store::tests::test_default_write_scope_no_local_root_is_global ... ok [INFO] [stdout] test store::tests::test_collect_commands_skips_symlinks ... ok [INFO] [stdout] test shell::tests::is_shell_family_classifies_lang_correctly::case_4_fish ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_deep_nesting ... ok [INFO] [stdout] test store::tests::test_find_local_root_from_skips_creft_file ... ok [INFO] [stdout] test store::tests::test_global_root_contains_dot_creft ... ok [INFO] [stdout] test store::tests::test_find_parent_local_root_not_found ... ok [INFO] [stdout] test store::tests::test_find_parent_local_root_found ... ok [INFO] [stdout] test store::tests::test_default_write_scope_local_root_is_local ... ok [INFO] [stdout] test store::tests::test_find_local_root_from_returns_none_when_absent ... ok [INFO] [stdout] test store::tests::test_find_parent_local_root_skips_start ... ok [INFO] [stdout] test store::tests::test_find_local_root_from_finds_creft_in_parent ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_empty ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_drill_in ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_mixed_package ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_no_match ... ok [INFO] [stdout] test store::tests::test_group_skill_name_equals_prefix ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_single_skill ... ok [INFO] [stdout] test search::tests::search_all_indexes_includes_builtin_idx ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_package_detection ... ok [INFO] [stdout] test store::tests::test_group_by_namespace_top_level ... ok [INFO] [stdout] test store::tests::test_is_local_source_package_local ... ok [INFO] [stdout] test store::tests::test_is_reserved_init ... ok [INFO] [stdout] test store::tests::test_is_local_source_package_global ... ok [INFO] [stdout] test store::tests::test_is_local_source_owned_global ... ok [INFO] [stdout] test store::tests::test_is_local_source_owned_local ... ok [INFO] [stdout] test store::tests::test_is_reserved ... ok [INFO] [stdout] test store::tests::test_has_local_root_missing ... ok [INFO] [stdout] test store::tests::test_load_in_loads_from_correct_scope ... ok [INFO] [stdout] test store::tests::test_has_local_root_exists ... ok [INFO] [stdout] test store::tests::test_name_to_path_in_uses_scope ... ok [INFO] [stdout] test store::tests::test_name_to_path_namespaced ... ok [INFO] [stdout] test store::tests::test_has_local_root_file_not_dir ... ok [INFO] [stdout] test store::tests::test_list_all_with_source_merges_scopes_local_shadows_global ... ok [INFO] [stdout] test store::tests::test_resolve_command_rejects_traversal ... ok [INFO] [stdout] test store::tests::test_name_to_path_simple ... ok [INFO] [stdout] test store::tests::test_remove_in_deletes_from_correct_scope ... ok [INFO] [stdout] test store::tests::test_resolve_root_creft_home_overrides_both_scopes ... ok [INFO] [stdout] test store::tests::test_validate_name_empty ... ok [INFO] [stdout] test store::tests::test_resolve_root_global_scope_returns_global_root ... ok [INFO] [stdout] test store::tests::test_validate_name_invalid_chars ... ok [INFO] [stdout] test store::tests::test_validate_name_ok ... ok [INFO] [stdout] test store::tests::test_resolve_root_local_scope_returns_local_root ... ok [INFO] [stdout] test store::tests::test_resolve_root_local_scope_falls_back_to_global ... ok [INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_3_slash ... ok [INFO] [stdout] test store::tests::test_validate_name_reserved ... ok [INFO] [stdout] test store::tests::test_namespace_exists_false ... ok [INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_1_dot ... ok [INFO] [stdout] test store::tests::test_namespace_exists_true ... ok [INFO] [stdout] test store::tests::test_save_to_global_scope_writes_to_global_commands_dir ... ok [INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_2_dotdot ... ok [INFO] [stdout] test store::tests::test_save_to_local_scope_writes_to_local_commands_dir ... ok [INFO] [stdout] test store::tests::test_validate_path_token_accepts_valid ... ok [INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_4_backslash ... ok [INFO] [stdout] test store_kv::tests::load_store_index_returns_none_when_file_missing ... ok [INFO] [stdout] test store::tests::validate_path_token_rejects_invalid::case_5_empty ... ok [INFO] [stdout] test store_kv::tests::load_store_index_returns_none_for_corrupt_bytes ... ok [INFO] [stdout] test store_kv::tests::rebuild_store_index_on_empty_store_produces_empty_index ... ok [INFO] [stdout] test search::tokenize::tests::hash_token_distinct_tokens_produce_distinct_hashes ... ok [INFO] [stdout] test store_kv::tests::put_then_get_returns_inserted_value ... ok [INFO] [stdout] test store_kv::tests::put_without_global_on_new_store_leaves_flag_false ... ok [INFO] [stdout] test store_kv::tests::store_dir_for_global_scope_returns_stores_subdir ... ok [INFO] [stdout] test store_kv::tests::put_with_global_false_after_global_true_revokes_flag ... ok [INFO] [stdout] test search::tokenize::tests::ngrams_from_token_four_chars_yields_two_grams ... ok [INFO] [stdout] test store_kv::tests::different_qualified_names_use_separate_databases ... ok [INFO] [stdout] test store_kv::tests::search_index_from_store_with_config_key_matches_on_value_content ... ok [INFO] [stdout] test store_kv::tests::rebuild_then_load_produces_queryable_index ... ok [INFO] [stdout] test store_kv::tests::store_get_returns_err_when_file_exists_but_is_corrupt ... ok [INFO] [stdout] test search::store::tests::rebuild_builtin_index_is_searchable_for_builtin_term ... ok [INFO] [stdout] test store_kv::tests::rebuild_store_index_creates_directory_if_missing ... ok [INFO] [stdout] test store_kv::tests::store_entries_returns_err_when_file_exists_but_is_corrupt ... ok [INFO] [stdout] test search::store::tests::rebuild_builtin_index_returns_empty_for_unknown_term ... ok [INFO] [stdout] test store_kv::tests::store_get_returns_none_when_database_does_not_exist ... ok [INFO] [stdout] test store_kv::tests::store_index_path_appends_store_idx_extension ... ok [INFO] [stdout] test store_kv::tests::store_path_appends_redb_extension ... ok [INFO] [stdout] test store_kv::tests::some_value_differs_from_none ... ok [INFO] [stdout] test store_kv::tests::store_path_three_segment_name ... ok [INFO] [stdout] test store_kv::tests::put_with_global_none_after_global_true_leaves_flag_unchanged ... ok [INFO] [stdout] test store_kv::tests::put_with_global_true_then_is_global_returns_true ... ok [INFO] [stdout] test style::tests::init_color_no_color_disables_yansi ... ok [INFO] [stdout] test style::tests::no_color_env_disables_color ... ok [INFO] [stdout] test store_kv::tests::put_multiple_keys_all_retrievable ... ok [INFO] [stdout] test style::tests::init_color_term_dumb_disables_yansi ... ok [INFO] [stdout] test style::tests::paint_disabled_produces_no_ansi ... ok [INFO] [stdout] test style::tests::paint_enabled_produces_ansi_bold ... ok [INFO] [stdout] test validate::tests::arg_name_with_space_produces_invalid_chars_error ... ok [INFO] [stdout] test validate::tests::duplicate_arg_names_produce_error ... ok [INFO] [stdout] test validate::tests::digit_short_form_produces_error ... ok [INFO] [stdout] test style::tests::term_dumb_disables_color ... ok [INFO] [stdout] test validate::tests::dry_run_is_caught_by_reserved_not_char_check ... ok [INFO] [stdout] test validate::tests::flag_and_arg_sharing_name_produce_conflict_error ... ok [INFO] [stdout] test validate::tests::flag_name_starting_with_digit_produces_error ... ok [INFO] [stdout] test store_kv::tests::second_put_replaces_first_value ... ok [INFO] [stdout] test validate::tests::duplicate_flag_short_forms_produce_error ... ok [INFO] [stdout] test validate::tests::empty_arg_name_produces_error ... ok [INFO] [stdout] test validate::tests::empty_flag_name_produces_error ... ok [INFO] [stdout] test store_kv::tests::store_entries_returns_all_pairs ... ok [INFO] [stdout] test search::store::tests::rebuild_builtin_index_contains_entries_for_all_variants ... ok [INFO] [stdout] test validate::tests::flag_name_with_slash_produces_invalid_chars_error ... ok [INFO] [stdout] test validate::tests::flag_name_with_space_produces_invalid_chars_error ... ok [INFO] [stdout] test validate::tests::multichar_short_form_produces_error ... ok [INFO] [stdout] test validate::tests::no_flags_no_args_passes_cleanly ... ok [INFO] [stdout] test store_kv::tests::store_is_global_returns_false_when_no_meta_flag_set ... ok [INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_2_dry_run ... ok [INFO] [stdout] test validate::tests::hyphenated_flag_in_bash_block_emits_env_var_warning ... ok [INFO] [stdout] test validate::tests::multiple_hyphenated_flags_each_emit_a_warning ... ok [INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_3_verbose ... ok [INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_4_docs ... ok [INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_5_version ... ok [INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_1_h ... ok [INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_3_cap_v ... ok [INFO] [stdout] test validate::tests::reserved_flag_name_produces_error::case_1_help ... ok [INFO] [stdout] test validate::tests::non_hyphenated_flag_in_bash_block_emits_no_env_var_warning ... ok [INFO] [stdout] test validate::tests::hyphenated_flag_with_template_usage_passes_bash_syntax ... ok [INFO] [stdout] test validate::tests::reserved_short_flag_produces_error::case_2_v ... ok [INFO] [stdout] test validate::tests::test_bash_placeholder_no_false_positive ... ok [INFO] [stdout] test validate::tests::test_description_length_diagnostic_has_no_block_index ... ok [INFO] [stdout] test validate::tests::test_dep_resolution_shell_missing ... ok [INFO] [stdout] test validate::tests::test_description_length_no_warn_short ... ok [INFO] [stdout] test validate::tests::test_description_length_warn_over_80 ... ok [INFO] [stdout] test validate::tests::test_display_format_block_no_lang ... ok [INFO] [stdout] test validate::tests::test_display_format_block_no_lang_with_line ... ok [INFO] [stdout] test validate::tests::test_display_format_no_block ... ok [INFO] [stdout] test validate::tests::test_display_format_with_block_lang_no_line ... ok [INFO] [stdout] test validate::tests::test_display_format_with_block_lang_line ... ok [INFO] [stdout] test validate::tests::test_empty_blocks ... ok [INFO] [stdout] test validate::tests::test_endpoint_url_for_pypi ... ok [INFO] [stdout] test validate::tests::test_endpoint_url_for_npm ... ok [INFO] [stdout] test validate::tests::test_dep_resolution_shell_present ... ok [INFO] [stdout] test validate::tests::empty_short_form_produces_error ... ok [INFO] [stdout] test validate::tests::duplicate_flag_long_names_produce_error ... ok [INFO] [stdout] test validate::tests::test_is_clean_false_with_errors_only ... ok [INFO] [stdout] test validate::tests::test_dep_resolution_skipped_for_unknown_lang ... ok [INFO] [stdout] test validate::tests::test_description_length_no_warn_at_limit ... ok [INFO] [stdout] test store_kv::tests::store_is_global_returns_false_when_file_exists_but_is_corrupt ... ok [INFO] [stdout] test validate::tests::test_is_clean_false_with_warnings_only ... ok [INFO] [stdout] test validate::tests::test_is_clean_true_when_both_empty ... ok [INFO] [stdout] test validate::tests::test_llm_block_empty_prompt_error ... ok [INFO] [stdout] test validate::tests::test_llm_block_placeholder_check_works ... ok [INFO] [stdout] test validate::tests::test_llm_block_provider_warning_when_not_on_path ... ok [INFO] [stdout] test validate::tests::test_llm_block_yaml_parse_error_reported ... ok [INFO] [stdout] test validate::tests::test_llm_block_valid_prompt_clean ... ok [INFO] [stdout] test store_kv::tests::store_is_global_returns_false_for_nonexistent_database ... ok [INFO] [stdout] test validate::tests::test_llm_block_skips_syntax_check ... ok [INFO] [stdout] test validate::tests::test_invalid_bash_produces_error ... ok [INFO] [stdout] test store_kv::tests::store_entries_returns_empty_vec_for_nonexistent_database ... ok [INFO] [stdout] test validate::tests::test_invalid_sh_produces_error ... ok [INFO] [stdout] test validate::tests::test_parse_python_errors_empty_message_ignored ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_empty_stderr_no_errors ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_lineno_one_becomes_some ... ok [INFO] [stdout] test validate::tests::test_parse_python_errors_with_syntax_error ... ok [INFO] [stdout] test validate::tests::test_llm_block_prev_placeholder_in_second_block_no_warning ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_lineno_zero_becomes_none ... ok [INFO] [stdout] test validate::tests::test_parse_python_errors_raw_fallback ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_raw_stderr_fallback ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_structured_plus_fallback_exclusive ... ok [INFO] [stdout] test validate::tests::test_parse_shell_errors_whitespace_only_no_errors ... ok [INFO] [stdout] test validate::tests::test_placeholder_flags_recognized ... ok [INFO] [stdout] test validate::tests::test_placeholder_prev_in_first_block ... ok [INFO] [stdout] test validate::tests::test_no_placeholders ... ok [INFO] [stdout] test validate::tests::test_placeholder_undeclared_with_default ... ok [INFO] [stdout] test validate::tests::test_sanitize_placeholder_inside_string ... ok [INFO] [stdout] test validate::tests::test_sanitize_placeholders_multiple ... ok [INFO] [stdout] test validate::tests::test_placeholder_all_declared ... ok [INFO] [stdout] test validate::tests::test_sanitize_placeholders_shell ... ok [INFO] [stdout] test validate::tests::test_sanitize_placeholders_with_default ... ok [INFO] [stdout] test validate::tests::test_shellcheck_produces_warnings_for_known_issue ... ok [INFO] [stdout] test validate::tests::test_placeholder_prev_in_later_block ... ok [INFO] [stdout] test validate::tests::test_sanitize_preserves_non_placeholder_braces ... ok [INFO] [stdout] test validate::tests::test_prev_declared_as_arg_still_warns_in_block0 ... ok [INFO] [stdout] test search::tests::search_all_indexes_builtin_match_has_snippets_for_known_term ... ok [INFO] [stdout] test validate::tests::test_sub_skill_skipped_when_no_ctx ... ok [INFO] [stdout] test validate::tests::test_shellcheck_skipped_when_syntax_fails ... ok [INFO] [stdout] test validate::tests::test_placeholder_undeclared_no_default ... ok [INFO] [stdout] test validate::tests::test_typescript_not_validated ... ok [INFO] [stdout] test validate::tests::test_unknown_language_no_errors ... ok [INFO] [stdout] test validate::tests::test_multiple_undeclared_placeholders ... ok [INFO] [stdout] test validate::tests::test_valid_sh_no_errors ... ok [INFO] [stdout] test validate::tests::test_valid_zsh_no_errors ... ok [INFO] [stdout] test validate::tests::test_invalid_python_produces_error ... ok [INFO] [stdout] test validate::tests::test_which_path_returns_none_for_nonexistent_tool ... ok [INFO] [stdout] test validate::tests::valid_flag_and_short_passes_cleanly ... ok [INFO] [stdout] test validate::tests::valid_flag_name_output_passes ... ok [INFO] [stdout] test validate::tests::validate_skill_accepts_body_with_four_backtick_outer_fence ... ok [INFO] [stdout] test validate::tests::validate_skill_rejects_body_with_improperly_nested_fences ... ok [INFO] [stdout] test wrap::tests::wrap_description_continuation_indent_exact ... ok [INFO] [stdout] test wrap::tests::wrap_description_empty_returns_empty ... ok [INFO] [stdout] test wrap::tests::wrap_description_first_word_exceeds_first_line_budget_goes_to_continuation ... ok [INFO] [stdout] test wrap::tests::wrap_description_fits_on_first_line_unchanged ... ok [INFO] [stdout] test wrap::tests::wrap_description_line_count::case_1_single_word_fits ... ok [INFO] [stdout] test wrap::tests::wrap_description_line_count::case_2_two_words_fit ... ok [INFO] [stdout] test wrap::tests::wrap_description_line_count::case_3_wraps_at_budget ... ok [INFO] [stdout] test wrap::tests::wrap_description_no_trailing_whitespace_on_any_line ... ok [INFO] [stdout] test wrap::tests::wrap_description_wraps_when_over_budget ... ok [INFO] [stdout] test wrap::tests::wrap_description_zero_budget_starts_on_continuation ... ok [INFO] [stdout] test wrap::tests::wrap_text_at_width_unchanged ... ok [INFO] [stdout] test wrap::tests::wrap_text_blank_lines_preserved_as_paragraph_separators ... ok [INFO] [stdout] test wrap::tests::wrap_text_empty_string_returns_empty ... ok [INFO] [stdout] test wrap::tests::wrap_text_indent_continuation_wraps_at_width_minus_indent ... ok [INFO] [stdout] test wrap::tests::wrap_text_markdown_headers_passed_through ... ok [INFO] [stdout] test wrap::tests::wrap_text_over_width_wraps_at_space ... ok [INFO] [stdout] test wrap::tests::wrap_text_preformatted_lines_passed_through ... ok [INFO] [stdout] test wrap::tests::wrap_text_single_word_over_width_emitted_as_is ... ok [INFO] [stdout] test wrap::tests::wrap_text_under_width_unchanged ... ok [INFO] [stdout] test yaml::tests::arg_required_default_is_false ... ok [INFO] [stdout] test yaml::tests::arg_required_true_extracted ... ok [INFO] [stdout] test yaml::tests::arg_with_default_extracted ... ok [INFO] [stdout] test yaml::tests::arg_with_validation_extracted ... ok [INFO] [stdout] test yaml::tests::command_def_minimal_emits_only_name_and_description ... ok [INFO] [stdout] test yaml::tests::command_def_missing_description_returns_missing_field_error ... ok [INFO] [stdout] test yaml::tests::command_def_missing_name_returns_missing_field_error ... ok [INFO] [stdout] test yaml::tests::command_def_name_wrong_type_returns_type_error ... ok [INFO] [stdout] test yaml::tests::command_def_not_a_mapping_returns_error ... ok [INFO] [stdout] test yaml::tests::command_def_required_fields_extracted ... ok [INFO] [stdout] test yaml::tests::command_def_supports_extracted ... ok [INFO] [stdout] test yaml::tests::command_def_supports_roundtrips ... ok [INFO] [stdout] test yaml::tests::command_def_tags_extracted ... ok [INFO] [stdout] test yaml::tests::command_def_unknown_fields_ignored ... ok [INFO] [stdout] test yaml::tests::command_def_with_arg_extracted ... ok [INFO] [stdout] test yaml::tests::description_with_colon_space_is_quoted ... ok [INFO] [stdout] test yaml::tests::description_with_newline_is_quoted_and_roundtrips ... ok [INFO] [stdout] test yaml::tests::env_var_required_defaults_to_true ... ok [INFO] [stdout] test yaml::tests::env_var_required_false_extracted ... ok [INFO] [stdout] test yaml::tests::command_def_roundtrip_full ... ok [INFO] [stdout] test yaml::tests::env_var_required_false_is_explicit_in_emission ... ok [INFO] [stdout] test yaml::tests::env_var_required_true_omitted_from_emission ... ok [INFO] [stdout] test yaml::tests::flag_bool_type_extracted ... ok [INFO] [stdout] test yaml::tests::flag_bool_type_included_in_emission ... ok [INFO] [stdout] test yaml::tests::flag_default_type_omitted_from_emission ... ok [INFO] [stdout] test validate::tests::test_valid_bash_no_errors ... ok [INFO] [stdout] test yaml::tests::flag_short_form_extracted ... ok [INFO] [stdout] test yaml::tests::flag_type_defaults_to_string_when_absent ... ok [INFO] [stdout] test yaml::tests::llm_config_defaults_provider_to_claude ... ok [INFO] [stdout] test yaml::tests::llm_config_provider_extracted ... ok [INFO] [stdout] test yaml::tests::needs_quoting_empty_string ... ok [INFO] [stdout] test yaml::tests::needs_quoting_plain_identifier_is_false ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_1_hash ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_2_colon_space ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_3_starts_brace ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_4_starts_bracket ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_5_starts_single_quote ... ok [INFO] [stdout] test yaml::tests::needs_quoting_special_chars::case_6_starts_double_quote ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_1_plain_int ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_3_leading_dot ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_2_float ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_4_plus_int ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_6_pos_inf ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_7_neg_inf ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_8_nan ... ok [INFO] [stdout] test yaml::tests::llm_config_empty_document_returns_default ... ok [INFO] [stdout] test yaml::tests::package_manifest_all_fields_extracted ... ok [INFO] [stdout] test yaml::tests::package_manifest_missing_description_returns_error ... ok [INFO] [stdout] test yaml::tests::package_manifest_missing_name_returns_error ... ok [INFO] [stdout] test yaml::tests::package_manifest_missing_version_returns_error ... ok [INFO] [stdout] test yaml::tests::package_manifest_optional_fields_absent ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_1_question_mark_space ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_2_gt_space ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_3_pipe_space ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_4_dash_space ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_5_standalone_question ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_7_standalone_pipe ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_8_standalone_dash ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_1_true_lc ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_2_false_lc ... ok [INFO] [stdout] test validate::tests::test_dep_resolution_empty_deps_no_check ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_3_null_lc ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_4_yes_lc ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_5_no_lc ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_6_on_lc ... ok [INFO] [stdout] test yaml::tests::numeric_string_description_roundtrips::case_5_neg_float ... ok [INFO] [stdout] test yaml::tests::yaml_keyword_description_roundtrips::case_7_off_lc ... ok [INFO] [stdout] test yaml::tests::yaml_indicator_description_roundtrips::case_6_standalone_gt ... ok [INFO] [stdout] test validate::tests::test_valid_python_no_errors ... ok [INFO] [stdout] test validate::tests::test_shellcheck_skipped_for_non_shell_lang ... ok [INFO] [stdout] test validate::tests::test_sub_skill_skipped_for_python_block ... ok [INFO] [stdout] test store_kv::tests::store_get_returns_none_for_missing_key_in_existing_store ... ok [INFO] [stdout] test store_kv::tests::store_entries_returns_pairs_in_key_order ... ok [INFO] [stdout] test validate::tests::test_parse_node_errors_empty_ignored ... ok [INFO] [stdout] test validate::tests::test_parse_node_errors_raw_fallback ... ok [INFO] [stdout] test validate::tests::test_parse_node_errors_with_syntax_error ... ok [INFO] [stdout] test validate::tests::hyphenated_flag_in_non_shell_block_emits_no_diagnostic ... ok [INFO] [stdout] test validate::tests::test_valid_node_no_errors ... ok [INFO] [stdout] test validate::tests::test_valid_javascript_alias_no_errors ... ok [INFO] [stdout] test validate::tests::test_invalid_node_produces_error ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1323 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.26s [INFO] [stdout] [INFO] [stderr] ⠁ Pending ⠁ Preparing... Downloading... [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸─────────────────────────────] 50% Downloading... [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸─────────────────────────────] 50% Downloading... [━━━━━━━━━━━━━━╸────────────────────────────────────────────] 25%Overloaded [━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━] 100%   Running tests/activate.rs (/opt/rustwide/target/debug/deps/activate-30e6065fba628be6) [INFO] [stdout] [INFO] [stdout] running 18 tests [INFO] [stdout] test activate_nonexistent_plugin_fails ... ok [INFO] [stdout] test deactivate_not_activated_fails ... ok [INFO] [stdout] test non_activated_plugin_commands_are_not_visible ... ok [INFO] [stdout] test activate_all_commands_from_plugin ... ok [INFO] [stdout] test activate_without_global_writes_to_local_scope ... ok [INFO] [stdout] test deactivate_removes_plugin_commands ... ok [INFO] [stdout] test activated_command_can_be_run ... ok [INFO] [stdout] test activate_nonexistent_command_fails ... ok [INFO] [stdout] test local_activation_is_visible_from_project_scope ... ok [INFO] [stdout] test settings_json_round_trips ... ok [INFO] [stdout] test doctor_reports_stale_activation ... ok [INFO] [stdout] test settings_json_lives_under_plugins_subdirectory ... ok [INFO] [stdout] test activate_specific_command_from_plugin ... ok [INFO] [stdout] test non_activated_command_cannot_be_run ... ok [INFO] [stdout] test deactivate_without_global_removes_from_all_scopes ... ok [INFO] [stdout] test activate_with_global_flag_writes_to_global_scope ... ok [INFO] [stdout] test stale_activation_produces_error_on_use ... ok [INFO] [stdout] test deactivate_with_global_flag_removes_only_from_global ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 18 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.84s [INFO] [stdout] [INFO] [stderr] Running tests/add.rs (/opt/rustwide/target/debug/deps/add-a2ddfb08477117d8) [INFO] [stdout] [INFO] [stdout] running 32 tests [INFO] [stdout] test test_add_python_dep_found ... ok [INFO] [stdout] test test_add_node_dep_not_found ... ok [INFO] [stdout] test test_add_python_dep_not_found ... ok [INFO] [stdout] test test_add_force_skips_description_warning ... ok [INFO] [stdout] test test_add_node_dep_found ... ok [INFO] [stdout] test test_add_no_validate_skips_description_warning ... ok [INFO] [stdout] test test_add_no_sub_skill_warn_with_force ... ok [INFO] [stdout] test test_add_skip_validation_flag::case_1_force ... ok [INFO] [stdout] test test_add_placeholders_dont_cause_false_syntax_errors ... ok [INFO] [stdout] test test_add_short_description_no_length_warning ... ok [INFO] [stdout] test test_add_skip_validation_flag::case_2_no_validate ... ok [INFO] [stdout] test test_add_syntax_error_rejected::case_1_bash ... ok [INFO] [stdout] test test_add_duplicate_rejected ... ok [INFO] [stdout] test test_add_from_stdin ... ok [INFO] [stdout] test test_add_dep_warn_skipped_with_no_validate ... ok [INFO] [stdout] test test_add_warns_on_missing_shell_dep ... ok [INFO] [stdout] test test_rm_not_found ... ok [INFO] [stdout] test test_add_docs_blocks_not_validated ... ok [INFO] [stdout] test test_add_warns_on_missing_sub_skill ... ok [INFO] [stdout] test test_add_with_valid_placeholders_no_warnings ... ok [INFO] [stdout] test test_rm_command ... ok [INFO] [stdout] test test_add_missing_interpreter_skips_check ... ok [INFO] [stdout] test test_add_from_flags ... ok [INFO] [stdout] test test_add_long_description_warns ... ok [INFO] [stdout] test test_reserved_name_rejected ... ok [INFO] [stdout] test test_add_force_overwrites ... ok [INFO] [stdout] test test_add_valid_syntax_succeeds::case_2_python ... ok [INFO] [stdout] test test_add_with_undeclared_placeholder_warns ... ok [INFO] [stdout] test test_add_sub_skill_found_no_warn ... ok [INFO] [stdout] test test_add_valid_syntax_succeeds::case_1_bash ... ok [INFO] [stdout] test test_add_syntax_error_rejected::case_2_python ... ok [INFO] [stderr] Running tests/cwd.rs (/opt/rustwide/target/debug/deps/cwd-8c3d5714fd01f879) [INFO] [stdout] test test_add_syntax_error_rejected::case_3_node ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 32 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 8 tests [INFO] [stdout] test test_local_skill_cwd_is_project_root_from_subdirectory ... ok [INFO] [stdout] test test_dry_run_shows_cwd_local_skill ... ok [INFO] [stdout] test test_creft_project_root_not_home_when_no_local_creft ... ok [INFO] [stdout] test test_global_skill_cwd_not_home_when_no_local_creft ... ok [INFO] [stdout] test test_creft_project_root_set_for_local_skill ... ok [INFO] [stdout] test test_local_skill_cwd_is_project_root ... ok [INFO] [stdout] test test_creft_project_root_absent_for_global_skill ... ok [INFO] [stderr] Running tests/doctor.rs (/opt/rustwide/target/debug/deps/doctor-511fce94445d3a6f) [INFO] [stdout] test test_global_skill_cwd_is_invocation_dir ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 9 tests [INFO] [stdout] test test_doctor_global_runs ... ok [INFO] [stdout] test test_doctor_skill_not_found ... ok [INFO] [stdout] test test_doctor_unknown_name_errors ... ok [INFO] [stdout] test test_doctor_skill_with_missing_env_var ... ok [INFO] [stdout] test test_skill_check_circular_reference ... ok [INFO] [stdout] test test_doctor_namespace_runs_all_skills ... ok [INFO] [stdout] test test_skill_check_simple_bash ... ok [INFO] [stdout] test test_doctor_skill_with_deps ... ok [INFO] [stdout] test test_skill_check_depth_limit ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.29s [INFO] [stdout] [INFO] [stderr] Running tests/dry_run.rs (/opt/rustwide/target/debug/deps/dry_run-d7cb2e79d0237300) [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test test_dry_run_fallback ... ok [INFO] [stdout] test test_dry_run ... ok [INFO] [stdout] test test_dry_run_delegated_with_args ... ok [INFO] [stdout] test test_dry_run_delegated_multi_block ... ok [INFO] [stdout] test test_dry_run_delegated ... ok [INFO] [stdout] test test_dry_run_supports_multiple_features ... ok [INFO] [stderr] Running tests/help.rs (/opt/rustwide/target/debug/deps/help-c3bf8db127b71c69) [INFO] [stdout] test test_dry_run_delegated_failure ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.12s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 22 tests [INFO] [stdout] test test_help_subcommand_nonexistent_skill ... ok [INFO] [stdout] test test_add_help_uses_skill_terminology ... ok [INFO] [stdout] test test_help_subcommand_no_args ... ok [INFO] [stdout] test test_doctor_docs_has_exit_codes ... ok [INFO] [stdout] test test_root_long_help_contains_commands_section ... ok [INFO] [stdout] test test_root_long_help_contains_all_subcommands ... ok [INFO] [stdout] test test_root_long_help_contains_tagline ... ok [INFO] [stdout] test test_help_subcommand_with_builtin ... ok [INFO] [stdout] test test_long_help_flag_shows_commands_section ... ok [INFO] [stdout] test test_no_args_shows_short_help_not_long ... ok [INFO] [stdout] test test_no_args_same_as_short_flag ... ok [INFO] [stdout] test test_root_short_help_contains_tagline ... ok [INFO] [stdout] test test_subcommand_descriptions_within_60_chars ... ok [INFO] [stdout] test test_up_docs_has_supported_systems ... ok [INFO] [stdout] test test_help_subcommand_multiword_skill ... ok [INFO] [stdout] test test_skill_help_matches_clap_format ... ok [INFO] [stdout] test test_help_subcommand_with_user_skill ... ok [INFO] [stdout] test test_add_docs_has_frontmatter_section ... ok [INFO] [stdout] test test_add_help_has_usage_section ... ok [INFO] [stdout] test test_all_builtin_help_has_usage ... ok [INFO] [stderr] Running tests/init.rs (/opt/rustwide/target/debug/deps/init-ee502389f11cf0d3) [INFO] [stdout] test test_help_subcommand_with_namespace ... ok [INFO] [stdout] test test_no_allcaps_sections_in_help ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test test_init_no_warn_without_parent ... ok [INFO] [stdout] test test_init_creates_directory ... ok [INFO] [stdout] test test_init_warns_parent ... ok [INFO] [stdout] test test_init_idempotent ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running tests/install.rs (/opt/rustwide/target/debug/deps/install-c0e06c9838df6577) [INFO] [stdout] [INFO] [stdout] running 32 tests [INFO] [stdout] test package_missing_skill_returns_command_not_found ... ok [INFO] [stdout] test plugin_install_invalid_url_fails ... ok [INFO] [stdout] test package_appears_in_list_output ... ok [INFO] [stdout] test plugin_install_bare_name_without_slash_fails ... ok [INFO] [stdout] test formerly_reserved_names_are_now_valid_skill_names::case_2_update ... ok [INFO] [stdout] test formerly_reserved_names_are_now_valid_skill_names::case_1_install ... ok [INFO] [stdout] test package_nested_skill_resolves_and_runs ... ok [INFO] [stdout] test formerly_reserved_names_are_now_valid_skill_names::case_3_uninstall ... ok [INFO] [stdout] test package_skill_resolves_and_runs ... ok [INFO] [stdout] test plugin_uninstall_not_found ... ok [INFO] [stdout] test plugin_list_no_plugins ... ok [INFO] [stdout] test plugin_list_shows_installed_plugins ... ok [INFO] [stdout] test plugin_install_multi_plugin_repo_without_filter_fails ... ok [INFO] [stdout] test plugin_update_all_no_plugins ... ok [INFO] [stdout] test plugin_install_github_shorthand_routes_to_github ... ok [INFO] [stdout] test uninstall_root_alias_removed ... ok [INFO] [stdout] test install_root_alias_removed ... ok [INFO] [stdout] test update_root_alias_removed ... ok [INFO] [stdout] test plugin_update_not_found ... ok [INFO] [stdout] test plugin_install_short_p_flag_is_rejected ... ok [INFO] [stdout] test plugins_is_reserved ... ok [INFO] [stdout] test plugin_install_repo_without_manifest_fails ... ok [INFO] [stdout] test plugin_install_duplicate_fails ... ok [INFO] [stdout] test plugin_install_respects_creft_home ... ok [INFO] [stdout] test plugin_install_plugin_flag_is_rejected ... ok [INFO] [stdout] test plugin_install_local_repo_succeeds ... ok [INFO] [stdout] test plugin_uninstall_removes_plugin ... ok [INFO] [stdout] test plugin_install_repo_without_catalog_fails ... ok [INFO] [stdout] test plugin_list_shows_plugin_commands ... ok [INFO] [stdout] test plugin_uninstall_then_reinstall ... ok [INFO] [stdout] test plugin_update_picks_up_new_version ... ok [INFO] [stdout] test plugin_update_all_updates_plugins ... ok [INFO] [stderr] Running tests/legacy_commands.rs (/opt/rustwide/target/debug/deps/legacy_commands-5c295eb14580d6d9) [INFO] [stdout] [INFO] [stdout] test result: ok. 32 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.56s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test old_command_names_are_rejected::case_4_plugins_list ... ok [INFO] [stdout] test old_command_names_are_rejected::case_1_cmd_add ... ok [INFO] [stdout] test old_command_names_are_rejected::case_2_rm ... ok [INFO] [stdout] test old_command_names_are_rejected::case_3_cat ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s [INFO] [stdout] [INFO] [stderr] Running tests/list.rs (/opt/rustwide/target/debug/deps/list-8b64c7699981c0bd) [INFO] [stdout] [INFO] [stdout] running 46 tests [INFO] [stdout] test explicit_hidden_prefix_shows_hidden_commands ... ok [INFO] [stdout] test list_names_empty_store_produces_empty_stdout ... ok [INFO] [stdout] test hidden_namespace_excluded_from_list ... ok [INFO] [stdout] test list_all_includes_hidden_top_level_commands ... ok [INFO] [stdout] test list_namespace_all_includes_hidden_commands ... ok [INFO] [stdout] test test_list_all_has_header ... ok [INFO] [stdout] test test_cat_command ... ok [INFO] [stdout] test list_all_with_tag_includes_hidden_matching_commands ... ok [INFO] [stdout] test list_all_includes_hidden_namespaced_commands ... ok [INFO] [stdout] test show_works_on_hidden_command ... ok [INFO] [stdout] test test_list_empty ... ok [INFO] [stdout] test list_names_outputs_one_name_per_line ... ok [INFO] [stdout] test test_list_empty_no_header ... ok [INFO] [stdout] test tag_filter_excludes_hidden_commands ... ok [INFO] [stdout] test test_list_drill_in_has_scoped_header ... ok [INFO] [stdout] test help_subcommand_listing_suppresses_hidden_subcommands ... ok [INFO] [stdout] test test_list_all_flag ... ok [INFO] [stdout] test test_list_namespace_not_found ... ok [INFO] [stdout] test test_list_drill_in_no_footer ... ok [INFO] [stdout] test test_list_filter_by_tag ... ok [INFO] [stdout] test test_list_has_skills_header ... ok [INFO] [stdout] test test_list_long_description_truncated ... ok [INFO] [stdout] test test_list_namespace_skill_count ... ok [INFO] [stdout] test test_list_short_description_not_truncated ... ok [INFO] [stdout] test test_list_footer_always_shown_at_root ... ok [INFO] [stdout] test test_list_no_subskill_count_plain_skill ... ok [INFO] [stdout] test test_list_grouped_output ... ok [INFO] [stdout] test test_list_shows_commands ... ok [INFO] [stdout] test test_list_tag_with_namespace ... ok [INFO] [stdout] test test_list_subskill_count_singular ... ok [INFO] [stdout] test test_show_not_found ... ok [INFO] [stdout] test test_list_namespace_with_nonexistent_tag ... ok [INFO] [stdout] test test_list_all_no_footer ... ok [INFO] [stdout] test test_list_no_scope_annotation ... ok [INFO] [stdout] test test_list_shows_footer_with_namespaces ... ok [INFO] [stdout] test test_show_command ... ok [INFO] [stdout] test hidden_top_level_command_excluded_from_list ... ok [INFO] [stdout] test test_list_namespace_without_leaf_no_subskill_annotation ... ok [INFO] [stdout] test test_list_drill_into_namespace ... ok [INFO] [stdout] test test_namespace_help_nonexistent ... ok [INFO] [stdout] test hidden_subcommand_excluded_from_namespace_drill_in ... ok [INFO] [stdout] test test_namespace_help_skill_takes_priority ... ok [INFO] [stdout] test hidden_command_executes_normally ... ok [INFO] [stdout] test test_list_subskill_count_on_leaf_with_children ... ok [INFO] [stdout] test test_namespace_help ... ok [INFO] [stdout] test test_list_deep_namespace ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 46 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.37s [INFO] [stdout] [INFO] [stderr] Running tests/llm.rs (/opt/rustwide/target/debug/deps/llm-a2c9de76d04fc871) [INFO] [stdout] [INFO] [stdout] running 26 tests [INFO] [stdout] test test_llm_block_validate_empty_prompt ... ok [INFO] [stdout] test test_llm_block_exit_99_early_return ... ok [INFO] [stdout] test test_llm_pipe_block0_inherits_parent_stdin ... ok [INFO] [stdout] test test_llm_block_no_header ... ok [INFO] [stdout] test test_llm_block_doctor_reports_provider ... ok [INFO] [stdout] test test_llm_sponge_multiple_consecutive ... ok [INFO] [stdout] test test_llm_block_verbose_shows_command ... ok [INFO] [stdout] test test_llm_block_pipe_mode_sponge ... ok [INFO] [stdout] test test_llm_block_pipe_sponge_prev ... ok [INFO] [stdout] test test_llm_sponge_pipe_streams_to_downstream ... ok [INFO] [stdout] test test_llm_block_dry_run ... ok [INFO] [stdout] test test_llm_block_execution_provider_not_found ... ok [INFO] [stdout] test test_llm_sponge_last_block ... ok [INFO] [stdout] test test_llm_sponge_exit_99_in_pipe ... ok [INFO] [stdout] test test_llm_sponge_with_template_args ... ok [INFO] [stdout] test test_pipe_exit_99_propagates_through_sponge_chain ... ok [INFO] [stdout] test test_llm_sponge_provider_not_found_in_pipe ... ok [INFO] [stdout] test test_pipe_exit_99_sponge_captures_upstream_output ... ok [INFO] [stdout] test test_llm_sponge_first_block ... ok [INFO] [stdout] test test_llm_pipe_stdin_routes_prev_output ... ok [INFO] [stdout] test test_llm_pipe_empty_prev_sends_eof ... ok [INFO] [stdout] test test_pipe_exit_99_three_block_sponge_captures ... ok [INFO] [stdout] test test_pipe_exit_99_prevents_sponge_spawn ... ok [INFO] [stdout] test test_llm_block_execution_with_cat ... ok [INFO] [stdout] test test_pipe_sponge_chain_normal_exit_proceeds ... ok [INFO] [stdout] test test_pipe_sponge_originated_exit_99_cancels_downstream ... ok [INFO] [stderr] Running tests/remove.rs (/opt/rustwide/target/debug/deps/remove-6d6e53d271587663) [INFO] [stdout] [INFO] [stdout] test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.49s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test rm_package_skill_is_rejected ... ok [INFO] [stdout] [INFO] [stderr] Running tests/run.rs (/opt/rustwide/target/debug/deps/run-6ca6183336bf7ab2) [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 73 tests [INFO] [stdout] test earliest_failure_is_root_cause_when_multiple_blocks_fail ... ok [INFO] [stdout] test creft_prompt_interactive_returns_stdin_answer ... ok [INFO] [stdout] test test_flat_file_skipped_when_directory_version_exists ... ok [INFO] [stdout] test test_early_exit_99_preserves_output ... ok [INFO] [stdout] test test_flat_file_migrated_on_resolution ... ok [INFO] [stdout] test test_flat_file_nested_spaces_migrated ... ok [INFO] [stdout] test test_arg_injected_as_env_var ... ok [INFO] [stdout] test creft_status_does_not_contaminate_stdout ... ok [INFO] [stdout] test test_flag_injected_as_env_var ... ok [INFO] [stdout] test test_flat_file_not_triggered_for_single_token ... ok [INFO] [stdout] test creft_print_sends_message_to_stderr_not_stdout ... ok [INFO] [stdout] test test_early_exit_99_in_pipe_mode ... ok [INFO] [stdout] test test_node_deps_available_for_require ... ok [INFO] [stdout] test creft_prompt_in_pipe_chain_returns_empty_and_does_not_deadlock ... ok [INFO] [stdout] test test_four_token_command_routes_over_three_token_match ... ok [INFO] [stdout] test test_multi_block_default_pipes_integration ... ok [INFO] [stdout] test test_namespaced_command ... ok [INFO] [stdout] test middle_block_failure_reported_in_three_block_chain ... ok [INFO] [stdout] test test_legacy_pipe_true_ignored ... ok [INFO] [stdout] test test_optional_arg_with_template_default_omitted ... ok [INFO] [stdout] test test_help_no_subcommands_section_for_leaf_skill ... ok [INFO] [stdout] test test_parent_with_positional_still_works_when_child_exists ... ok [INFO] [stdout] test test_optional_arg_with_template_default_provided ... ok [INFO] [stdout] test test_hyphenated_flag_injected_with_underscores ... ok [INFO] [stdout] test test_early_exit_99_stops_remaining_blocks ... ok [INFO] [stdout] test all_blocks_succeed_returns_ok ... ok [INFO] [stdout] test bare_namespace_invocation_lists_contents ... ok [INFO] [stdout] test test_help_on_user_command ... ok [INFO] [stdout] test test_normal_exit_1_still_fails ... ok [INFO] [stdout] test test_legacy_sequential_true_ignored ... ok [INFO] [stdout] test test_pipe_exit_99_middle_block ... ok [INFO] [stdout] test test_pipe_chain_blocks_see_env_vars ... ok [INFO] [stdout] test test_optional_arg_no_default_anywhere_errors ... ok [INFO] [stdout] test test_pipe_exit_99_last_block_multiline_stdout ... ok [INFO] [stdout] test test_pipe_exit_99_middle_block_no_stdout ... ok [INFO] [stdout] test test_pipe_exit_99_first_block_stdout_captured ... ok [INFO] [stdout] test test_help_shows_subcommands_when_parent_and_child_exist ... ok [INFO] [stdout] test test_pipe_exit_99_no_side_effects ... ok [INFO] [stdout] test test_pipe_exit_99_kills_remaining_blocks ... ok [INFO] [stdout] test test_pipe_intermediate_output_suppressed ... ok [INFO] [stdout] test test_pipe_exit_99_middle_block_output_suppressed ... ok [INFO] [stdout] test test_run_not_found ... ok [INFO] [stdout] test test_pipe_exit_99_middle_block_stdout_captured ... ok [INFO] [stdout] test test_pipe_exit_99_last_block_stdout_preserved ... ok [INFO] [stdout] test test_pipe_exit_99_middle_block_multiline_stdout ... ok [INFO] [stdout] test test_pipe_mode_no_creft_prev_env ... ok [INFO] [stdout] test test_run_simple_command ... ok [INFO] [stdout] test test_pipe_exit_99_fast_downstream_no_output ... ok [INFO] [stdout] test test_subcommand_resolved_over_parent_positional_arg ... ok [INFO] [stdout] test test_run_with_args ... ok [INFO] [stdout] test test_sequential_normal_failure_stderr_preserved ... ok [INFO] [stdout] test test_pipe_mode_prev_placeholder_passes_through ... ok [INFO] [stdout] test test_sequential_sigterm_preserves_stderr ... ok [INFO] [stdout] test test_sequential_sigterm_block_reported ... ok [INFO] [stdout] test test_pipe_non_sigint_signal_still_reported ... ok [INFO] [stdout] test test_verbose_dry_run_shows_rendered_no_execute ... ok [INFO] [stdout] test test_template_and_env_var_both_resolve ... ok [INFO] [stdout] test test_subcommand_help_shows_subcommand_details ... ok [INFO] [stdout] test unknown_command_still_errors ... ok [INFO] [stdout] test test_pipe_sigint_non_terminal ... ok [INFO] [stdout] test test_verbose_without_args_shows_empty_defaults ... ok [INFO] [stdout] test test_subcommand_with_own_args ... ok [INFO] [stdout] test test_pipe_sigint_no_signal_message ... ok [INFO] [stdout] test test_pipe_sigint_clean_exit ... ok [INFO] [stdout] test test_verbose_shows_rendered_blocks ... ok [INFO] [stdout] test upstream_exit_zero_with_partial_consumer_returns_ok ... ok [INFO] [stdout] test test_three_token_command_still_resolves_when_four_token_sibling_exists ... ok [INFO] [stdout] test upstream_block_failure_reported_when_last_block_succeeds ... ok [INFO] [stdout] test test_sequential_sigint_suppresses_bash_stderr ... ok [INFO] [stdout] test test_pipe_sigint_all_children_die ... ok [INFO] [stdout] 0 [INFO] [stdout] test test_pipe_sigint_no_python_traceback ... ok [INFO] [stdout] test test_pipe_large_output_no_e2big ... ok [INFO] [stdout] test test_sequential_sigint_suppresses_python_traceback ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 73 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.26s [INFO] [stdout] [INFO] [stderr] Running tests/scope.rs (/opt/rustwide/target/debug/deps/scope-18cbf0cba8a08b7f) [INFO] [stdout] [INFO] [stdout] running 12 tests [INFO] [stdout] test test_scope_add_defaults_to_local_when_local_exists ... ok [INFO] [stdout] test test_scope_add_global_flag_forces_global ... ok [INFO] [stdout] test test_scope_list_local_shadows_global_same_name ... ok [INFO] [stdout] test test_scope_run_resolves_local_before_global ... ok [INFO] [stdout] test test_scope_full_lifecycle_add_run_rm ... ok [INFO] [stdout] test test_scope_list_shows_local_and_global_with_indicators ... ok [INFO] [stdout] test test_scope_deprecated_update_forwards_to_plugin_update ... ok [INFO] [stdout] test test_scope_update_finds_global_package ... ok [INFO] [stdout] test test_scope_deprecated_uninstall_removes_from_global_plugins ... ok [INFO] [stdout] test test_scope_plugin_install_always_global ... ok [INFO] [stdout] test test_scope_uninstall_finds_global_package ... ok [INFO] [stdout] test test_scope_plugin_install_never_uses_local_scope ... ok [INFO] [stderr] Running tests/search.rs (/opt/rustwide/target/debug/deps/search-e3de7b974581fe22) [INFO] [stdout] [INFO] [stdout] test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.25s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 12 tests [INFO] [stdout] test search_multiple_terms_all_must_match ... ok [INFO] [stdout] test search_no_plugins_installed_prints_message ... ok [INFO] [stdout] test search_query_no_plugins_installed_prints_no_matches ... ok [INFO] [stdout] test search_by_description_returns_match ... ok [INFO] [stdout] test search_returns_only_matching_skills_not_all ... ok [INFO] [stdout] test search_output_includes_plugin_name ... ok [INFO] [stdout] test search_across_multiple_plugins ... ok [INFO] [stdout] test search_empty_query_lists_all_skills ... ok [INFO] [stdout] test search_by_skill_name_returns_match ... ok [INFO] [stdout] test search_by_tag_returns_match ... ok [INFO] [stdout] test search_is_case_insensitive ... ok [INFO] [stdout] test search_no_match_prints_no_matching_skills ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.50s [INFO] [stdout] [INFO] [stderr] Running tests/settings.rs (/opt/rustwide/target/debug/deps/settings-35b9cf5cf3010fa7) [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test settings_show_prints_known_keys_with_defaults_when_no_file_exists ... ok [INFO] [stdout] test settings_show_prints_configured_value_for_set_key ... ok [INFO] [stdout] test settings_show_does_not_print_no_settings_configured ... ok [INFO] [stdout] test settings_show_subcommand_matches_bare_settings ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s [INFO] [stdout] [INFO] [stderr] Running tests/setup.rs (/opt/rustwide/target/debug/deps/setup-e6381d5f8a84592f) [INFO] [stdout] [INFO] [stdout] running 8 tests [INFO] [stdout] test up_global_flag_removed_returns_error ... ok [INFO] [stdout] test up_bare_installs_globally ... ok [INFO] [stdout] test up_local_with_system_installs_locally ... ok [INFO] [stdout] test up_system_installs_globally_by_default ... ok [INFO] [stdout] test up_local_flag_short_detects_project_systems ... ok [INFO] [stdout] test up_local_flag_long_detects_project_systems ... ok [INFO] [stdout] test up_bare_global_idempotent ... ok [INFO] [stdout] test up_local_idempotent ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.60s [INFO] [stdout] [INFO] [stderr] Running tests/stderr.rs (/opt/rustwide/target/debug/deps/stderr-2598244518039e5c) [INFO] [stdout] [INFO] [stdout] running 12 tests [INFO] [stdout] test verbose_shows_stderr_from_successful_block ... ok [INFO] [stdout] test stdout_unaffected_by_stderr_capture ... ok [INFO] [stdout] test stderr_from_successful_block_is_discarded ... ok [INFO] [stdout] test ansi_sequences_in_stderr_are_captured_not_displayed ... ok [INFO] [stdout] test nonzero_exit_prints_skill_name_and_code ... ok [INFO] [stdout] test exit_99_early_exit_is_silent ... ok [INFO] [stdout] test nonzero_exit_in_pipe_chain_prints_skill_name ... ok [INFO] [stdout] test non_verbose_hides_stderr_from_successful_block ... ok [INFO] [stdout] test stderr_from_successful_pipe_block_is_discarded ... ok [INFO] [stdout] test verbose_shows_stderr_from_pipe_chain_blocks ... ok [INFO] [stdout] test stderr_from_failed_block_appears_in_error_output ... ok [INFO] [stdout] test stderr_from_failed_last_pipe_block_appears_in_error_output ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "ab060ee54d8404fa96c3b9f5a248d84042d4d6df7e02b318d403b24ffd2dee72", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "ab060ee54d8404fa96c3b9f5a248d84042d4d6df7e02b318d403b24ffd2dee72", kill_on_drop: false }` [INFO] [stdout] ab060ee54d8404fa96c3b9f5a248d84042d4d6df7e02b318d403b24ffd2dee72