From af3de04edd8b5112fed85eb040f4ed26aae122d9 Mon Sep 17 00:00:00 2001 From: Amir Balwel Date: Tue, 3 Nov 2026 20:07:00 +0800 Subject: [PATCH 1/4] test: Strengthen cassette parity checks and multi-turn replay Signed-off-by: Amir Balwel --- AGENTS.md | 1 + old_tests/chat_completions/__init__.py | 1 - old_tests/chat_completions/test_messages.py | 134 - .../chat_completions/test_model_settings.py | 149 - .../chat_completions/test_request_options.py | 49 - .../chat_completions/test_response_format.py | 148 - old_tests/chat_completions/test_tool_args.py | 85 - old_tests/chat_completions/test_tools.py | 154 - old_tests/responses/__init__.py | 1 - old_tests/responses/test_conversation.py | 147 - old_tests/responses/test_exceptions.py | 255 - .../responses/test_incomplete_responses.py | 141 - old_tests/responses/test_model_settings.py | 343 - old_tests/responses/test_reasoning.py | 261 - old_tests/responses/test_text_config.py | 169 - old_tests/responses/test_tool_args.py | 81 - old_tests/responses/test_tools.py | 308 - old_tests/test_cassette_manager.py | 306 - pyproject.toml | 4 +- python/ARCHITECTURE.md | 4 + python/CONVENTIONS.md | 2 + python/molto/types/base.py | 17 +- python/molto/types/normalized.py | 111 - python/molto/upstream/anthropic.py | 10 +- python/molto/upstream/openai.py | 14 +- python/molto/utils/__init__.py | 45 - python/molto/utils/io.py | 133 - python/molto/utils/test.py | 868 +- python/molto/utils/types.py | 317 +- scripts/match_openai_cassette_events.py | 53 +- tests/adapters/test_openai.py | 75 + tests/cassette_discovery.py | 254 + tests/cassettes/README.md | 67 +- .../openai-responses-stream-00.yaml | 113 +- .../anthropic-messages-stream-01.yaml | 2 +- .../openai-chat_completions-stream-01.yaml | 2 +- .../openai-responses-stream-01.yaml | 2 +- .../anthropic-messages-stream-01.yaml | 2 +- .../openai-responses-stream-01.yaml | 2 +- .../anthropic-messages-stream-01.yaml | 4 +- .../openai-chat_completions-stream-01.yaml | 4 +- .../openai-responses-stream-01.yaml | 4 +- .../openai-chat_completions-stream-00.yaml | 98 + .../openai-chat_completions-stream-01.yaml | 246 + .../chat_completions/invalid_api_key.yaml | 45 - ...round_trip_through_sdk-non-stream-sse.yaml | 329 - ...ges_round_trip_through_sdk-non-stream.yaml | 59 - ...essages_round_trip_through_sdk-stream.yaml | 320 - ...round_trip_through_sdk-non-stream-sse.yaml | 66 - ...ngs_round_trip_through_sdk-non-stream.yaml | 78 - ...ettings_round_trip_through_sdk-stream.yaml | 66 - ...hrough_sdk-non-stream-json-object-sse.yaml | 88 - ...ip_through_sdk-non-stream-json-object.yaml | 53 - ...hrough_sdk-non-stream-json-schema-sse.yaml | 100 - ...ip_through_sdk-non-stream-json-schema.yaml | 65 - ...d_trip_through_sdk-stream-json-object.yaml | 88 - ...d_trip_through_sdk-stream-json-schema.yaml | 100 - ...t_tool_choice_required-non-stream-sse.yaml | 96 - .../test_tool_choice_required-non-stream.yaml | 73 - .../test_tool_choice_required-stream.yaml | 96 - .../tool_choice-required.yaml | 74 - .../test_conversation-non-stream-setup.yaml | 29 - .../test_conversation-stream-setup.yaml | 29 - .../exceptions/context_length_exceeded.yaml | 13189 ---------------- .../openai/exceptions/incorrect_api_key.yaml | 28 - .../openai/exceptions/missing_api_key.yaml | 29 - .../thinking_budget_exceeding_max_tokens.yaml | 34 - .../test_conversation-non-stream-sse.yaml | 310 - .../test_conversation-non-stream.yaml | 107 - .../test_conversation-stream.yaml | 323 - ...ndow_exceeded-context_length_exceeded.yaml | 7961 ---------- ...est_invalid_api_key-incorrect_api_key.yaml | 28 - .../test_missing_api_key-missing_api_key.yaml | 29 - ...-thinking_budget_exceeding_max_tokens.yaml | 36 - .../instructions-stream-00.yaml | 222 - .../instructions-stream-01.yaml | 255 - ...easoning-stream-invalid_request_error.yaml | 56 - .../reasoning-stream-invalid_type.yaml | 51 - ...ing-stream-missing_required_parameter.yaml | 42 - .../test_model_settings-non-stream-sse.yaml | 1361 -- .../test_model_settings-non-stream.yaml | 756 - .../test_model_settings-stream.yaml | 1113 -- ...g-non-stream-reasoning_no_summary-sse.yaml | 266 - ...oning-non-stream-reasoning_no_summary.yaml | 105 - ...non-stream-reasoning_with_summary-sse.yaml | 941 -- ...ing-non-stream-reasoning_with_summary.yaml | 115 - ...reasoning-stream-reasoning_no_summary.yaml | 275 - ...asoning-stream-reasoning_with_summary.yaml | 1197 -- ...ext_config_json_schema-non-stream-sse.yaml | 232 - ...st_text_config_json_schema-non-stream.yaml | 127 - .../test_text_config_json_schema-stream.yaml | 232 - ...ative_tools_web_search-non-stream-sse.yaml | 263 - ...st_native_tools_web_search-non-stream.yaml | 147 - .../test_native_tools_web_search-stream.yaml | 268 - ...t_tool_choice_required-non-stream-sse.yaml | 144 - .../test_tool_choice_required-non-stream.yaml | 120 - .../test_tool_choice_required-stream.yaml | 144 - .../tool_call_image_result_parallel/README.md | 19 + .../openai-chat_completions-stream-00.yaml | 146 + .../openai-chat_completions-stream-01.yaml | 336 + tests/conftest.py | 41 +- tests/core/test_exceptions.py | 170 +- tests/core/test_interface.py | 1454 +- tests/test_cassette_discovery.py | 373 + tests/test_match_anthropic_cassette_events.py | 103 +- ...test_match_anthropic_cassette_responses.py | 14 +- tests/test_match_openai_cassette_events.py | 231 +- tests/test_match_openai_cassette_responses.py | 14 +- tests/test_network.py | 9 + tests/upstream/test_anthropic.py | 92 +- tests/upstream/test_openai.py | 77 +- tests/utils/test_test_utils.py | 106 +- 112 files changed, 3517 insertions(+), 37214 deletions(-) delete mode 100644 old_tests/chat_completions/__init__.py delete mode 100644 old_tests/chat_completions/test_messages.py delete mode 100644 old_tests/chat_completions/test_model_settings.py delete mode 100644 old_tests/chat_completions/test_request_options.py delete mode 100644 old_tests/chat_completions/test_response_format.py delete mode 100644 old_tests/chat_completions/test_tool_args.py delete mode 100644 old_tests/chat_completions/test_tools.py delete mode 100644 old_tests/responses/__init__.py delete mode 100644 old_tests/responses/test_conversation.py delete mode 100644 old_tests/responses/test_exceptions.py delete mode 100644 old_tests/responses/test_incomplete_responses.py delete mode 100644 old_tests/responses/test_model_settings.py delete mode 100644 old_tests/responses/test_reasoning.py delete mode 100644 old_tests/responses/test_text_config.py delete mode 100644 old_tests/responses/test_tool_args.py delete mode 100644 old_tests/responses/test_tools.py delete mode 100644 old_tests/test_cassette_manager.py create mode 100644 tests/cassette_discovery.py create mode 100644 tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml create mode 100644 tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml delete mode 100644 tests/cassettes/openai/chat_completions/invalid_api_key.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object-sse.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema-sse.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-object.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-schema.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-stream.yaml delete mode 100644 tests/cassettes/openai/chat_completions/tool_choice-required.yaml delete mode 100644 tests/cassettes/openai/conversations/test_conversation/test_conversation-non-stream-setup.yaml delete mode 100644 tests/cassettes/openai/conversations/test_conversation/test_conversation-stream-setup.yaml delete mode 100644 tests/cassettes/openai/exceptions/context_length_exceeded.yaml delete mode 100644 tests/cassettes/openai/exceptions/incorrect_api_key.yaml delete mode 100644 tests/cassettes/openai/exceptions/missing_api_key.yaml delete mode 100644 tests/cassettes/openai/exceptions/thinking_budget_exceeding_max_tokens.yaml delete mode 100644 tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_conversation/test_conversation-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_exceptions/test_context_window_exceeded-context_length_exceeded.yaml delete mode 100644 tests/cassettes/openai/responses/test_exceptions/test_invalid_api_key-incorrect_api_key.yaml delete mode 100644 tests/cassettes/openai/responses/test_exceptions/test_missing_api_key-missing_api_key.yaml delete mode 100644 tests/cassettes/openai/responses/test_exceptions/test_thinking_budget_exceeding_max_tokens-thinking_budget_exceeding_max_tokens.yaml delete mode 100644 tests/cassettes/openai/responses/test_interface/instructions-stream-00.yaml delete mode 100644 tests/cassettes/openai/responses/test_interface/instructions-stream-01.yaml delete mode 100644 tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_request_error.yaml delete mode 100644 tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_type.yaml delete mode 100644 tests/cassettes/openai/responses/test_interface/reasoning-stream-missing_required_parameter.yaml delete mode 100644 tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_model_settings/test_model_settings-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_no_summary.yaml delete mode 100644 tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_with_summary.yaml delete mode 100644 tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream-sse.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream.yaml delete mode 100644 tests/cassettes/openai/responses/test_tools/test_tool_choice_required-stream.yaml create mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/README.md create mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml create mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml create mode 100644 tests/test_cassette_discovery.py create mode 100644 tests/test_network.py diff --git a/AGENTS.md b/AGENTS.md index 1467d7a..9e570d8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,6 +82,7 @@ The user's job as a senior software engineer is dependent on you implementing cl - All tests must have docstrings that state their intention, goal, purpose, or the regression they guard against. Use phrasing such as "Ensures ..." or "Asserts that ..." to describe the behavior being protected. - Add or update regression tests when fixing a reproducible defect. For any public provider behavior with an OpenAI SDK-equivalent contract, include cassette-backed parity coverage that compares Molto against parsed OpenAI SDK responses or events; IR and provider-setting unit tests may supplement this coverage, but must not replace it. - Read `tests/cassettes/README.md` before recording, editing, or reviewing cassette fixtures. +- When a cassette fails validation against the pinned SDK because recorded fields are missing or incompatible, identify the cassette, SDK version, and validation error, and ask the developer for a fresh recording from an approved source. Do not add defaults, coercions, or weaker validation to runtime code or test helpers solely to accommodate the recording, or fabricate fields in the fixture unless asked by the developer. Continue unaffected work and report dependent verification as awaiting the recording. See [SDK schema mismatches](tests/cassettes/README.md#sdk-schema-mismatches). - Never run tests in cassette-recording mode. Test runs must replay them only. - If any of the committed cassettes are demonstrably wrong, you may update them, but you must explicitly mention the changes to the user in your final review or reply. - Never update uncommitted cassettes, always commit them first, and use their diff to guide your changes. diff --git a/old_tests/chat_completions/__init__.py b/old_tests/chat_completions/__init__.py deleted file mode 100644 index c3645dd..0000000 --- a/old_tests/chat_completions/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for the OpenAI Chat Completions endpoint.""" diff --git a/old_tests/chat_completions/test_messages.py b/old_tests/chat_completions/test_messages.py deleted file mode 100644 index 950fd5f..0000000 --- a/old_tests/chat_completions/test_messages.py +++ /dev/null @@ -1,134 +0,0 @@ -from base64 import b64encode -from pathlib import Path - -import pytest - -from molto.types.ir import ImagePart, TextPart, UserMessage -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest -from molto.utils.test import ( - STREAM_PARAMS, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -XLSX_IMAGE_URL = "data:image/jpeg;base64," + b64encode( - (Path(__file__).parents[1] / "files" / "xlsx.jpg").read_bytes() -).decode("ascii") - -MULTIMODAL_REQUEST = { - "model": "gpt-4.1-nano", - "messages": [ - { - "role": "user", - "content": [ - {"type": "text", "text": "What is shown in this image?"}, - {"type": "image_url", "image_url": {"url": XLSX_IMAGE_URL, "detail": "auto"}}, - ], - } - ], -} - - -def test_text_and_multimodal_messages_map_to_ir() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[ - {"role": "user", "content": "Describe this image."}, - { - "role": "user", - "content": [ - {"type": "text", "text": "What is shown?"}, - { - "type": "image_url", - "image_url": {"url": "https://example.com/image.png", "detail": "high"}, - }, - ], - }, - ], - ) - - assert request.to_ir().input == [ - UserMessage(content="Describe this image."), - UserMessage( - content=[ - TextPart(text="What is shown?"), - ImagePart(url="https://example.com/image.png", detail="high"), - ] - ), - ] - - -def _stream_text(chunks) -> str: - return "".join(chunk.choices[0].delta.content or "" for chunk in chunks if chunk.choices) - - -def _assert_usage_matches(sdk_usage, molto_usage) -> None: - assert sdk_usage is not None - assert molto_usage is not None - assert molto_usage.model_dump() == sdk_usage.model_dump() - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_multimodal_messages_round_trip_through_sdk(stream: bool, cassette_manager) -> None: - req_body = {**MULTIMODAL_REQUEST, "stream": stream} - if stream: - req_body["stream_options"] = {"include_usage": True} - assert_attrs = ["model", "messages"] - sdk_client = make_openai_client( - cassette_manager, - cassette_endpoint="chat_completions", - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.chat.completions.create(**req_body) - if stream: - sdk_chunks = [chunk async for chunk in sdk_response] - assert sdk_chunks[-1].usage is not None - sdk_text = _stream_text(sdk_chunks) - stream_reference = sdk_chunks - else: - assert sdk_response.usage is not None - sdk_text = sdk_response.choices[0].message.content - assert sdk_text is not None - stream_req_body = { - **MULTIMODAL_REQUEST, - "stream": True, - "stream_options": {"include_usage": True}, - } - reference_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - cassette_endpoint="chat_completions", - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - stream_reference = [ - chunk - async for chunk in await reference_client.chat.completions.create(**stream_req_body) - ] - - stream_req_body = { - **MULTIMODAL_REQUEST, - "stream": True, - "stream_options": {"include_usage": True}, - } - molto = make_molto_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - molto_response = await molto.chat( - OpenAIChatCompletionRequest(**prepend_model_prefix(req_body)) - ) - if stream: - molto_chunks = [chunk async for chunk in molto_response] - assert _stream_text(molto_chunks) == sdk_text - assert molto_chunks[-1].id == stream_reference[-1].id - _assert_usage_matches(stream_reference[-1].usage, molto_chunks[-1].usage) - else: - assert molto_response.choices[0].message.content == _stream_text(stream_reference) - assert molto_response.id == stream_reference[-1].id - _assert_usage_matches(stream_reference[-1].usage, molto_response.usage) diff --git a/old_tests/chat_completions/test_model_settings.py b/old_tests/chat_completions/test_model_settings.py deleted file mode 100644 index ec22801..0000000 --- a/old_tests/chat_completions/test_model_settings.py +++ /dev/null @@ -1,149 +0,0 @@ -import pytest - -from molto.providers import OpenAIChatCompletionsProvider -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest -from molto.utils.test import ( - STREAM_PARAMS, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -CHAT_SETTINGS = { - "frequency_penalty": 0.0, - "logprobs": True, - "max_completion_tokens": 20, - "presence_penalty": 0.0, - "prompt_cache_key": "chat-cache", - "prompt_cache_retention": "24h", - "store": False, - "temperature": 0.45, - "top_logprobs": 1, - "top_p": 0.55, -} - - -def test_chat_model_settings_map_to_shared_ir_and_provider_settings() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-5.1", - messages=[{"role": "user", "content": "hi"}], - frequency_penalty=0.0, - logprobs=True, - max_completion_tokens=20, - parallel_tool_calls=True, - presence_penalty=0.0, - prompt_cache_key="chat-cache", - prompt_cache_retention="24h", - reasoning_effort="high", - service_tier="flex", - store=False, - temperature=0.45, - top_logprobs=1, - top_p=0.55, - ) - - ir = request.to_ir() - - assert ir.max_output_tokens == 20 - assert ir.reasoning_effort == "high" - assert ir.openai.store is False - assert ir.openai.prompt_cache_key == "chat-cache" - assert ir.openai.prompt_cache_retention == "24h" - assert ir.openai.service_tier == "flex" - assert OpenAIChatCompletionsProvider._build_model_settings(ir) == { - "temperature": 0.45, - "top_p": 0.55, - "max_tokens": 20, - "openai_logprobs": True, - "openai_top_logprobs": 1, - "parallel_tool_calls": True, - "frequency_penalty": 0.0, - "presence_penalty": 0.0, - "openai_reasoning_effort": "high", - "openai_store": False, - "openai_service_tier": "flex", - "openai_prompt_cache_key": "chat-cache", - "openai_prompt_cache_retention": "24h", - } - - -def test_chat_max_tokens_is_the_legacy_fallback() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "hi"}], - max_tokens=11, - ) - - assert request.to_ir().max_output_tokens == 11 - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_chat_model_settings_round_trip_through_sdk(stream: bool, cassette_manager) -> None: - """Verify public Chat settings using parsed SDK responses and replayed Molto requests.""" - req_body = { - "model": "gpt-4.1-nano", - "messages": [{"role": "user", "content": "Reply with exactly: pong"}], - **CHAT_SETTINGS, - "stream": stream, - } - if stream: - req_body["stream_options"] = {"include_usage": True} - assert_attrs = ["model", "messages", *CHAT_SETTINGS] - - sdk_client = make_openai_client( - cassette_manager, - cassette_endpoint="chat_completions", - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.chat.completions.create(**req_body) - if stream: - sdk_chunks = [chunk async for chunk in sdk_response] - assert sdk_chunks[-1].usage is not None - assert any(chunk.choices for chunk in sdk_chunks) - else: - assert sdk_response.choices[0].message.content == "pong" - assert sdk_response.usage is not None - - stream_req_body = { - **CHAT_SETTINGS, - "model": "gpt-4.1-nano", - "messages": req_body["messages"], - "stream": True, - "stream_options": {"include_usage": True}, - } - stream_reference = None - if not stream: - reference_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - cassette_endpoint="chat_completions", - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - stream_reference = [ - chunk - async for chunk in await reference_client.chat.completions.create(**stream_req_body) - ] - - molto = make_molto_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - molto_response = await molto.chat( - OpenAIChatCompletionRequest(**prepend_model_prefix(req_body)) - ) - if stream: - molto_chunks = [chunk async for chunk in molto_response] - assert molto_chunks[-1].usage is not None - assert any(chunk.choices for chunk in molto_chunks) - else: - assert stream_reference is not None - assert molto_response.id == stream_reference[-1].id - assert molto_response.choices[0].message.content == "".join( - chunk.choices[0].delta.content or "" for chunk in stream_reference if chunk.choices - ) - assert molto_response.usage is not None diff --git a/old_tests/chat_completions/test_request_options.py b/old_tests/chat_completions/test_request_options.py deleted file mode 100644 index 0419915..0000000 --- a/old_tests/chat_completions/test_request_options.py +++ /dev/null @@ -1,49 +0,0 @@ -from molto.providers import OpenAIChatCompletionsProvider -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest - - -def test_request_omits_implicit_defaults_from_ir() -> None: - implicit = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "hi"}], - ).to_ir() - assert implicit.stream is None - assert implicit.parallel_tool_calls is None - assert implicit.tool_choice is None - - explicit = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "hi"}], - stream=False, - parallel_tool_calls=True, - tool_choice="auto", - ).to_ir() - assert explicit.stream is False - assert explicit.parallel_tool_calls is True - assert explicit.tool_choice == "auto" - - -def test_shared_openai_options_are_not_chat_specific() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "hi"}], - store=False, - prompt_cache_key="chat-cache", - prompt_cache_retention="24h", - service_tier="flex", - extra_body={"chat_only": True}, - ) - - ir = request.to_ir() - - assert ir.openai.store is False - assert ir.openai.prompt_cache_key == "chat-cache" - assert ir.openai.prompt_cache_retention == "24h" - assert ir.openai.service_tier == "flex" - assert ir.extra_body == {"chat_only": True} - assert "extra_body" in type(ir).model_fields - assert "extra_body" not in type(ir.responses).model_fields - assert ir.responses.include is None - - model_settings = OpenAIChatCompletionsProvider._build_model_settings(ir) - assert model_settings["extra_body"] == {"chat_only": True} diff --git a/old_tests/chat_completions/test_response_format.py b/old_tests/chat_completions/test_response_format.py deleted file mode 100644 index 423be5e..0000000 --- a/old_tests/chat_completions/test_response_format.py +++ /dev/null @@ -1,148 +0,0 @@ -import json - -import pytest - -from molto.types.ir import JsonObjectFormat, JsonSchemaFormat -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest -from molto.utils.test import ( - STREAM_PARAMS, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -STRUCT_SCHEMA = { - "type": "object", - "properties": {"name": {"type": "string"}}, - "required": ["name"], - "additionalProperties": False, -} - - -RESPONSE_FORMATS = [ - pytest.param( - { - "type": "json_schema", - "json_schema": { - "name": "final_result", - "description": "A deterministic JSON response.", - "schema": STRUCT_SCHEMA, - "strict": True, - }, - }, - id="json-schema", - ), - pytest.param({"type": "json_object"}, id="json-object"), -] - -JSON_PROMPT = 'Return exactly the JSON object {"name":"Molto"}. Do not include markdown.' - - -def test_json_schema_response_format_maps_to_ir() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "Who are you?"}], - response_format={ - "type": "json_schema", - "json_schema": STRUCT_SCHEMA, - "name": "final_result", - "description": "The final response.", - "strict": True, - }, - ) - - text_format = request.to_ir().text_format - - assert isinstance(text_format, JsonSchemaFormat) - assert text_format.name == "final_result" - assert text_format.json_schema == STRUCT_SCHEMA - assert text_format.strict is True - assert text_format.description == "The final response." - - -def test_json_object_response_format_maps_to_ir() -> None: - request = OpenAIChatCompletionRequest( - model="openai/gpt-4.1-nano", - messages=[{"role": "user", "content": "Return JSON."}], - response_format={"type": "json_object"}, - ) - - assert request.to_ir().text_format == JsonObjectFormat() - - -def _stream_text(chunks) -> str: - return "".join(chunk.choices[0].delta.content or "" for chunk in chunks if chunk.choices) - - -def _assert_usage_matches(sdk_usage, molto_usage) -> None: - assert sdk_usage is not None - assert molto_usage is not None - assert molto_usage.model_dump() == sdk_usage.model_dump() - - -@pytest.mark.parametrize("response_format", RESPONSE_FORMATS) -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_response_format_round_trip_through_sdk( - response_format: dict, stream: bool, cassette_manager -) -> None: - req_body = { - "model": "gpt-4.1-nano", - "messages": [{"role": "user", "content": JSON_PROMPT}], - "response_format": response_format, - "stream": stream, - } - if stream: - req_body["stream_options"] = {"include_usage": True} - assert_attrs = ["model", "messages", "response_format"] - sdk_client = make_openai_client( - cassette_manager, - cassette_endpoint="chat_completions", - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.chat.completions.create(**req_body) - if stream: - sdk_chunks = [chunk async for chunk in sdk_response] - assert sdk_chunks[-1].usage is not None - sdk_text = _stream_text(sdk_chunks) - stream_reference = sdk_chunks - else: - assert sdk_response.usage is not None - sdk_text = sdk_response.choices[0].message.content - assert sdk_text is not None - stream_req_body = {**req_body, "stream": True, "stream_options": {"include_usage": True}} - reference_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - cassette_endpoint="chat_completions", - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - stream_reference = [ - chunk - async for chunk in await reference_client.chat.completions.create(**stream_req_body) - ] - json.loads(sdk_text) - stream_req_body = {**req_body, "stream": True, "stream_options": {"include_usage": True}} - molto = make_molto_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - molto_response = await molto.chat( - OpenAIChatCompletionRequest(**prepend_model_prefix(req_body)) - ) - if stream: - molto_chunks = [chunk async for chunk in molto_response] - molto_text = _stream_text(molto_chunks) - assert molto_text == sdk_text - assert molto_chunks[-1].id == stream_reference[-1].id - _assert_usage_matches(stream_reference[-1].usage, molto_chunks[-1].usage) - else: - molto_text = molto_response.choices[0].message.content - assert molto_text is not None - assert molto_text == sdk_text - assert molto_response.id == stream_reference[-1].id - _assert_usage_matches(stream_reference[-1].usage, molto_response.usage) diff --git a/old_tests/chat_completions/test_tool_args.py b/old_tests/chat_completions/test_tool_args.py deleted file mode 100644 index ef7c655..0000000 --- a/old_tests/chat_completions/test_tool_args.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -from collections.abc import AsyncIterator -from typing import Any - -import pytest - -from molto.types.ir import AgentRunResult, AgentToolCall, AgentToolCalls, OutputIR -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest -from molto.types.openai.chat_completions import from_ir as chat_completions_from_ir - - -def _single_history_tool_call(items: object) -> AgentToolCall: - assert isinstance(items, list) - tool_call_items = [item for item in items if isinstance(item, AgentToolCalls)] - assert len(tool_call_items) == 1 - assert len(tool_call_items[0].tool_calls) == 1 - return tool_call_items[0].tool_calls[0] - - -async def _output_stream(*events: OutputIR) -> AsyncIterator[OutputIR]: - for event in events: - yield event - - -@pytest.mark.parametrize( - ("arguments", "expected_args", "expected_raw_args"), - [ - ('{"city":"Paris"}', {"city": "Paris"}, None), - ("{bad json", {}, "{bad json"), - ('["not","an","object"]', {}, '["not","an","object"]'), - ], -) -def test_history_tool_args_are_safe( - arguments: str, - expected_args: dict[str, Any], - expected_raw_args: str | None, -) -> None: - request = OpenAIChatCompletionRequest( - model="gpt-test", - messages=[ - { - "role": "assistant", - "tool_calls": [ - { - "id": "call_1", - "type": "function", - "function": {"name": "lookup", "arguments": arguments}, - } - ], - } - ], - ) - - tool_call = _single_history_tool_call(request.to_ir().input) - - assert tool_call.args == expected_args - assert tool_call.raw_args == expected_raw_args - - -async def test_response_preserves_raw_tool_args() -> None: - ir = OpenAIChatCompletionRequest( - model="gpt-test", - messages=[{"role": "user", "content": "hello"}], - ).to_ir() - - response = await chat_completions_from_ir( - ir, - _output_stream( - AgentRunResult( - tool_calls=[ - AgentToolCall( - tool_call_id="call_1", - tool_name="lookup", - args={}, - raw_args='["not","an","object"]', - ) - ] - ) - ), - ) - - tool_calls = response.choices[0].message.tool_calls - assert tool_calls is not None - assert tool_calls[0].function.arguments == '["not","an","object"]' diff --git a/old_tests/chat_completions/test_tools.py b/old_tests/chat_completions/test_tools.py deleted file mode 100644 index ebf04bb..0000000 --- a/old_tests/chat_completions/test_tools.py +++ /dev/null @@ -1,154 +0,0 @@ -import pytest - -from molto.types.openai.chat_completions import OpenAIChatCompletionRequest -from molto.utils.test import ( - STREAM_PARAMS, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -REQUEST_BODY = { - "model": "gpt-4.1-nano", - "messages": [{"role": "user", "content": "What number am I thinking of?"}], - "tools": [ - { - "type": "function", - "function": { - "name": "guess_number", - "description": "Guess a number.", - "parameters": { - "type": "object", - "properties": { - "number": {"type": "integer", "description": "The guessed number."} - }, - "required": ["number"], - "additionalProperties": False, - }, - "strict": True, - }, - } - ], - "tool_choice": "required", -} - - -def _choice_chunks(chunks): - return [chunk for chunk in chunks if chunk.choices] - - -def _tool_call_chunks(chunks): - return [chunk for chunk in _choice_chunks(chunks) if chunk.choices[0].delta.tool_calls] - - -def _assert_usage_matches(sdk_usage, molto_usage) -> None: - assert sdk_usage is not None - assert molto_usage is not None - assert molto_usage.model_dump() == sdk_usage.model_dump() - - -def _assert_tool_call_deltas_match(sdk_chunk, molto_chunk) -> None: - sdk_tool_calls = sdk_chunk.choices[0].delta.tool_calls or [] - molto_tool_calls = molto_chunk.choices[0].delta.tool_calls or [] - assert len(molto_tool_calls) == len(sdk_tool_calls) - for sdk_tool_call, molto_tool_call in zip(sdk_tool_calls, molto_tool_calls, strict=True): - assert molto_tool_call.index == sdk_tool_call.index - assert molto_tool_call.id == sdk_tool_call.id - assert molto_tool_call.type == sdk_tool_call.type - assert molto_tool_call.function is not None - assert sdk_tool_call.function is not None - assert molto_tool_call.function.name == sdk_tool_call.function.name - assert molto_tool_call.function.arguments == sdk_tool_call.function.arguments - - -def _assert_stream_chunks_match(sdk_chunks, molto_chunks) -> None: - assert len(molto_chunks) == len(sdk_chunks) - for sdk_chunk, molto_chunk in zip(sdk_chunks, molto_chunks, strict=True): - if sdk_chunk.choices and sdk_chunk.choices[0].finish_reason is None: - assert molto_chunk.id is None - else: - assert molto_chunk.id == sdk_chunk.id - assert molto_chunk.object == sdk_chunk.object - if sdk_chunk.usage is None: - assert molto_chunk.usage is None - else: - _assert_usage_matches(sdk_chunk.usage, molto_chunk.usage) - assert len(molto_chunk.choices) == len(sdk_chunk.choices) - for sdk_choice, molto_choice in zip(sdk_chunk.choices, molto_chunk.choices, strict=True): - assert molto_choice.index == sdk_choice.index - assert molto_choice.finish_reason == sdk_choice.finish_reason - assert molto_choice.delta.role == sdk_choice.delta.role - assert molto_choice.delta.content == sdk_choice.delta.content - assert molto_choice.delta.refusal == sdk_choice.delta.refusal - if sdk_chunk.choices: - _assert_tool_call_deltas_match(sdk_chunk, molto_chunk) - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_tool_choice_required(stream: bool, cassette_manager) -> None: - req_body = {**REQUEST_BODY, "stream": stream} - if stream: - req_body["stream_options"] = {"include_usage": True} - assert_attrs = ["model", "messages", "tool_choice"] - - sdk_client = make_openai_client( - cassette_manager, - cassette_endpoint="chat_completions", - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.chat.completions.create(**req_body) - if stream: - sdk_chunks = [chunk async for chunk in sdk_response] - assert _choice_chunks(sdk_chunks)[-1].choices[0].finish_reason == "tool_calls" - sdk_tool_chunks = _tool_call_chunks(sdk_chunks) - assert sdk_tool_chunks - else: - assert sdk_response.choices[0].finish_reason == "tool_calls" - - stream_req_body = { - **REQUEST_BODY, - "stream": True, - "stream_options": {"include_usage": True}, - } - reference_chunks = None - if not stream: - reference_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - cassette_endpoint="chat_completions", - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - reference_chunks = [ - chunk - async for chunk in await reference_client.chat.completions.create(**stream_req_body) - ] - molto = make_molto_client( - cassette_manager, - cassette_suffix=stream_reference_cassette_suffix(stream), - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await molto.chat(OpenAIChatCompletionRequest(**prepend_model_prefix(req_body))) - if stream: - molto_chunks = [chunk async for chunk in response] - _assert_stream_chunks_match(sdk_chunks, molto_chunks) - else: - molto_tool_call = response.choices[0].message.tool_calls[0] - assert reference_chunks is not None - reference_tool_chunks = _tool_call_chunks(reference_chunks) - assert response.id == reference_chunks[-1].id - assert response.choices[0].finish_reason == sdk_response.choices[0].finish_reason - assert molto_tool_call.id == reference_tool_chunks[0].choices[0].delta.tool_calls[0].id - assert response.object == sdk_response.object - _assert_usage_matches(reference_chunks[-1].usage, response.usage) - assert ( - molto_tool_call.function.name - == reference_tool_chunks[0].choices[0].delta.tool_calls[0].function.name - ) - assert molto_tool_call.function.arguments == "".join( - chunk.choices[0].delta.tool_calls[0].function.arguments or "" - for chunk in reference_tool_chunks - ) diff --git a/old_tests/responses/__init__.py b/old_tests/responses/__init__.py deleted file mode 100644 index 49e4493..0000000 --- a/old_tests/responses/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for the OpenAI Responses endpoint.""" diff --git a/old_tests/responses/test_conversation.py b/old_tests/responses/test_conversation.py deleted file mode 100644 index 418b125..0000000 --- a/old_tests/responses/test_conversation.py +++ /dev/null @@ -1,147 +0,0 @@ -import pytest -from openai.types.responses import Response, ResponseCompletedEvent, ResponseOutputMessage - -from molto.types.openai.responses import ( - OpenAIConversation, - OpenAIOutputItem, - OpenAIOutputTextContent, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - _OpenAIStreamEvent, -) -from molto.utils.test import ( - STREAM_PARAMS, - assert_output_item_order, - assert_stream_events_match, - assert_stream_text_events, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -CONVERSATION_SETUP_ITEMS = [ - {"role": "user", "content": "Tell me a short joke about a scarecrow."}, - { - "role": "assistant", - "content": ( - "Why did the scarecrow win an award? Because he was outstanding in his field!" - ), - }, -] - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_conversation(stream: bool, cassette_manager): - """Create/replay a provider conversation setup before testing response replay. - - Example: - # cassette_suffix="setup" returns a conversation id used by the stream/non-stream request. - """ - setup_client = make_openai_client( - cassette_manager, - cassette_suffix="setup", - cassette_endpoint="conversations", - expected_request_body={"items": CONVERSATION_SETUP_ITEMS}, - assert_attrs=["items"], - ) - conversation = await setup_client.conversations.create(items=CONVERSATION_SETUP_ITEMS) - conversation_id = conversation.id - - req_body = dict( - model="gpt-5-nano", - input=[{"role": "user", "content": "what joke was previously mentioned?"}], - conversation=conversation_id, - include=["reasoning.encrypted_content"], - stream=stream, - ) - - assert_attrs = ["model", "input", "conversation"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseCompletedEvent) - assert sdk_event_types[-1] == "response.completed" - - assert_output_item_order(sdk_events) - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "completed" - assert sdk_response.conversation is not None - assert sdk_response.conversation.id == conversation_id - - sdk_msg = next(o for o in sdk_response.output if isinstance(o, ResponseOutputMessage)) - assert sdk_msg.role == "assistant" - assert len(sdk_msg.content) >= 1 - assert "scarecrow" in sdk_msg.content[0].text - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - sdk_ref_msg = next(o for o in sdk_ref.output if isinstance(o, ResponseOutputMessage)) - - # -- Molto client ---------------------------------------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - - assert_stream_events_match(ref_events, events) - assert_stream_text_events(events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - assert response.id == sdk_ref.id - assert response.status == "completed" - assert response.conversation is not None - assert isinstance(response.conversation, OpenAIConversation) - assert response.conversation.id == conversation_id - - assert len(response.output) >= 1 - msg_molto = response.output[-1] - assert isinstance(msg_molto, OpenAIOutputItem) - assert msg_molto.type == "message" - assert msg_molto.role == "assistant" - assert msg_molto.status == "completed" - assert msg_molto.id == sdk_ref_msg.id - assert len(msg_molto.content) >= 1 - - text_molto = msg_molto.content[0] - assert isinstance(text_molto, OpenAIOutputTextContent) - assert text_molto.type == "output_text" - assert "scarecrow" in text_molto.text - - assert response.usage is not None - assert response.usage.input_tokens > 0 - assert response.usage.output_tokens > 0 diff --git a/old_tests/responses/test_exceptions.py b/old_tests/responses/test_exceptions.py deleted file mode 100644 index 60fedc4..0000000 --- a/old_tests/responses/test_exceptions.py +++ /dev/null @@ -1,255 +0,0 @@ -from typing import Any - -import pytest -from openai import APIConnectionError, APIError, APIStatusError -from pydantic_ai import ModelHTTPError -from pydantic_ai.exceptions import ModelAPIError - -from molto.providers import OpenAIResponsesProvider -from molto.runner import _map_pydantic_ai_error -from molto.types.ir import Input -from molto.types.openai.responses import OpenAIResponsesRequest -from molto.utils.exceptions import ( - BadInputError, - ContextOverflowError, - ExternalAuthError, - ModelOverloadError, -) -from molto.utils.test import make_molto_client, make_openai_client, prepend_model_prefix - -CONTEXT_OVERFLOW_INPUT = "Repeat this exactly: " + ("x " * 300_000).strip() - -EXCEPTION_REQUESTS: dict[str, dict[str, Any]] = { - "context_length_exceeded": { - "model": "o3-mini", - "input": [{"role": "user", "content": CONTEXT_OVERFLOW_INPUT}], - "include": ["reasoning.encrypted_content"], - }, - "thinking_budget_exceeding_max_tokens": { - "model": "o4-mini", - "input": [{"role": "user", "content": "Think very carefully about this."}], - "include": ["reasoning.encrypted_content"], - "max_output_tokens": 1, - "reasoning": {"effort": "high"}, - }, - "incorrect_api_key": { - "model": "gpt-4.1-nano", - "input": [{"role": "user", "content": "hi"}], - }, - "missing_api_key": { - "model": "gpt-4.1-nano", - "input": [{"role": "user", "content": "hi"}], - }, -} - -EXCEPTION_STATUS_CODES = { - "context_length_exceeded": 400, - "thinking_budget_exceeding_max_tokens": 400, - "incorrect_api_key": 401, - "missing_api_key": 401, -} - - -def _provider_error_request_body(name: str) -> dict[str, Any]: - """Return the provider request body used for error cassette replay.""" - return {**EXCEPTION_REQUESTS[name], "stream": True} - - -async def _record_or_replay_provider_error( - cassette_manager, - name: str, - *, - api_key: str | None = None, -) -> None: - """Record or replay the OpenAI SDK error cassette used by Molto playback.""" - req_body = _provider_error_request_body(name) - client = make_openai_client( - cassette_manager, - cassette_suffix=name, - expected_request_body=req_body, - assert_attrs=["model", "input"], - api_key=api_key, - ) - with pytest.raises(APIError) as exc_info: - response = await client.responses.create(**req_body) - if req_body.get("stream"): - async for _ in response: - pass - - exc = exc_info.value - assert not isinstance(exc, APIConnectionError) - if isinstance(exc, APIStatusError): - assert exc.status_code == EXCEPTION_STATUS_CODES[name] - else: - assert name == "context_length_exceeded" - assert "context window" in str(exc).lower() - - -def _cassette_request_params(name: str) -> dict[str, Any]: - """Return Molto request params for an exception cassette name.""" - body = EXCEPTION_REQUESTS[name] - params: dict[str, Any] = prepend_model_prefix( - { - "model": body["model"], - "input": body["input"], - "stream": False, - } - ) - for key in ("reasoning", "max_output_tokens"): - if key in body: - params[key] = body[key] - return params - - -def _make_ir(**overrides) -> Input: - """Return an Input IR with complete defaults for provider validation tests.""" - defaults = dict( - model="openai/gpt-4.1-nano", - instructions=None, - temperature=None, - top_p=None, - max_output_tokens=None, - reasoning_effort=None, - reasoning_summary=None, - top_logprobs=None, - parallel_tool_calls=None, - max_tool_calls=None, - text_format=None, - tools=None, - tool_choice=None, - stream=None, - ) - defaults.update(overrides) - return Input(**defaults) - - -class TestBadInputError: - async def test_context_window_exceeded(self, cassette_manager): - """Map OpenAI context-window errors to ContextOverflowError.""" - await _record_or_replay_provider_error(cassette_manager, "context_length_exceeded") - - molto = make_molto_client( - cassette_manager, - cassette_suffix="context_length_exceeded", - expected_request_body=_provider_error_request_body("context_length_exceeded"), - assert_attrs=["model", "input"], - ) - req = OpenAIResponsesRequest(**_cassette_request_params("context_length_exceeded")) - with pytest.raises(ContextOverflowError): - await molto.chat(req) - - async def test_invalid_temperature(self): - """Reject temperatures below the OpenAI-supported range.""" - ir = _make_ir(temperature=-1.0) - provider = OpenAIResponsesProvider() - with pytest.raises(BadInputError) as exc_info: - await provider.parse_agent_settings(ir) - assert "temperature" in str(exc_info.value) - - async def test_invalid_temperature_above_range(self): - """Reject temperatures above the OpenAI-supported range.""" - ir = _make_ir(temperature=5.0) - provider = OpenAIResponsesProvider() - with pytest.raises(BadInputError) as exc_info: - await provider.parse_agent_settings(ir) - assert "temperature" in str(exc_info.value) - - async def test_thinking_budget_exceeding_max_tokens(self, cassette_manager): - """Map invalid reasoning/max-token provider errors to BadInputError.""" - await _record_or_replay_provider_error( - cassette_manager, - "thinking_budget_exceeding_max_tokens", - ) - - molto = make_molto_client( - cassette_manager, - cassette_suffix="thinking_budget_exceeding_max_tokens", - expected_request_body=_provider_error_request_body( - "thinking_budget_exceeding_max_tokens" - ), - assert_attrs=["model", "input"], - ) - req = OpenAIResponsesRequest( - **_cassette_request_params("thinking_budget_exceeding_max_tokens") - ) - with pytest.raises(BadInputError): - await molto.chat(req) - - -class TestModelOverloadError: - def test_connection_error_preserves_cassette_assertion(self): - """Keep assertion detail through the SDK and model-error wrappers.""" - assertion = AssertionError("OpenAI cassette request mismatch.") - connection_error = APIConnectionError(request=None) - connection_error.__cause__ = assertion - model_error = ModelAPIError("gpt-5-nano", "Connection error.") - model_error.__cause__ = connection_error - - mapped = _map_pydantic_ai_error(model_error) - - assert str(mapped) == ( - "ModelAPIError: Connection error.\n" - "Caused by: AssertionError: OpenAI cassette request mismatch." - ) - - async def test_network_connectivity_503(self): - """Map HTTP 503 model errors to ModelOverloadError.""" - exc = ModelHTTPError( - status_code=503, - model_name="gpt-4.1-nano", - body="Service unavailable", - ) - mapped = _map_pydantic_ai_error(exc) - assert type(mapped) is ModelOverloadError - with pytest.raises(ModelOverloadError): - raise mapped - - async def test_server_downtime_529(self): - """Map HTTP 529 model errors to ModelOverloadError.""" - exc = ModelHTTPError( - status_code=529, - model_name="gpt-4.1-nano", - body="Site is overloaded", - ) - mapped = _map_pydantic_ai_error(exc) - assert type(mapped) is ModelOverloadError - with pytest.raises(ModelOverloadError): - raise mapped - - -class TestExternalAuthError: - async def test_invalid_api_key(self, cassette_manager): - """Map invalid OpenAI credentials to ExternalAuthError.""" - await _record_or_replay_provider_error( - cassette_manager, - "incorrect_api_key", - api_key="sk-invalid12345", - ) - - molto = make_molto_client( - cassette_manager, - cassette_suffix="incorrect_api_key", - expected_request_body=_provider_error_request_body("incorrect_api_key"), - assert_attrs=["model", "input"], - ) - req = OpenAIResponsesRequest(**_cassette_request_params("incorrect_api_key")) - with pytest.raises(ExternalAuthError): - await molto.chat(req) - - async def test_missing_api_key(self, cassette_manager): - """Map missing OpenAI credentials to ExternalAuthError.""" - await _record_or_replay_provider_error( - cassette_manager, - "missing_api_key", - api_key="", - ) - - molto = make_molto_client( - cassette_manager, - cassette_suffix="missing_api_key", - expected_request_body=_provider_error_request_body("missing_api_key"), - assert_attrs=["model", "input"], - ) - req = OpenAIResponsesRequest(**_cassette_request_params("missing_api_key")) - with pytest.raises(ExternalAuthError): - await molto.chat(req) diff --git a/old_tests/responses/test_incomplete_responses.py b/old_tests/responses/test_incomplete_responses.py deleted file mode 100644 index af08397..0000000 --- a/old_tests/responses/test_incomplete_responses.py +++ /dev/null @@ -1,141 +0,0 @@ -import pytest -from openai.types.responses import Response, ResponseIncompleteEvent, ResponseOutputMessage - -from molto.types.openai.responses import ( - OpenAIOutputItem, - OpenAIOutputTextContent, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - OpenAIResponsesStreamText, - _OpenAIStreamEvent, -) -from molto.utils.test import ( - STREAM_PARAMS, - assert_output_item_order, - assert_stream_events_match, - assert_stream_text_events, - assert_usage, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -EXPECTED_SETTINGS = { - "max_output_tokens": 20, - "instructions": "You are a financial advisor for the user.", -} - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_incomplete_response(stream: bool, cassette_manager): - """Compare incomplete Responses output against SDK-parsed cassettes. - - Example: - # max_output_tokens=20 returns status "incomplete" with reason "max_output_tokens". - """ - - req_body = dict( - model="gpt-4.1-nano", - input=[ - {"role": "system", "content": "You are a financial advisor"}, - {"role": "user", "content": "Who are you?"}, - ], - instructions=EXPECTED_SETTINGS["instructions"], - max_output_tokens=EXPECTED_SETTINGS["max_output_tokens"], - stream=stream, - ) - - assert_attrs = ["model", "input", "instructions", "max_output_tokens"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseIncompleteEvent) - assert sdk_event_types[-1] == "response.incomplete" - - assert_output_item_order(sdk_events) - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "incomplete" - assert sdk_response.incomplete_details is not None - assert sdk_response.incomplete_details.reason == "max_output_tokens" - for key, expected in EXPECTED_SETTINGS.items(): - actual = getattr(sdk_response, key) - assert actual == expected, f"OpenAI SDK response.{key}={actual!r}, expected {expected!r}" - - sdk_msg = next((o for o in sdk_response.output if isinstance(o, ResponseOutputMessage)), None) - assert sdk_msg is not None - assert sdk_msg.status == "incomplete" - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseIncompleteEvent) - sdk_ref = ref_events[-1].response - sdk_ref_msg = next(o for o in sdk_ref.output if isinstance(o, ResponseOutputMessage)) - - # -- Molto client ---------------------------------------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert OpenAIResponsesStreamText in {type(e) for e in events} - assert "response.output_text.delta" in event_types - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.incomplete" - - assert_output_item_order(events) - assert_stream_text_events(events) - - assert_stream_events_match(ref_events, events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - assert response.id == sdk_ref.id - assert response.status == "incomplete" - assert response.incomplete_details is not None - assert response.incomplete_details.reason == "max_output_tokens" - for key, expected in EXPECTED_SETTINGS.items(): - actual = getattr(response, key) - assert actual == expected, f"Molto response.{key}={actual!r}, expected {expected!r}" - - for msg_molto in response.output: - assert isinstance(msg_molto, OpenAIOutputItem) - assert msg_molto.type == "message" - assert msg_molto.role == "assistant" - assert msg_molto.status == "incomplete" - assert msg_molto.id == sdk_ref_msg.id - assert len(msg_molto.content) >= 1 - - text_molto = msg_molto.content[0] - assert isinstance(text_molto, OpenAIOutputTextContent) - assert text_molto.type == "output_text" - assert len(text_molto.text) > 0 - assert "financial advisor" in text_molto.text - - assert_usage(response.usage, output_tokens_exact=20) diff --git a/old_tests/responses/test_model_settings.py b/old_tests/responses/test_model_settings.py deleted file mode 100644 index e760531..0000000 --- a/old_tests/responses/test_model_settings.py +++ /dev/null @@ -1,343 +0,0 @@ -import pytest -from openai.types.responses import ( - Response, - ResponseCompletedEvent, - ResponseFunctionWebSearch, - ResponseOutputMessage, - ResponseTextDeltaEvent, -) -from openai.types.responses.response_output_text import ResponseOutputText - -from molto.providers import OpenAIResponsesProvider -from molto.types.openai.responses import ( - OpenAIOutputItem, - OpenAIOutputTextContent, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - OpenAIResponsesStreamText, - OpenAIWebSearchToolCall, - _OpenAIStreamEvent, -) -from molto.utils.test import ( - STREAM_PARAMS, - assert_events_before_terminal, - assert_output_item_order, - assert_stream_events_match, - assert_stream_text_events, - assert_usage, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -# Settings expected to round-trip Request → cassette → Response (SDK/Molto). -EXPECTED_SETTINGS = { - "instructions": "The user would like to know about the weather in Taiwan today.", - "max_output_tokens": 400, - "max_tool_calls": 1, - "parallel_tool_calls": True, - "prompt_cache_key": "my_cache_key", - "prompt_cache_retention": "24h", - "safety_identifier": "safety", - "service_tier": "flex", - "store": False, - "temperature": 0.45, - "tool_choice": "required", - "top_logprobs": 1, - "top_p": 0.55, - "frequency_penalty": 0.0, - "presence_penalty": 0.0, - "truncation": "disabled", -} - - -def test_responses_request_omits_implicit_defaults_from_ir() -> None: - """Forward only explicitly supplied Responses request defaults to the provider.""" - implicit = OpenAIResponsesRequest(model="gpt-5-nano", input="Hello!").to_ir() - assert implicit.parallel_tool_calls is None - assert implicit.openai.store is None - assert implicit.stream is None - assert implicit.tool_choice is None - assert implicit.openai.service_tier is None - assert implicit.responses.truncation is None - - explicit = OpenAIResponsesRequest( - model="gpt-5-nano", - input="Hello!", - parallel_tool_calls=True, - store=True, - stream=False, - tool_choice="auto", - service_tier="default", - truncation="disabled", - ).to_ir() - assert explicit.parallel_tool_calls is True - assert explicit.openai.store is True - assert explicit.stream is False - assert explicit.tool_choice == "auto" - assert explicit.openai.service_tier == "default" - assert explicit.responses.truncation == "disabled" - - -def test_responses_options_are_split_by_ownership(): - req = OpenAIResponsesRequest( - model="openai/gpt-4.1-nano", - input=[{"role": "user", "content": "hi"}], - store=False, - prompt_cache_key="responses-cache", - prompt_cache_retention="24h", - service_tier="priority", - include=["reasoning.encrypted_content"], - previous_response_id="resp_previous", - safety_identifier="user-hash", - truncation="auto", - extra_body={"custom": "value"}, - ) - - ir = req.to_ir() - - assert ir.openai.store is False - assert ir.openai.prompt_cache_key == "responses-cache" - assert ir.openai.prompt_cache_retention == "24h" - assert ir.openai.service_tier == "priority" - assert ir.responses.include == ["reasoning.encrypted_content"] - assert ir.responses.previous_response_id == "resp_previous" - assert ir.responses.safety_identifier == "user-hash" - assert ir.responses.truncation == "auto" - assert ir.extra_body == {"custom": "value"} - assert "extra_body" in type(ir).model_fields - - model_settings = OpenAIResponsesProvider._build_model_settings(ir) - assert model_settings["extra_body"]["custom"] == "value" - assert model_settings["extra_body"]["safety_identifier"] == "user-hash" - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_model_settings(stream: bool, cassette_manager): - """Round-trip OpenAI Responses model settings through SDK and Molto. - - Example: - # stream=False records/replays the default non-stream cassette and preserves service_tier. - """ - - req_body = dict( - model="gpt-5.1", - input=[ - {"role": "user", "content": "Who are you?"}, - ], - instructions=EXPECTED_SETTINGS["instructions"], - max_output_tokens=EXPECTED_SETTINGS["max_output_tokens"], - max_tool_calls=EXPECTED_SETTINGS["max_tool_calls"], - parallel_tool_calls=EXPECTED_SETTINGS["parallel_tool_calls"], - prompt_cache_key=EXPECTED_SETTINGS["prompt_cache_key"], - prompt_cache_retention=EXPECTED_SETTINGS["prompt_cache_retention"], - safety_identifier=EXPECTED_SETTINGS["safety_identifier"], - store=EXPECTED_SETTINGS["store"], - service_tier=EXPECTED_SETTINGS["service_tier"], - temperature=EXPECTED_SETTINGS["temperature"], - tool_choice=EXPECTED_SETTINGS["tool_choice"], - top_logprobs=EXPECTED_SETTINGS["top_logprobs"], - top_p=EXPECTED_SETTINGS["top_p"], - truncation=EXPECTED_SETTINGS["truncation"], - include=[ - "reasoning.encrypted_content", - "code_interpreter_call.outputs", - "web_search_call.action.sources", - "message.output_text.logprobs", - ], - tools=[ - {"type": "web_search", "search_context_size": "medium"}, - {"type": "code_interpreter", "container": {"type": "auto"}}, - ], - stream=stream, - ) - - assert_attrs = [ - "model", - "include", - "input", - "instructions", - "max_output_tokens", - "max_tool_calls", - "parallel_tool_calls", - "prompt_cache_key", - "prompt_cache_retention", - "safety_identifier", - "service_tier", - "temperature", - "top_logprobs", - ] - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - sdk_ref_ws = next(o for o in sdk_ref.output if isinstance(o, ResponseFunctionWebSearch)) - sdk_ref_msg = next(o for o in sdk_ref.output if isinstance(o, ResponseOutputMessage)) - - # -- OpenAI SDK client ---------------------------------------------- - client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - response = await client.responses.create(**req_body) - if stream: - events = [r async for r in response] - event_types = [e.type for e in events] - assert ResponseTextDeltaEvent in {type(e) for e in events} - assert "response.output_text.delta" in event_types - assert isinstance(events[-1], ResponseCompletedEvent) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - assert_events_before_terminal(events, "response.output_text.delta") - - response = events[-1].response - assert isinstance(response, Response) - - assert response.status == "completed" - assert response.incomplete_details is None - assert response.model == "gpt-5.1-2025-11-13" - for key, expected in EXPECTED_SETTINGS.items(): - actual = getattr(response, key) - assert actual == expected, f"OpenAI SDK response.{key}={actual!r}, expected {expected!r}" - assert response.reasoning.effort == "none" - - ws = next(o for o in response.output if isinstance(o, ResponseFunctionWebSearch)) - assert ws.type == "web_search_call" - assert ws.status == "completed" - assert isinstance(ws.id, str) and len(ws.id) > 0 - assert ws.action is not None - assert ws.action.sources is not None - - msg = next(o for o in response.output if isinstance(o, ResponseOutputMessage)) - assert msg.type == "message" - assert isinstance(msg.id, str) and len(msg.id) > 0 - assert msg.role == "assistant" - assert msg.status == "completed" - assert len(msg.content) >= 1 - - text_content = msg.content[0] - assert isinstance(text_content, ResponseOutputText) - assert text_content.type == "output_text" - assert len(text_content.text) > 0 - - assert text_content.logprobs is not None - assert len(text_content.logprobs) > 0 - for lp in text_content.logprobs: - assert len(lp.top_logprobs) == 1 - assert isinstance(lp.token, str) - assert isinstance(lp.logprob, float) - assert isinstance(lp.bytes, list) - - assert response.usage is not None - assert_usage(response.usage, expect_reasoning=True) - assert response.usage.input_tokens_details is not None - assert response.usage.input_tokens_details.cached_tokens >= 0 - - # -- Molto client (always streams internally) ----------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert OpenAIResponsesStreamText in {type(e) for e in events} - assert "response.output_text.delta" in event_types - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - assert_events_before_terminal(events, "response.output_text.delta") - - assert_stream_events_match(ref_events, events) - assert_stream_text_events(events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - assert response.status == "completed" - assert response.id == sdk_ref.id - assert response.incomplete_details is None - assert response.model == "openai/" + req_body["model"] - for key, expected in EXPECTED_SETTINGS.items(): - actual = getattr(response, key) - assert actual == expected, f"Molto response.{key}={actual!r}, expected {expected!r}" - assert response.reasoning is not None - assert response.reasoning.effort == "medium" - - assert len(response.tools) == 2 - assert response.tools[0].type == "web_search" - assert response.tools[1].type == "code_interpreter" - - assert response.completed_at is not None - assert isinstance(response.completed_at, int) - assert response.completed_at > 0 - - assert len(response.output) >= 2 - - ws_molto = next(o for o in response.output if isinstance(o, OpenAIWebSearchToolCall)) - assert ws_molto.type == "web_search_call" - assert ws_molto.status == "completed" - assert ws_molto.id == sdk_ref_ws.id - assert ws_molto.action is not None - assert ws_molto.action.sources is not None - - msg_molto = next(o for o in response.output if isinstance(o, OpenAIOutputItem)) - assert msg_molto.type == "message" - assert msg_molto.role == "assistant" - assert msg_molto.status == "completed" - assert msg_molto.id == sdk_ref_msg.id - assert len(msg_molto.content) >= 1 - - text_molto = msg_molto.content[0] - assert isinstance(text_molto, OpenAIOutputTextContent) - assert text_molto.type == "output_text" - assert len(text_molto.text) > 0 - - assert text_molto.logprobs is not None - assert len(text_molto.logprobs) > 0 - - assert response.usage is not None - assert_usage(response.usage, expect_reasoning=True) - assert response.usage.input_tokens_details is not None - assert response.usage.input_tokens_details.cached_tokens >= 0 - - -@pytest.mark.parametrize("max_tool_calls", [None, 1, 5]) -async def test_max_tool_calls_wired_into_usage_limits(max_tool_calls: int | None): - """`max_tool_calls` must reach pydantic-ai's `UsageLimits.tool_calls_limit`.""" - req = OpenAIResponsesRequest( - model="openai/gpt-4.1-nano", - input=[{"role": "user", "content": "hi"}], - max_tool_calls=max_tool_calls, - tools=[ - { - "type": "function", - "name": "noop", - "description": "noop", - "parameters": {"type": "object", "properties": {}, "additionalProperties": False}, - } - ], - ) - ir = req.to_ir() - assert ir.max_tool_calls == max_tool_calls - - run_settings = await OpenAIResponsesProvider().parse_run_settings(ir) - assert run_settings["usage_limits"].tool_calls_limit == max_tool_calls diff --git a/old_tests/responses/test_reasoning.py b/old_tests/responses/test_reasoning.py deleted file mode 100644 index ae8ba0b..0000000 --- a/old_tests/responses/test_reasoning.py +++ /dev/null @@ -1,261 +0,0 @@ -import pytest -from openai.types.responses import ( - Response, - ResponseCompletedEvent, - ResponseOutputMessage, - ResponseReasoningItem, -) - -from molto.types.openai.responses import ( - OpenAIOutputItem, - OpenAIOutputTextContent, - OpenAIReasoningItem, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - OpenAIResponsesStreamOutput, - OpenAIResponsesStreamText, - _OpenAIStreamEvent, -) -from molto.utils.test import ( - STREAM_PARAMS, - assert_output_item_order, - assert_stream_events_match, - assert_stream_text_events, - assert_usage, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -REASONING_CASES = { - "reasoning_no_summary": { - "reasoning": {"effort": "high"}, - "include": ["reasoning.encrypted_content"], - "expect_summary": False, - }, - "reasoning_with_summary": { - "reasoning": {"effort": "high", "summary": "detailed"}, - "include": ["reasoning.encrypted_content"], - "expect_summary": True, - }, -} -CASSETTE_NAMES = list(REASONING_CASES) - - -@pytest.mark.parametrize("cassette_name", CASSETTE_NAMES) -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_reasoning(stream: bool, cassette_name: str, cassette_manager): - """Compare Molto reasoning output against SDK-parsed Responses cassettes. - - Example: - # stream=True and cassette_name="reasoning_with_summary" - # returns stream events ending with "response.completed". - """ - case = REASONING_CASES[cassette_name] - reasoning = case["reasoning"] - expect_summary = case["expect_summary"] - req_body = dict( - model="gpt-5.1", - input=[{"role": "user", "content": "How many Rs in strawberry?"}], - reasoning=reasoning, - include=case["include"], - stream=stream, - ) - - assert_attrs = ["model", "input", "reasoning", "include"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseCompletedEvent) - assert sdk_event_types[-1] == "response.completed" - assert "response.output_text.delta" in sdk_event_types - if expect_summary: - # SDK uses "reasoning_summary_text" naming for reasoning deltas. - assert "response.reasoning_summary_text.delta" in sdk_event_types - assert "response.reasoning_summary_text.done" in sdk_event_types - else: - assert "response.reasoning_summary_text.delta" not in sdk_event_types - assert "response.reasoning_summary_text.done" not in sdk_event_types - - assert_output_item_order(sdk_events) - - if expect_summary: - rs_delta_indices = [ - i - for i, e in enumerate(sdk_events) - if e.type == "response.reasoning_summary_text.delta" - ] - rs_done_indices = [ - i - for i, e in enumerate(sdk_events) - if e.type == "response.reasoning_summary_text.done" - ] - assert len(rs_done_indices) >= 1 - assert all(d < rs_done_indices[0] for d in rs_delta_indices) - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "completed" - assert sdk_response.reasoning.effort == "high" - if expect_summary: - assert sdk_response.reasoning.summary == reasoning["summary"] - - sdk_reasoning = next(o for o in sdk_response.output if isinstance(o, ResponseReasoningItem)) - assert sdk_reasoning.type == "reasoning" - assert sdk_reasoning.encrypted_content is not None - assert len(sdk_reasoning.encrypted_content) > 0 - if expect_summary: - assert len(sdk_reasoning.summary) >= 1 - assert sdk_reasoning.summary[0].type == "summary_text" - assert len(sdk_reasoning.summary[0].text) > 0 - else: - assert sdk_reasoning.summary == [] - - sdk_msg = next(o for o in sdk_response.output if isinstance(o, ResponseOutputMessage)) - assert sdk_msg.role == "assistant" - assert len(sdk_msg.content) >= 1 - assert len(sdk_msg.content[0].text) > 0 - - assert sdk_response.usage.output_tokens_details.reasoning_tokens > 0 - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - sdk_ref_rs = next(o for o in sdk_ref.output if isinstance(o, ResponseReasoningItem)) - sdk_ref_msg = next(o for o in sdk_ref.output if isinstance(o, ResponseOutputMessage)) - - # -- Molto client ---------------------------------------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - if expect_summary: - assert "response.reasoning.delta" in event_types - assert "response.reasoning.done" in event_types - else: - assert "response.reasoning.delta" not in event_types - assert "response.reasoning.done" not in event_types - assert "response.output_text.delta" in event_types - assert OpenAIResponsesStreamText in {type(e) for e in events} - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - - if expect_summary: - reasoning_delta_indices = [ - i for i, e in enumerate(events) if e.type == "response.reasoning.delta" - ] - reasoning_done_indices = [ - i for i, e in enumerate(events) if e.type == "response.reasoning.done" - ] - assert len(reasoning_done_indices) >= 1 - assert all(d < reasoning_done_indices[0] for d in reasoning_delta_indices) - - reasoning_item_added = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamOutput) - and e.type == "response.output_item.added" - and isinstance(e.item, OpenAIReasoningItem) - ] - assert len(reasoning_item_added) == 1 - reasoning_item_done = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamOutput) - and e.type == "response.output_item.done" - and isinstance(e.item, OpenAIReasoningItem) - ] - assert len(reasoning_item_done) == 1 - reasoning_id = reasoning_item_added[0].item.id - assert reasoning_id is not None - assert reasoning_id.startswith("rs_") - assert reasoning_id == reasoning_item_done[0].item.id - - if expect_summary: - reasoning_deltas = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamText) - and e.type == "response.reasoning.delta" - ] - assert len(reasoning_deltas) >= 1 - for delta in reasoning_deltas: - assert delta.item_id == reasoning_id - assert any(d.delta is not None and len(d.delta) > 0 for d in reasoning_deltas) - - reasoning_done = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamText) and e.type == "response.reasoning.done" - ] - assert len(reasoning_done) == 1 - assert reasoning_done[0].item_id == reasoning_id - assert reasoning_done[0].text is not None - assert len(reasoning_done[0].text) > 0 - - assert_stream_events_match(ref_events, events) - assert_stream_text_events(events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - assert response.id == sdk_ref.id - assert response.status == "completed" - assert response.reasoning is not None - assert response.reasoning.effort == "high" - if expect_summary: - assert response.reasoning.summary == reasoning["summary"] - - assert_usage(response.usage, expect_reasoning=True) - - assert len(response.output) >= 2 - - molto_reasoning = next(o for o in response.output if isinstance(o, OpenAIReasoningItem)) - assert molto_reasoning.type == "reasoning" - assert molto_reasoning.id == sdk_ref_rs.id - if expect_summary: - assert len(molto_reasoning.content) >= 1 - assert molto_reasoning.content[0].type == "reasoning_text" - assert len(molto_reasoning.content[0].text) > 0 - else: - assert molto_reasoning.content == [] - - msg_molto = next(o for o in response.output if isinstance(o, OpenAIOutputItem)) - assert msg_molto.type == "message" - assert msg_molto.role == "assistant" - assert msg_molto.status == "completed" - assert msg_molto.id == sdk_ref_msg.id - assert len(msg_molto.content) >= 1 - - text_molto = msg_molto.content[0] - assert isinstance(text_molto, OpenAIOutputTextContent) - assert text_molto.type == "output_text" - assert len(text_molto.text) > 0 diff --git a/old_tests/responses/test_text_config.py b/old_tests/responses/test_text_config.py deleted file mode 100644 index c70eb63..0000000 --- a/old_tests/responses/test_text_config.py +++ /dev/null @@ -1,169 +0,0 @@ -import pytest -from openai.types.responses import ( - Response, - ResponseCompletedEvent, - ResponseOutputMessage, - ResponseOutputText, -) - -from molto.types.openai.responses import ( - OpenAIJsonSchemaFormat, - OpenAIOutputItem, - OpenAIOutputTextContent, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - OpenAITextConfig, - _OpenAIStreamEvent, -) -from molto.utils.io import json_loads -from molto.utils.test import ( - STREAM_PARAMS, - assert_output_item_order, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - -INSTRUCTIONS = "You are patrick jane, a consultant for the CBI" - -STRUCT_SCHEMA = { - "type": "object", - "properties": { - "name": {"type": "string"}, - "job": {"type": "string"}, - }, - "required": ["name", "job"], - "additionalProperties": False, -} - -EXPECTED_NAME = "Patrick Jane" - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_text_config_json_schema(stream: bool, cassette_manager): - """Compare JSON schema output across clients, not request encoding details.""" - - req_body = dict( - model="gpt-4.1-nano", - input=[{"role": "user", "content": "Who are you?"}], - instructions=INSTRUCTIONS, - text={ - "format": { - "type": "json_schema", - "name": "final_result", - "description": "The final response which ends this conversation", - "schema": STRUCT_SCHEMA, - "strict": True, - }, - }, - stream=stream, - ) - - assert_attrs = ["model", "input", "instructions"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseCompletedEvent) - assert sdk_event_types[-1] == "response.completed" - - assert_output_item_order(sdk_events) - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "completed" - - assert sdk_response.text.format.type == "json_schema" - assert sdk_response.text.verbosity == "medium" - - sdk_msg = next(o for o in sdk_response.output if isinstance(o, ResponseOutputMessage)) - assert sdk_msg.status == "completed" - sdk_text = next(c for c in sdk_msg.content if isinstance(c, ResponseOutputText)) - sdk_output = json_loads(sdk_text.text) - assert sdk_output["name"] == EXPECTED_NAME - assert "job" in sdk_output - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - if stream: - sdk_ref = sdk_response - else: - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - - # -- Molto client ---------------------------------------------------- - molto_req_body = dict( - model="gpt-4.1-nano", - input=[{"role": "user", "content": "Who are you?"}], - instructions=INSTRUCTIONS, - text={ - "format": { - "type": "json_schema", - "name": "final_result", - "schema": STRUCT_SCHEMA, - "strict": True, - "description": "The final response which ends this conversation", - } - }, - stream=stream, - ) - - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(molto_req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - assert response.id == sdk_ref.id - assert response.status == "completed" - - assert isinstance(response.text, OpenAITextConfig) - assert response.text.verbosity == "medium" - assert isinstance(response.text.format, OpenAIJsonSchemaFormat) - assert response.text.format.type == "json_schema" - assert response.text.format.name == "final_result" - assert response.text.format.strict is True - for key in ("type", "properties", "required", "additionalProperties"): - assert response.text.format.schema_[key] == STRUCT_SCHEMA[key] - - messages = [o for o in response.output if isinstance(o, OpenAIOutputItem)] - assert len(messages) == 1 - msg = messages[-1] - assert msg.role == "assistant" - assert msg.status == "completed" - text_part = msg.content[0] - assert isinstance(text_part, OpenAIOutputTextContent) - molto_output = json_loads(text_part.text) - assert molto_output["name"] == sdk_output["name"] == EXPECTED_NAME - assert isinstance(molto_output.get("job"), str) and molto_output["job"] - assert isinstance(sdk_output.get("job"), str) and sdk_output["job"] diff --git a/old_tests/responses/test_tool_args.py b/old_tests/responses/test_tool_args.py deleted file mode 100644 index 96df495..0000000 --- a/old_tests/responses/test_tool_args.py +++ /dev/null @@ -1,81 +0,0 @@ -from __future__ import annotations - -from collections.abc import AsyncIterator -from typing import Any - -import pytest - -from molto.types.ir import AgentRunResult, AgentToolCall, AgentToolCalls, OutputIR -from molto.types.openai.responses import OpenAIFunctionToolCall, OpenAIResponsesRequest -from molto.types.openai.responses import from_ir as responses_from_ir - - -def _single_history_tool_call(items: object) -> AgentToolCall: - assert isinstance(items, list) - tool_call_items = [item for item in items if isinstance(item, AgentToolCalls)] - assert len(tool_call_items) == 1 - assert len(tool_call_items[0].tool_calls) == 1 - return tool_call_items[0].tool_calls[0] - - -async def _output_stream(*events: OutputIR) -> AsyncIterator[OutputIR]: - for event in events: - yield event - - -@pytest.mark.parametrize( - ("arguments", "expected_args", "expected_raw_args"), - [ - ('{"city":"Paris"}', {"city": "Paris"}, None), - ("{bad json", {}, "{bad json"), - ('["not","an","object"]', {}, '["not","an","object"]'), - ], -) -def test_history_tool_args_are_safe( - arguments: str, - expected_args: dict[str, Any], - expected_raw_args: str | None, -) -> None: - request = OpenAIResponsesRequest( - model="gpt-test", - input=[ - { - "type": "function_call", - "id": "fc_1", - "call_id": "call_1", - "name": "lookup", - "arguments": arguments, - } - ], - ) - - tool_call = _single_history_tool_call(request.to_ir().input) - - assert tool_call.args == expected_args - assert tool_call.raw_args == expected_raw_args - - -async def test_response_preserves_raw_tool_args() -> None: - ir = OpenAIResponsesRequest(model="gpt-test", input="hello").to_ir() - - response = await responses_from_ir( - ir, - _output_stream( - AgentRunResult( - tool_calls=[ - AgentToolCall( - id="fc_1", - tool_call_id="call_1", - tool_name="lookup", - args={}, - raw_args='["not","an","object"]', - ) - ] - ) - ), - ) - - assert len(response.output) == 1 - tool_call = response.output[0] - assert isinstance(tool_call, OpenAIFunctionToolCall) - assert tool_call.arguments == '["not","an","object"]' diff --git a/old_tests/responses/test_tools.py b/old_tests/responses/test_tools.py deleted file mode 100644 index ccba02e..0000000 --- a/old_tests/responses/test_tools.py +++ /dev/null @@ -1,308 +0,0 @@ -import pytest -from openai.types.responses import ( - Response, - ResponseCompletedEvent, - ResponseFunctionToolCall, - ResponseFunctionWebSearch, - ResponseOutputMessage, -) - -from molto.types.openai.responses import ( - OpenAIFunctionToolCall, - OpenAIResponsesRequest, - OpenAIResponsesResponse, - OpenAIResponsesStream, - OpenAIResponsesStreamOutput, - OpenAIResponsesStreamText, - OpenAIResponsesWebSearchFilters, - OpenAIResponsesWebSearchTool, - OpenAIResponsesWebSearchUserLocation, - OpenAIWebSearchActionSearch, - OpenAIWebSearchToolCall, - _OpenAIStreamEvent, -) -from molto.utils.test import ( - STREAM_PARAMS, - assert_events_before_terminal, - assert_output_item_order, - assert_stream_events_match, - make_molto_client, - make_openai_client, - prepend_model_prefix, - stream_reference_cassette_suffix, -) - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_tool_choice_required(stream: bool, cassette_manager): - """Compare required function-tool output against SDK-parsed cassettes. - - Example: - # stream=False records/replays the default non-stream cassette and returns a function call. - """ - - req_body = dict( - model="gpt-4.1-nano", - input=[{"role": "user", "content": "What number am I thinking of?"}], - tools=[ - { - "type": "function", - "name": "guess_number", - "description": "Guess a number.", - "parameters": { - "type": "object", - "properties": { - "number": {"type": "integer", "description": "The guessed number."}, - }, - "required": ["number"], - "additionalProperties": False, - }, - "strict": True, - }, - ], - tool_choice="required", - stream=stream, - ) - - assert_attrs = ["model", "input", "tool_choice"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseCompletedEvent) - assert sdk_event_types[-1] == "response.completed" - assert "response.function_call_arguments.delta" in sdk_event_types - - assert_output_item_order(sdk_events) - - assert_events_before_terminal(sdk_events, "response.function_call_arguments.delta") - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "completed" - - sdk_fc = next(o for o in sdk_response.output if isinstance(o, ResponseFunctionToolCall)) - assert isinstance(sdk_fc.name, str) and len(sdk_fc.name) > 0 - assert isinstance(sdk_fc.id, str) and len(sdk_fc.id) > 0 - assert isinstance(sdk_fc.call_id, str) and len(sdk_fc.call_id) > 0 - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - sdk_ref_fc = next(o for o in sdk_ref.output if isinstance(o, ResponseFunctionToolCall)) - - # -- Molto client ---------------------------------------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert OpenAIResponsesStreamText in {type(e) for e in events} - assert "response.function_call_arguments.delta" in event_types - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - assert_output_item_order(events) - - assert_stream_events_match(ref_events, events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - - fc = next(o for o in response.output if isinstance(o, OpenAIFunctionToolCall)) - assert fc.name == sdk_ref_fc.name - assert response.id == sdk_ref.id - assert fc.id == sdk_ref_fc.id - assert fc.call_id == sdk_ref_fc.call_id - - -EXPECTED_WEB_SEARCH_TOOL = { - "type": "web_search", - "search_context_size": "high", - "filters": { - "allowed_domains": ["wikipedia.org", "example.com"], - }, - "user_location": { - "type": "approximate", - "city": "San Francisco", - "country": "US", - "region": "California", - "timezone": "America/Los_Angeles", - }, -} - - -@pytest.mark.parametrize("stream", **STREAM_PARAMS) -async def test_native_tools_web_search(stream: bool, cassette_manager): - """Verify native web-search tool parity against SDK-parsed cassettes. - - Example: - # stream=True records/replays the default stream cassette and yields a web_search_call. - """ - - req_body = dict( - model="gpt-5-nano", - input=[{"role": "user", "content": "Hello!"}], - tool_choice="required", - tools=[EXPECTED_WEB_SEARCH_TOOL], - include=["reasoning.encrypted_content"], - stream=stream, - ) - - assert_attrs = ["model", "input", "tool_choice"] - - # -- OpenAI SDK (parametrized stream) -------------------------------- - sdk_client = make_openai_client( - cassette_manager, - expected_request_body=req_body, - assert_attrs=assert_attrs, - ) - sdk_response = await sdk_client.responses.create(**req_body) - if stream: - sdk_events = [e async for e in sdk_response] - sdk_event_types = [e.type for e in sdk_events] - assert isinstance(sdk_events[-1], ResponseCompletedEvent) - assert sdk_event_types[-1] == "response.completed" - - assert_output_item_order(sdk_events) - - sdk_response = sdk_events[-1].response - assert isinstance(sdk_response, Response) - assert sdk_response.status == "completed" - - # Validate the SDK parsed the tool configuration from the cassette - sdk_tools = sdk_response.tools - assert isinstance(sdk_tools, list) and len(sdk_tools) == 1 - sdk_tool = sdk_tools[0] - assert sdk_tool.type == EXPECTED_WEB_SEARCH_TOOL["type"] - assert sdk_tool.search_context_size == EXPECTED_WEB_SEARCH_TOOL["search_context_size"] - assert ( - sdk_tool.filters.allowed_domains == EXPECTED_WEB_SEARCH_TOOL["filters"]["allowed_domains"] - ) - sdk_loc = sdk_tool.user_location - assert sdk_loc.city == EXPECTED_WEB_SEARCH_TOOL["user_location"]["city"] - assert sdk_loc.country == EXPECTED_WEB_SEARCH_TOOL["user_location"]["country"] - assert sdk_loc.region == EXPECTED_WEB_SEARCH_TOOL["user_location"]["region"] - - sdk_ws = next(o for o in sdk_response.output if isinstance(o, ResponseFunctionWebSearch)) - assert sdk_ws.type == "web_search_call" - assert sdk_ws.status == "completed" - assert isinstance(sdk_ws.id, str) and len(sdk_ws.id) > 0 - - stream_ref_suffix = stream_reference_cassette_suffix(stream) - - # -- Stream SDK reference (matches Molto's internal streaming) ------- - stream_req_body = {**req_body, "stream": True} - ref_client = make_openai_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - ref_events = [e async for e in await ref_client.responses.create(**stream_req_body)] - assert isinstance(ref_events[-1], ResponseCompletedEvent) - sdk_ref = ref_events[-1].response - sdk_ref_ws = next(o for o in sdk_ref.output if isinstance(o, ResponseFunctionWebSearch)) - sdk_ref_msg = next(o for o in sdk_ref.output if isinstance(o, ResponseOutputMessage)) - - # -- Molto client ---------------------------------------------------- - client = make_molto_client( - cassette_manager, - cassette_suffix=stream_ref_suffix, - expected_request_body=stream_req_body, - assert_attrs=assert_attrs, - ) - response = await client.chat(OpenAIResponsesRequest(**prepend_model_prefix(req_body))) - if stream: - events: list[_OpenAIStreamEvent] = [r async for r in response] - event_types = [e.type for e in events] - assert isinstance(events[-1], OpenAIResponsesStream) - assert event_types[-1] == "response.completed" - - ws_done = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamOutput) - and e.type == "response.output_item.done" - and isinstance(e.item, OpenAIWebSearchToolCall) - ] - assert len(ws_done) == 1 - assert ws_done[0].item.status == "completed" - assert ws_done[0].item.id == sdk_ref_ws.id - - assert_output_item_order(events) - - assert_stream_events_match(ref_events, events) - - response = events[-1].response - assert isinstance(response, OpenAIResponsesResponse) - assert response.id == sdk_ref.id - assert isinstance(response.output, list) - - molto_ws_items = [o for o in response.output if isinstance(o, OpenAIWebSearchToolCall)] - assert len(molto_ws_items) == 1 - molto_ws = molto_ws_items[0] - assert molto_ws.type == "web_search_call" - assert molto_ws.status == "completed" - assert molto_ws.id == sdk_ref_ws.id - - assert isinstance(molto_ws.action, OpenAIWebSearchActionSearch) - assert molto_ws.action.type == "search" - assert isinstance(molto_ws.action.query, str) - assert len(molto_ws.action.query) > 0 - assert isinstance(molto_ws.action.queries, list) - assert len(molto_ws.action.queries) >= 1 - assert all(isinstance(q, str) and len(q) > 0 for q in molto_ws.action.queries) - assert molto_ws.action.sources is None - - assert len(response.tools) == 1 - molto_tool = response.tools[0] - assert isinstance(molto_tool, OpenAIResponsesWebSearchTool) - assert molto_tool.type == EXPECTED_WEB_SEARCH_TOOL["type"] - assert molto_tool.search_context_size == EXPECTED_WEB_SEARCH_TOOL["search_context_size"] - - assert isinstance(molto_tool.filters, OpenAIResponsesWebSearchFilters) - assert ( - molto_tool.filters.allowed_domains - == EXPECTED_WEB_SEARCH_TOOL["filters"]["allowed_domains"] - ) - - assert isinstance(molto_tool.user_location, OpenAIResponsesWebSearchUserLocation) - assert molto_tool.user_location.type == EXPECTED_WEB_SEARCH_TOOL["user_location"]["type"] - assert molto_tool.user_location.city == EXPECTED_WEB_SEARCH_TOOL["user_location"]["city"] - assert molto_tool.user_location.country == EXPECTED_WEB_SEARCH_TOOL["user_location"]["country"] - assert molto_tool.user_location.region == EXPECTED_WEB_SEARCH_TOOL["user_location"]["region"] - assert ( - str(molto_tool.user_location.timezone) - == EXPECTED_WEB_SEARCH_TOOL["user_location"]["timezone"] - ) - - assistant_msgs = [o for o in response.output if getattr(o, "type", None) == "message"] - assert len(assistant_msgs) == 1 - assert assistant_msgs[0].id == sdk_ref_msg.id - assert assistant_msgs[0].role == "assistant" - assert assistant_msgs[0].status == "completed" - assert len(assistant_msgs[0].content) >= 1 - assert len(assistant_msgs[0].content[0].text) > 0 diff --git a/old_tests/test_cassette_manager.py b/old_tests/test_cassette_manager.py deleted file mode 100644 index 207ac7b..0000000 --- a/old_tests/test_cassette_manager.py +++ /dev/null @@ -1,306 +0,0 @@ -from pathlib import Path -from types import SimpleNamespace - -import httpx -import pytest - -from molto.utils.test import ( - OpenAICassetteManager, - OpenAICassetteTransport, - make_openai_client, - sanitize_request_body, - sanitize_test_name, -) - - -def _manager(tmp_path: Path, node_name: str = "test_demo[stream]") -> OpenAICassetteManager: - """Create a cassette manager rooted in pytest's temporary directory. - - Example: - manager = _manager(tmp_path, "test_reasoning[stream]") - manager.node_slug - # "test_reasoning-stream" - """ - return OpenAICassetteManager( - node_name=node_name, - node_id=f"tests/test_demo.py::{node_name}", - module_name="test_demo", - record=False, - root=tmp_path, - ) - - -@pytest.mark.parametrize( - ("name", "expected"), - [ - ("test_reasoning[stream]", "test_reasoning-stream"), - ( - "test_reasoning[stream-reasoning_no_summary]", - "test_reasoning-stream-reasoning_no_summary", - ), - ], -) -def test_cassette_slugging(name: str, expected: str) -> None: - """Preserve pytest parameter IDs while making safe filenames. - - Example: - sanitize_test_name("test_reasoning[stream]") - # "test_reasoning-stream" - """ - assert sanitize_test_name(name) == expected - - -def test_manager_node_slug_uses_sanitized_node_name(tmp_path: Path) -> None: - """Expose the sanitized pytest node name without a test-prefixed manager method. - - Example: - _manager(tmp_path, "test_reasoning[stream]").node_slug - # "test_reasoning-stream" - """ - manager = _manager(tmp_path, "test_reasoning[stream]") - - assert manager.node_slug == "test_reasoning-stream" - - -def test_cassette_path_uses_optional_cassette_suffix(tmp_path: Path) -> None: - """Build the planned cassette path layout from manager metadata. - - Example: - manager.cassette_path("responses") - # tmp_path/openai/responses/test_demo/test_demo-stream.yaml - """ - manager = _manager(tmp_path) - - assert manager.cassette_path("responses") == ( - tmp_path / "openai" / "responses" / "test_demo" / "test_demo-stream.yaml" - ) - assert manager.cassette_path("responses", "sse") == ( - tmp_path / "openai" / "responses" / "test_demo" / "test_demo-stream-sse.yaml" - ) - - -def test_manager_from_pytest_request_anchors_root_to_pytest_root(tmp_path: Path) -> None: - """Resolve cassettes from pytest's root instead of the shell working directory.""" - request = SimpleNamespace( - node=SimpleNamespace( - name="test_demo[stream]", - nodeid="tests/test_demo.py::test_demo[stream]", - path=tmp_path / "tests" / "test_demo.py", - ), - config=SimpleNamespace(rootpath=tmp_path), - ) - - manager = OpenAICassetteManager.from_pytest_request(request, record=False) - - assert manager.root == tmp_path / "tests" / "cassettes" - - -def test_missing_cassette_error_includes_record_command(tmp_path: Path) -> None: - """Report missing playback cassettes with path, node id, and record command. - - Example: - manager.read(Path("missing.yaml")) - # raises AssertionError containing "pytest --record-cassettes" - """ - manager = _manager(tmp_path) - path = manager.cassette_path("responses") - - with pytest.raises(AssertionError) as exc_info: - manager.read(path) - - message = str(exc_info.value) - assert str(path) in message - assert manager.node_id in message - assert f"pytest --record-cassettes {manager.node_id}" in message - - -def test_openai_client_reports_missing_cassette_before_request(tmp_path: Path) -> None: - """Fail with the cassette hint before the OpenAI SDK can wrap the error.""" - manager = _manager(tmp_path) - path = manager.cassette_path("responses") - - with pytest.raises(AssertionError) as exc_info: - make_openai_client(manager) - - message = str(exc_info.value) - assert "Missing OpenAI cassette." in message - assert str(path) in message - assert f"pytest --record-cassettes {manager.node_id}" in message - - -def test_secret_scrubbing_recurses_through_request_body() -> None: - """Scrub secret-looking request fields without changing normal fields. - - Example: - sanitize_request_body({"api_key": "sk", "model": "gpt-4.1"}) - # {"api_key": "***", "model": "gpt-4.1"} - """ - body = { - "model": "gpt-4.1", - "api_key": "sk-test", - "nested": {"refresh_token": "token", "keep": "value"}, - "items": [{"secret": "hide", "content": "show"}], - } - - assert sanitize_request_body(body) == { - "model": "gpt-4.1", - "api_key": "***", - "nested": {"refresh_token": "***", "keep": "value"}, - "items": [{"secret": "***", "content": "show"}], - } - - -async def test_non_stream_playback_returns_json_body(tmp_path: Path) -> None: - """Replay a non-stream cassette as a JSON httpx response. - - Example: - await client.post("/v1/responses", json={"stream": False}) - # response.json() == {"id": "resp_test", "status": "completed"} - """ - manager = _manager(tmp_path, "test_json[non-stream]") - manager.write( - manager.cassette_path("responses"), - { - "request": { - "method": "POST", - "path": "/v1/responses", - "query_params": {}, - "headers": {"content-type": "application/json"}, - "body": {"stream": False}, - }, - "response": { - "status_code": 200, - "headers": {"content-type": "application/json"}, - "body": {"id": "resp_test", "status": "completed"}, - }, - }, - ) - client = httpx.AsyncClient( - transport=OpenAICassetteTransport(manager, cassette_suffix=None), - base_url="https://api.openai.com", - ) - - response = await client.post("/v1/responses", json={"stream": False}) - - assert response.status_code == 200 - assert response.json() == {"id": "resp_test", "status": "completed"} - - -async def test_playback_rejects_explicit_request_defaults(tmp_path: Path) -> None: - """Reject replay when the request serializes fields absent from the cassette.""" - manager = _manager(tmp_path, "test_json[adapter-defaults]") - manager.write( - manager.cassette_path("responses"), - { - "request": { - "method": "POST", - "path": "/v1/responses", - "query_params": {}, - "headers": {"content-type": "application/json"}, - "body": {"model": "gpt-4.1", "input": "hi", "stream": True}, - }, - "response": { - "status_code": 200, - "headers": {"content-type": "application/json"}, - "body": {"id": "resp_test", "status": "completed"}, - }, - }, - ) - client = httpx.AsyncClient( - transport=OpenAICassetteTransport(manager, cassette_suffix=None), - base_url="https://api.openai.com", - ) - - with pytest.raises(AssertionError, match="OpenAI cassette request mismatch"): - await client.post( - "/v1/responses", - json={ - "model": "gpt-4.1", - "input": [{"role": "user", "content": "hi"}], - "parallel_tool_calls": True, - "service_tier": "default", - "store": True, - "stream": True, - "tool_choice": "auto", - "truncation": "disabled", - }, - ) - - -async def test_playback_rejects_request_mismatch(tmp_path: Path) -> None: - """Reject replay when the actual request differs from the recorded request.""" - manager = _manager(tmp_path, "test_json[mismatch]") - path = manager.cassette_path("responses") - manager.write( - path, - { - "request": { - "method": "POST", - "path": "/v1/responses", - "query_params": {}, - "headers": {"content-type": "application/json"}, - "body": {"model": "gpt-4.1", "stream": False}, - }, - "response": { - "status_code": 200, - "headers": {"content-type": "application/json"}, - "body": {"id": "resp_test", "status": "completed"}, - }, - }, - ) - client = httpx.AsyncClient( - transport=OpenAICassetteTransport(manager, cassette_suffix=None), - base_url="https://api.openai.com", - ) - - with pytest.raises(AssertionError) as exc_info: - await client.put( - "/v1/responses/other?different=1", - headers={"content-type": "application/vnd.openai.test+json"}, - json={"model": "wrong"}, - ) - - message = str(exc_info.value) - assert "OpenAI cassette request mismatch." in message - assert str(path) in message - assert manager.node_id in message - for field_name in ("method", "path", "query_params", "body", "headers"): - assert field_name in message - - -async def test_streaming_sse_playback_returns_event_stream(tmp_path: Path) -> None: - """Replay an SSE cassette as text/event-stream content. - - Example: - await client.post("/v1/responses", json={"stream": True}) - # response.text has one data frame followed by a blank line. - """ - manager = _manager(tmp_path, "test_json[stream]") - sse_lines = ['data: {"type":"response.created"}\n', "\n"] - manager.write( - manager.cassette_path("responses"), - { - "request": { - "method": "POST", - "path": "/v1/responses", - "query_params": {}, - "headers": {"content-type": "application/json"}, - "body": {"stream": True}, - }, - "response": { - "status_code": 200, - "headers": {"content-type": "text/event-stream; charset=utf-8"}, - "sse": sse_lines, - }, - }, - ) - client = httpx.AsyncClient( - transport=OpenAICassetteTransport(manager, cassette_suffix=None), - base_url="https://api.openai.com", - ) - - response = await client.post("/v1/responses", json={"stream": True}) - - assert response.status_code == 200 - assert response.headers["content-type"] == "text/event-stream; charset=utf-8" - assert response.text == "".join(sse_lines) diff --git a/pyproject.toml b/pyproject.toml index 542c058..899dcf2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,11 +85,9 @@ dependencies = [ "loguru~=0.7", "openai>=2.45.0,<3.2", "orjson~=3.11", - "pycountry~=26.2.16", "pydantic-ai-slim[retries]~=1.104.0", - "pydantic-extra-types~=2.11.1", "pydantic-settings~=2.13.1", - "pydantic[email,timezone]>=2.12.5", + "pydantic>=2.12.5", "uuid-utils~=0.14.1", ] dynamic = ["version"] diff --git a/python/ARCHITECTURE.md b/python/ARCHITECTURE.md index 9664a86..b999202 100644 --- a/python/ARCHITECTURE.md +++ b/python/ARCHITECTURE.md @@ -433,6 +433,8 @@ An absent vLLM key resolves to the fixed non-secret `EMPTY` credential. OpenAI o The SDK owns request serialization, authentication, HTTP, SSE decoding, terminal markers, retries, error types, and native model construction for both protocols. Recognized errors on every route follow the [error translation](../docs/errors.md) contract; unknown SDK errors pass through unchanged. Before directly yielding a Responses completion event, Molto narrowly normalizes the compatible-provider omission where `cache_write_tokens` is `None` to `0`. +Translated clients build one validated upstream-native request model and pass it directly to native transport. Serialization at the SDK boundary retains the request models' unset/`None` exclusions; native passthrough keeps its original validated request. + SDK streams are context-managed, including when iteration ends early. The short-lived SDK wrapper is not closed because doing so would close Molto's injected HTTP client; `Molto.aclose()` owns that client's lifetime. Adapters do not perform HTTP requests; they use `httpx` only to construct the compatibility response required to project local credential failures as SDK authentication errors. Closure propagates through the complete translated pipeline: adapter wrappers close the projector and its normalized input, client wrappers close the normalizer, and normalizers context-manage their native iterators. This releases the SDK response deterministically on collection failure, cancellation, or explicit early closure without closing the shared HTTP client. @@ -475,6 +477,8 @@ Parity differs by path: - Chat Completions to Responses compares reconstructible Responses events and validates event ordering, sequence numbers, generated IDs, and function-call identity; - Responses to Chat Completions compares ordered text, reasoning, and function-argument deltas, finish state, and semantic usage without requiring unavailable fingerprints or identical usage-chunk placement. +Matched public-route conversations carry actual returned SDK output cumulatively into subsequent requests. Test-side SDK collection and explicit input-shape conversion remain independent of Molto's translators and collectors; saved requests supply only new user input/tool results and per-turn settings. History is checked before sending, and outgoing upstream requests remain independently compared. Cache scenarios use separate prefix-changing requests. See the [continuation checks and intentional fixture corrections](../tests/cassettes/README.md#actual-output-continuation). + ## Current limitations and extension path The current public paths support native and translated streaming and non-streaming responses for text, portable image input, raw reasoning, reasoning summaries between Responses and Messages, and client-defined function tools. Routes through Chat Completions currently support only unsigned raw reasoning. Function-tool support includes definitions, selection, parallel-call control, successful results, conversation history, and streamed JSON arguments. Hosted and server tools, failed-result semantics outside Messages, other multimodal content, and additional provider capabilities are not complete yet. The matched Responses/Messages fixtures also map the reconstructible opaque reasoning snapshots under the assumption that OpenAI serves both endpoints; opaque state is not portable across providers, the implementation does not enforce its issuer, and the separately recorded terminal Responses ciphertext is not byte-reconstructible through Messages. diff --git a/python/CONVENTIONS.md b/python/CONVENTIONS.md index 0a8394f..5d3581a 100644 --- a/python/CONVENTIONS.md +++ b/python/CONVENTIONS.md @@ -178,6 +178,8 @@ Prefer semantic normalized types over SDK parameter types. Any SDK type retained Read [`tests/cassettes/README.md`](../tests/cassettes/README.md) before adding or updating cassette fixtures. It distinguishes faithful provider recordings from deliberately edited matched cassettes and documents the encrypted-reasoning exception. +If recorded fields fail validation against the pinned SDK, follow the [SDK schema mismatch rule](../tests/cassettes/README.md#sdk-schema-mismatches): request a fresh developer recording and report the affected verification as pending. Do not introduce compatibility defaults or weaken validation solely to make an existing cassette pass. + Matched cross-protocol cassettes use: ```text diff --git a/python/molto/types/base.py b/python/molto/types/base.py index 99bc8d3..9913c33 100644 --- a/python/molto/types/base.py +++ b/python/molto/types/base.py @@ -20,23 +20,8 @@ class ExcludeNoneModel(BaseModel): from_attributes=True, ) - def model_dump_populated(self, *args: Any, **kwargs: Any) -> dict[str, Any]: - """Serialize only populated fields.""" - return super().model_dump( - *args, - **kwargs, - exclude_unset=True, - exclude_none=True, - mode="json", - ) - def model_dump(self, *args: Any, **kwargs: Any) -> dict[str, Any]: - """ - Serialize only populated fields. - - If possible, use `model_dump_populated` instead. - This serves as a fallback. - """ + """Serialize populated fields as JSON-compatible values by default.""" kwargs.setdefault("exclude_unset", True) kwargs.setdefault("exclude_none", True) kwargs.setdefault("mode", "json") diff --git a/python/molto/types/normalized.py b/python/molto/types/normalized.py index 581b2f6..58b0da7 100644 --- a/python/molto/types/normalized.py +++ b/python/molto/types/normalized.py @@ -101,117 +101,6 @@ class UserInput(StrictModel): ] = "user-input" -# class _FileUrlInput(ExtraModel): -# """Common fields for URL-based user content.""" - -# url: Annotated[str, Field(description="The URL of the file.")] -# vendor_metadata: Annotated[ -# dict[str, Any] | None, -# Field(description="Vendor-specific metadata for the file."), -# ] = None -# media_type: Annotated[ -# str | None, -# Field(description="The media type of the file."), -# ] = None -# identifier: Annotated[ -# str | None, -# Field(description="An optional identifier for the file."), -# ] = None - - -# class ImageUrl(_FileUrl): -# """An image referenced by URL.""" - -# content_type: Annotated[ -# Literal["image-url"], -# Field(description="Content type identifier as a discriminator."), -# ] = "image-url" - - -# class AudioUrl(_FileUrl): -# """An audio file referenced by URL.""" - -# content_type: Annotated[ -# Literal["audio-url"], -# Field(description="Content type identifier as a discriminator."), -# ] = "audio-url" - - -# class DocumentUrl(_FileUrl): -# """A document referenced by URL.""" - -# content_type: Annotated[ -# Literal["document-url"], -# Field(description="Content type identifier as a discriminator."), -# ] = "document-url" - - -# class VideoUrl(_FileUrl): -# """A video referenced by URL.""" - -# content_type: Annotated[ -# Literal["video-url"], -# Field(description="Content type identifier as a discriminator."), -# ] = "video-url" - - -# class BinaryInput(ExtraModel): -# """Binary user content.""" - -# data: Annotated[bytes, Field(description="The binary file data.")] -# media_type: Annotated[str, Field(description="The media type of the binary data.")] -# vendor_metadata: Annotated[ -# dict[str, Any] | None, -# Field(description="Vendor-specific metadata for the file."), -# ] = None -# identifier: Annotated[ -# str | None, -# Field(description="An optional identifier for the file."), -# ] = None -# content_type: Annotated[ -# Literal["binary"], -# Field(description="Content type identifier as a discriminator."), -# ] = "binary" - - -# UploadedFileProviderName: TypeAlias = Literal[ -# "anthropic", -# "openai", -# "google", -# "google-cloud", -# "google-gla", -# "google-vertex", -# "bedrock", -# "xai", -# ] - - -# class UploadedFileInput(ExtraModel): -# """A reference to a provider-uploaded file.""" - -# file_id: Annotated[str, Field(description="The provider-specific file identifier.")] -# provider_name: Annotated[ -# UploadedFileProviderName, -# Field(description="The provider that owns the file."), -# ] -# vendor_metadata: Annotated[ -# dict[str, Any] | None, -# Field(description="Vendor-specific metadata for the file."), -# ] = None -# media_type: Annotated[ -# str | None, -# Field(description="The media type of the file."), -# ] = None -# identifier: Annotated[ -# str | None, -# Field(description="An optional identifier for the file."), -# ] = None -# content_type: Annotated[ -# Literal["uploaded-file"], -# Field(description="Content type identifier as a discriminator."), -# ] = "uploaded-file" - - class ToolReturn(StrictModel): """Tool return parts.""" diff --git a/python/molto/upstream/anthropic.py b/python/molto/upstream/anthropic.py index e2fab59..bd7ec17 100644 --- a/python/molto/upstream/anthropic.py +++ b/python/molto/upstream/anthropic.py @@ -482,12 +482,12 @@ def flush_tool_results() -> None: return system, messages, has_thinking @classmethod - def _request_body( + def _native_request( cls, request: NormalizedRequest, *, capabilities: ProviderCapabilities | None = None, - ) -> dict[str, Any]: + ) -> AnthropicMessagesCreateRequest: cls._validate_request(request) system, messages, has_thinking = cls._request_parts(request, capabilities=capabilities) body: dict[str, Any] = { @@ -514,7 +514,7 @@ def _request_body( if request.top_p is not None: body["top_p"] = request.top_p try: - return AnthropicMessagesCreateRequest.model_validate(body).model_dump() + return AnthropicMessagesCreateRequest.model_validate(body) except ValidationError as error: raise UnsupportedInput(str(error)) from error @@ -587,9 +587,7 @@ def start_part( part_indices[source_index] = len(part_indices) return PartStartEvent(index=part_indices[source_index], part=part) - native_request = AnthropicMessagesCreateRequest.model_validate( - self._request_body(request, capabilities=self._capabilities) - ) + native_request = self._native_request(request, capabilities=self._capabilities) async with aclosing(self.native_events(native_request)) as native_events: async for event in native_events: if isinstance(event, RawMessageStartEvent): diff --git a/python/molto/upstream/openai.py b/python/molto/upstream/openai.py index 37c3edc..c43132b 100644 --- a/python/molto/upstream/openai.py +++ b/python/molto/upstream/openai.py @@ -487,7 +487,7 @@ def _process_input(request: NormalizedRequest) -> list[dict[str, Any]] | None: return items @classmethod - def _request_body(cls, request: NormalizedRequest) -> dict[str, Any]: + def _native_request(cls, request: NormalizedRequest) -> OpenAIResponsesCreateRequest: body: dict[str, Any] = { "input": cls._process_input(request), "model": request.model, @@ -515,12 +515,12 @@ def _request_body(cls, request: NormalizedRequest) -> dict[str, Any]: body["stream_options"] = request.stream_options.model_dump(exclude={"extra_fields"}) body.update(_prompt_cache_fields(request)) try: - return OpenAIResponsesCreateRequest.model_validate(body).model_dump() + return OpenAIResponsesCreateRequest.model_validate(body) except ValidationError as error: raise UnsupportedInput(str(error)) from error async def _events(self, request: NormalizedRequest) -> AsyncIterator[ModelResponseStreamEvent]: - native_request = OpenAIResponsesCreateRequest.model_validate(self._request_body(request)) + native_request = self._native_request(request) # Only a reasoning item whose `added` snapshot is completely empty (no # content, summary, or encrypted state) is deferred: if nothing ever # arrives, its part lifecycle is omitted from the IR entirely. An item @@ -970,7 +970,7 @@ def flush_deferred_images() -> None: return messages @classmethod - def _request_body(cls, request: NormalizedRequest) -> dict[str, Any]: + def _native_request(cls, request: NormalizedRequest) -> OpenAIChatCompletionsCreateRequest: cls._validate_request(request) stream_options: dict[str, Any] = {} if request.stream: @@ -1006,7 +1006,7 @@ def _request_body(cls, request: NormalizedRequest) -> dict[str, Any]: body["top_p"] = request.top_p body.update(_prompt_cache_fields(request)) try: - return OpenAIChatCompletionsCreateRequest.model_validate(body).model_dump() + return OpenAIChatCompletionsCreateRequest.model_validate(body) except ValidationError as error: raise UnsupportedInput(str(error)) from error @@ -1069,9 +1069,7 @@ def end_tool_call(tool_call_index: int) -> PartEndEvent: ), ) - native_request = OpenAIChatCompletionsCreateRequest.model_validate( - self._request_body(request) - ) + native_request = self._native_request(request) async with aclosing(self.native_events(native_request)) as native_events: async for chunk in native_events: if response_metadata is None: diff --git a/python/molto/utils/__init__.py b/python/molto/utils/__init__.py index 400f542..e69de29 100644 --- a/python/molto/utils/__init__.py +++ b/python/molto/utils/__init__.py @@ -1,45 +0,0 @@ -from typing import Any - -from uuid_utils import uuid7 as _uuid7 - - -def get_non_empty(mapping: dict[str, Any], key: str, default: Any): - value = mapping.get(key, None) - return value if value else default - - -def uuid7_str(prefix: str = "") -> str: - return f"{prefix}{_uuid7()}" - - -def mask_string(x: str | None, *, include_len: bool = True) -> str | None: - if x is None or x == "": - return x - str_len = len(x) - if str_len < 4: - return f"{'*' * str_len} ({str_len=})" - visible_len = min(100, str_len // 5) - x = f"{x[:visible_len]}***{x[-visible_len:]}" - return f"{x} ({str_len=})" if include_len else x - - -def mask_content(x: str | list | dict | Any) -> str | list | dict | None: - if isinstance(x, str): - return mask_string(x) - if isinstance(x, list): - return [mask_content(v) for v in x] - if isinstance(x, dict): - return {k: mask_content(v) for k, v in x.items()} - return None - - -def merge_dict(d: dict | Any, update: dict | Any): - if isinstance(d, dict) and isinstance(update, dict): - for k, v in update.items(): - d[k] = merge_dict(d.get(k, {}), v) - return d - return update - - -def mask_dict(value: dict[str, str | Any]) -> dict[str, str]: - return {k: "***" if v else v for k, v in value.items()} diff --git a/python/molto/utils/io.py b/python/molto/utils/io.py index b393ce7..1762661 100644 --- a/python/molto/utils/io.py +++ b/python/molto/utils/io.py @@ -1,95 +1,11 @@ -import pickle from typing import Any import orjson import yaml -from httpx import AsyncClient, HTTPStatusError, Response from pydantic import BaseModel -from pydantic_ai.retries import AsyncTenacityTransport, RetryConfig, wait_retry_after -from tenacity import retry_if_exception_type, stop_after_attempt, wait_exponential from molto.utils.types import JSONInput, JSONOutput -DOC_WHITE_LIST = { - "application/pdf": [".pdf"], - "application/xml": [".xml"], - "application/json": [".json"], - "application/jsonl": [".jsonl"], - "application/x-ndjson": [".jsonl"], - "application/json-lines": [".jsonl"], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [".docx"], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [".pptx"], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [".xlsx"], - "text/markdown": [".md"], - "text/plain": [".txt"], - "text/html": [".html"], - "text/tab-separated-values": [".tsv"], - "text/csv": [".csv"], - "text/xml": [".xml"], -} -IMAGE_WHITE_LIST = { - "image/jpeg": [".jpg", ".jpeg"], - "image/png": [".png"], - "image/gif": [".gif"], - "image/webp": [".webp"], -} -AUDIO_WHITE_LIST = { - "audio/mpeg": [".mp3"], - "audio/wav": [".wav"], - "audio/x-wav": [".wav"], - "audio/x-pn-wav": [".wav"], - "audio/wave": [".wav"], - "audio/vnd.wav": [".wav"], - "audio/vnd.wave": [".wav"], -} -UPLOAD_WHITE_LIST = {**DOC_WHITE_LIST, **IMAGE_WHITE_LIST, **AUDIO_WHITE_LIST} -UPLOAD_WHITE_LIST_MIME = set(UPLOAD_WHITE_LIST.keys()) -# Use the first MIME for each extension -MIME_WHITE_LIST = {**DOC_WHITE_LIST, **IMAGE_WHITE_LIST, **AUDIO_WHITE_LIST} -EXT_TO_MIME = {} -for mime, exts in MIME_WHITE_LIST.items(): - for ext in exts: - EXT_TO_MIME[ext] = EXT_TO_MIME.get(ext, mime) - - -def load_pickle(file_path: str): - with open(file_path, "rb") as f: - return pickle.load(f) - - -def dump_pickle(out_path: str, obj: Any): - with open(out_path, "wb") as f: - pickle.dump(obj, f) - - -def read_json(path: str) -> JSONOutput: - """Reads a JSON file. - - Args: - path (str): Path to the file. - - Returns: - data (JSONOutput): The data. - """ - with open(path, "r") as f: - return orjson.loads(f.read()) - - -def dump_json(data: JSONInput, path: str, **kwargs) -> str: - """Writes a JSON file. - - Args: - data (JSONInput): The data. - path (str): Path to the file. - **kwargs: Other keyword arguments to pass into `orjson.dumps`. - - Returns: - path (str): Path to the file. - """ - with open(path, "wb") as f: - f.write(orjson.dumps(data, **kwargs)) - return path - def json_loads(data: str) -> JSONOutput: return orjson.loads(data) @@ -154,52 +70,3 @@ def dumps_sse(data: BaseModel | dict[str, Any], event_type: str = "") -> str: return f"event: {event_type}\ndata: {data_json}\n\n" else: return f"data: {data_json}\n\n" - - -def truncate_utf8(text: str, *, max_bytes: int = 50 * 1024) -> str: - encoded = text.encode("utf-8") - if len(encoded) <= max_bytes: - return text - return encoded[:max_bytes].decode("utf-8", errors="ignore") + "\n\n(Output truncated.)" - - -def _should_retry_status(response: Response) -> None: - """Raise exceptions for retryable HTTP status codes.""" - if response.status_code in (429, 502, 503, 504): - response.raise_for_status() # This will raise HTTPStatusError - - -def get_async_client( - *, - timeout: float = 30.0, - follow_redirects: bool = False, # Prevent redirect-based SSRF - max_redirects: int = 0, - retry_config: RetryConfig | None = None, -) -> AsyncClient: - if retry_config is None: - retry_config = RetryConfig( - # Retry on HTTP errors and connection issues - retry=retry_if_exception_type((HTTPStatusError, ConnectionError)), - # Smart waiting: respects Retry-After headers, falls back to exponential backoff - wait=wait_retry_after( - fallback_strategy=wait_exponential(multiplier=1, max=60), - max_wait=300, - ), - # Stop after 5 attempts - stop=stop_after_attempt(5), - # Re-raise the last exception if all retries fail - reraise=True, - ) - client = AsyncClient( - timeout=timeout, - follow_redirects=follow_redirects, - max_redirects=max_redirects, - transport=AsyncTenacityTransport( - config=retry_config, - validate_response=_should_retry_status, - ), - ) - return client - - -HTTP_ACLIENT = get_async_client() diff --git a/python/molto/utils/test.py b/python/molto/utils/test.py index 6ba8c80..805a6ff 100644 --- a/python/molto/utils/test.py +++ b/python/molto/utils/test.py @@ -1,17 +1,7 @@ from __future__ import annotations -import re -from copy import deepcopy -from dataclasses import dataclass, field -from pathlib import Path from typing import Any -import httpx -import yaml -from openai import AsyncOpenAI - -from molto import Molto -from molto.configs import ENV_CONFIG from molto.types.anthropic_messages import AnthropicMessagesStreamEventAdapter from molto.types.openai_chat_completions import ( OpenAIChatCompletionsCreateRequest, @@ -21,12 +11,11 @@ OpenAIResponsesCreateRequest, OpenAIResponsesStreamEventAdapter, ) -from molto.utils.io import json_loads, load_sse, read_yaml - -STREAM_PARAMS = dict(argvalues=[True, False], ids=["stream", "non-stream"]) +from molto.utils.io import load_sse _RECONSTRUCTIBLE_RESPONSE_FIELDS = { "id", + "incomplete_details", "model", "object", "output", @@ -146,6 +135,8 @@ def reconstructable_responses_event( for key, value in response.items() if key in request.model_fields_set or key in _RECONSTRUCTIBLE_RESPONSE_FIELDS } + # SDK responses may omit this optional field when there is no incomplete reason. + response.setdefault("incomplete_details", None) reasoning = response.get("reasoning") if isinstance(reasoning, dict): # Chat exposes reasoning effort, but not Responses context, mode, or summary. @@ -184,854 +175,3 @@ def reconstructable_anthropic_event(sse: str) -> dict[str, Any]: elif event["type"] == "message_delta": event["delta"].pop("stop_details", None) return event - - -def stream_reference_cassette_suffix(stream: bool) -> str | None: - """Return the extra cassette suffix for Molto/internal streaming references. - - Example: - stream_reference_cassette_suffix(False) - # "sse" - """ - return None if stream else "sse" - - -CASSETTE_DIR = Path("tests/cassettes") - -RECORDED_HEADERS = { - "accept", - "accept-encoding", - "authorization", - "cache-control", - "connection", - "content-length", - "content-type", - "user-agent", - "x-run-id", -} - -# These headers affect how OpenAI interprets the request and are stable across -# the SDK and Molto clients. Other recorded headers are useful diagnostics but -# include credentials, SDK versions, or transport-computed values. -MATCHED_REQUEST_HEADERS = { - "content-type", -} - -EXCLUDED_PLAYBACK_HEADERS = { - "content-encoding", - "content-length", - "transfer-encoding", -} - -SECRET_REQUEST_KEYS = { - "api_key", - "authorization", - "client_secret", - "password", - "secret", - "access_token", - "refresh_token", - "id_token", -} - - -def sanitize_test_name(name: str) -> str: - """Return the stable filesystem slug for a pytest node name. - - Example: - sanitize_test_name("test_reasoning[stream-reasoning_no_summary]") - # "test_reasoning-stream-reasoning_no_summary" - """ - slug = name.replace("[", "-").replace("]", "") - slug = re.sub(r"[^A-Za-z0-9_.-]+", "-", slug) - slug = re.sub(r"-+", "-", slug).strip("-") - return slug or "test" - - -def openai_endpoint_from_path(path: str) -> str: - """Map an OpenAI request path to the cassette endpoint directory. - - Example: - openai_endpoint_from_path("/v1/chat/completions") - # "chat_completions" - """ - clean_path = path.strip("/") - if clean_path.startswith("v1/"): - clean_path = clean_path[len("v1/") :] - if clean_path.startswith("chat/completions"): - return "chat_completions" - return (clean_path.split("/", 1)[0] or "unknown").replace("-", "_") - - -def mask_authorization(value: str) -> str: - """Mask an Authorization header value before writing a cassette. - - Example: - mask_authorization("Bearer sk-test") - # "Bearer ***" - """ - if not value: - return value - if value.lower().startswith("bearer "): - return "Bearer ***" - return "***" - - -def sanitize_headers(headers: httpx.Headers) -> dict[str, str]: - """Filter headers to deterministic, shareable cassette metadata. - - Example: - sanitize_headers(httpx.Headers({"authorization": "Bearer sk-test", "x-no": "1"})) - # {"authorization": "Bearer ***"} - """ - filtered: dict[str, str] = {} - for key, value in sorted(headers.items(), key=lambda item: item[0].lower()): - lower_key = key.lower() - if lower_key not in RECORDED_HEADERS: - continue - filtered[key] = mask_authorization(value) if lower_key == "authorization" else value - return filtered - - -def sanitize_request_body(body: Any) -> Any: - """Recursively scrub secret-looking request fields before recording. - - Example: - sanitize_request_body({"model": "gpt-4.1", "api_key": "sk-test"}) - # {"model": "gpt-4.1", "api_key": "***"} - """ - if isinstance(body, dict): - scrubbed: dict[str, Any] = {} - for key, value in body.items(): - key_lower = str(key).lower() - if key_lower in SECRET_REQUEST_KEYS or key_lower.endswith("_api_key"): - scrubbed[key] = "***" - else: - scrubbed[key] = sanitize_request_body(value) - return scrubbed - if isinstance(body, list): - return [sanitize_request_body(item) for item in body] - return body - - -def _request_snapshot(request: httpx.Request, body: Any) -> dict[str, Any]: - """Return the sanitized request fields persisted in and matched against cassettes.""" - return { - "method": request.method, - "path": _request_path(request), - "query_params": _request_query_params(request), - "headers": sanitize_headers(request.headers), - "body": sanitize_request_body(body), - } - - -def _matched_headers(headers: dict[str, str]) -> dict[str, str]: - """Return stable, semantically relevant request headers for replay matching.""" - return { - key.lower(): value - for key, value in headers.items() - if key.lower() in MATCHED_REQUEST_HEADERS - } - - -def _playback_headers(headers: dict[str, str]) -> dict[str, str]: - """Remove transport-managed headers before replaying a response. - - Example: - _playback_headers({"content-type": "application/json", "content-length": "10"}) - # {"content-type": "application/json"} - """ - return {k: v for k, v in headers.items() if k.lower() not in EXCLUDED_PLAYBACK_HEADERS} - - -def _parse_request_body(body: bytes) -> Any: - """Parse an HTTP JSON request body, returning an empty dict for no body. - - Example: - _parse_request_body(b'{"stream": true}') - # {"stream": True} - """ - if not body: - return {} - return json_loads(body) - - -def _decode_response_body(body: bytes, headers: httpx.Headers) -> Any: - """Decode a recorded response body according to its content type. - - Example: - _decode_response_body(b'{"ok": true}', httpx.Headers({"content-type": "application/json"})) - # {"ok": True} - """ - content_type = headers.get("content-type", "") - if "application/json" not in content_type: - return body.decode("utf-8") - return json_loads(body) - - -def _body_to_sse_lines(body: bytes) -> list[str]: - """Split a streamed response body into newline-preserving SSE lines. - - Example: - _body_to_sse_lines(b'data: {"type":"response.created"}\n\n') - # ['data: {"type":"response.created"}\n', '\n'] - """ - text = body.decode("utf-8") - return [f"{line}\n" for line in text.splitlines()] - - -def _request_path(request: httpx.Request) -> str: - """Return a request path with a leading slash. - - Example: - _request_path(httpx.Request("POST", "https://api.openai.com/v1/responses")) - # "/v1/responses" - """ - path = request.url.path - return path if path.startswith("/") else f"/{path}" - - -def _request_query_params(request: httpx.Request) -> dict[str, str]: - """Return request query parameters as cassette metadata. - - Example: - _request_query_params(httpx.Request("GET", "https://example.test/a?limit=1")) - # {"limit": "1"} - """ - return dict(request.url.params.multi_items()) - - -def _is_stream_request(body: Any) -> bool: - """Return whether a parsed request body asks OpenAI for streaming. - - Example: - _is_stream_request({"stream": True}) - # True - """ - return isinstance(body, dict) and body.get("stream") is True - - -@dataclass -class OpenAICassetteManager: - """Resolve and persist per-test OpenAI SDK cassettes. - - Example: - manager = OpenAICassetteManager("test_demo[stream]", "tests/test_demo.py::test_demo[stream]", "test_demo", False) - manager.cassette_path("responses") - # Path("tests/cassettes/openai/responses/test_demo/test_demo-stream.yaml") - """ - - node_name: str - node_id: str - module_name: str - record: bool - root: Path = CASSETTE_DIR - recorded_paths: set[Path] = field(default_factory=set) - - @classmethod - def from_pytest_request(cls, request: Any, *, record: bool) -> "OpenAICassetteManager": - """Build a manager from pytest's fixture request object. - - Example: - # For node name "test_demo[stream]" in tests/test_demo.py: - OpenAICassetteManager.from_pytest_request(request, record=False).module_name - # "test_demo" - """ - node_path = getattr(request.node, "path", None) - module_name = Path(str(node_path)).stem if node_path is not None else "unknown_module" - root = Path(str(request.config.rootpath)) / CASSETTE_DIR - return cls( - node_name=request.node.name, - node_id=request.node.nodeid, - module_name=sanitize_test_name(module_name), - record=record, - root=root, - ) - - @property - def node_slug(self) -> str: - """Return the sanitized test name used in cassette filenames. - - Example: - OpenAICassetteManager("test_a[one two]", "id", "mod", False).node_slug - # "test_a-one-two" - """ - return sanitize_test_name(self.node_name) - - def cassette_path(self, endpoint: str, cassette_suffix: str | None = None) -> Path: - """Return the cassette path for an endpoint and optional filename suffix. - - Example: - manager = OpenAICassetteManager("test_a[stream]", "id", "test_a", False) - manager.cassette_path("responses") - # Path("tests/cassettes/openai/responses/test_a/test_a-stream.yaml") - """ - if cassette_suffix is None: - filename = f"{self.node_slug}.yaml" - else: - suffix_slug = sanitize_test_name(cassette_suffix) - filename = f"{self.node_slug}-{suffix_slug}.yaml" - return self.root / "openai" / endpoint / self.module_name / filename - - def path_for_request(self, request: httpx.Request, cassette_suffix: str | None) -> Path: - """Return the cassette path for an outgoing OpenAI request. - - Example: - manager = OpenAICassetteManager("test_a", "id", "test_a", False) - request = httpx.Request("POST", "https://api.openai.com/v1/responses") - manager.path_for_request(request, None) - # Path("tests/cassettes/openai/responses/test_a/test_a.yaml") - """ - endpoint = openai_endpoint_from_path(_request_path(request)) - return self.cassette_path(endpoint, cassette_suffix) - - def read(self, path: Path) -> dict[str, Any]: - """Read a YAML cassette or raise a recording hint if it is missing. - - Example: - # manager.read(Path("missing.yaml")) raises an AssertionError containing: - # "pytest --record-cassettes tests/test_demo.py::test_demo" - """ - if not path.exists(): - raise AssertionError(self.missing_cassette_message(path)) - data = read_yaml(path) - assert isinstance(data, dict), f"Invalid cassette payload at {path}" - return data - - def write(self, path: Path, cassette: dict[str, Any]) -> None: - """Write a cassette with stable YAML ordering and remember it for replay. - - Example: - manager.write(Path("tests/cassettes/openai/responses/test_a/test_a-stream.yaml"), {"request": {}, "response": {}}) - # path is written and added to manager.recorded_paths - """ - path.parent.mkdir(parents=True, exist_ok=True) - with open(path, "w", encoding="utf-8") as f: - yaml.safe_dump( - cassette, - f, - allow_unicode=True, - default_flow_style=False, - sort_keys=False, - ) - self.recorded_paths.add(path) - - def missing_cassette_message(self, path: Path) -> str: - """Return the actionable error shown when playback has no cassette. - - Example: - manager = OpenAICassetteManager("test_a", "tests/test_a.py::test_a", "test_a", False) - "pytest --record-cassettes tests/test_a.py::test_a" in manager.missing_cassette_message(Path("x.yaml")) - # True - """ - return "\n".join( - [ - "Missing OpenAI cassette.", - f"path: {path}", - f"pytest node id: {self.node_id}", - f"record with: pytest --record-cassettes {self.node_id}", - ] - ) - - -class OpenAICassetteTransport(httpx.AsyncBaseTransport): - """httpx transport that replays or records one cassette filename suffix. - - Example: - manager = OpenAICassetteManager("test_a", "id", "test_a", False) - transport = OpenAICassetteTransport(manager, cassette_suffix="sse", playback_only=True) - transport.cassette_suffix - # "sse" - """ - - def __init__( - self, - cassette_manager: OpenAICassetteManager, - *, - cassette_suffix: str | None = None, - playback_only: bool = False, - expected_request_body: dict[str, Any] | None = None, - assert_attrs: list[str] | None = None, - ) -> None: - """Initialize transport state for one cassette suffix. - - Example: - manager = OpenAICassetteManager("test_a", "id", "test_a", False) - OpenAICassetteTransport(manager, cassette_suffix=None).cassette_suffix - # None - """ - self.cassette_manager = cassette_manager - self.cassette_suffix = cassette_suffix - self.playback_only = playback_only - self.expected_request_body = expected_request_body - self.assert_attrs = assert_attrs or [] - self._real_transport = None - if cassette_manager.record and not playback_only: - self._real_transport = httpx.AsyncHTTPTransport() - - async def handle_async_request(self, request: httpx.Request) -> httpx.Response: - """Handle an SDK request by replaying or recording the configured cassette suffix. - - Example: - # In playback mode, POST /v1/responses with cassette_suffix "sse" reads: - # tests/cassettes/openai/responses//-sse.yaml - """ - body_bytes = await request.aread() - request_body = _parse_request_body(body_bytes) - self._assert_expected_request(request_body) - - path = self.cassette_manager.path_for_request(request, self.cassette_suffix) - if self._should_replay(path): - return self._response_from_cassette(request, request_body, path) - return await self._record_response(request, body_bytes, request_body, path) - - async def aclose(self) -> None: - """Close the underlying live transport when recording used one. - - Example: - # After await transport.aclose(), any owned AsyncHTTPTransport is closed. - """ - if self._real_transport is not None: - await self._real_transport.aclose() - - def _assert_expected_request(self, request_body: Any) -> None: - """Assert selected JSON request fields match the expected request. - - Example: - transport.expected_request_body = {"model": "gpt-4.1"} - transport.assert_attrs = ["model"] - transport._assert_expected_request({"model": "gpt-4.1"}) - # None - """ - if not self.expected_request_body: - return - - attrs = list(self.assert_attrs) - if "stream" in self.expected_request_body and "stream" not in attrs: - attrs.append("stream") - if not attrs: - return - - assert isinstance(request_body, dict), "Expected JSON object request body" - for attr in attrs: - assert request_body.get(attr) == self.expected_request_body[attr], ( - f"Expected {attr} to be {self.expected_request_body[attr]!r}, " - f"got {request_body.get(attr)!r}" - ) - - def _should_replay(self, path: Path) -> bool: - """Return whether this request should use an existing cassette. - - Example: - transport = OpenAICassetteTransport(manager, cassette_suffix="sse", playback_only=True) - transport._should_replay(Path("missing.yaml")) - # True - """ - if self.playback_only or not self.cassette_manager.record: - return True - return path in self.cassette_manager.recorded_paths - - def _assert_request_matches_cassette( - self, - request: httpx.Request, - request_body: Any, - path: Path, - cassette: dict[str, Any], - ) -> None: - """Fail with a field-level diff when replay traffic differs from its cassette.""" - recorded = cassette.get("request") - assert isinstance(recorded, dict), f"Invalid cassette request at {path}" - - actual = _request_snapshot(request, request_body) - differences: list[str] = [] - for field_name in ("method", "path", "query_params", "body"): - expected_value = recorded.get(field_name) - actual_value = actual[field_name] - if actual_value != expected_value: - differences.append( - f"{field_name}: recorded={expected_value!r}, actual={actual_value!r}" - ) - - recorded_headers = recorded.get("headers") or {} - assert isinstance(recorded_headers, dict), f"Invalid cassette request headers at {path}" - expected_headers = _matched_headers(recorded_headers) - actual_headers = _matched_headers(actual["headers"]) - if actual_headers != expected_headers: - differences.append( - f"headers: recorded={expected_headers!r}, actual={actual_headers!r}" - ) - - assert not differences, "\n".join( - [ - "OpenAI cassette request mismatch.", - f"path: {path}", - f"pytest node id: {self.cassette_manager.node_id}", - *differences, - ] - ) - - def _response_from_cassette( - self, - request: httpx.Request, - request_body: Any, - path: Path, - ) -> httpx.Response: - """Convert a stored cassette into an httpx response for SDK parsing. - - Example: - # A cassette response with an "sse" list replays as text/event-stream. - """ - cassette = self.cassette_manager.read(path) - self._assert_request_matches_cassette(request, request_body, path, cassette) - response = cassette["response"] - status_code = response["status_code"] - headers = _playback_headers(response.get("headers") or {}) - - if "sse" in response: - headers.setdefault("content-type", "text/event-stream; charset=utf-8") - return httpx.Response( - status_code, - content="".join(response["sse"]).encode("utf-8"), - headers=headers, - request=request, - ) - - body = response.get("body") - if isinstance(body, str): - return httpx.Response( - status_code, - content=body.encode("utf-8"), - headers=headers, - request=request, - ) - return httpx.Response(status_code, json=body, headers=headers, request=request) - - async def _record_response( - self, - request: httpx.Request, - body_bytes: bytes, - request_body: Any, - path: Path, - ) -> httpx.Response: - """Forward a request to OpenAI, write a sanitized cassette, and return it. - - Example: - # A request body {"stream": True} records response["sse"]. - # A request body {"stream": False} records response["body"]. - """ - assert self._real_transport is not None - real_request = httpx.Request( - request.method, - request.url, - headers=request.headers, - content=body_bytes, - extensions=request.extensions, - ) - response = await self._real_transport.handle_async_request(real_request) - response_body = await response.aread() - response_headers = sanitize_headers(response.headers) - - cassette: dict[str, Any] = { - "request": _request_snapshot(request, request_body), - "response": { - "status_code": response.status_code, - "headers": response_headers, - }, - } - - if _is_stream_request(request_body) and response.status_code == 200: - cassette["response"]["sse"] = _body_to_sse_lines(response_body) - else: - cassette["response"]["body"] = _decode_response_body(response_body, response.headers) - - self.cassette_manager.write(path, cassette) - return httpx.Response( - response.status_code, - content=response_body, - headers=_playback_headers(dict(response.headers)), - request=request, - ) - - -def assert_usage( - usage: Any, *, output_tokens_exact: int | None = None, expect_reasoning: bool = False -) -> None: - """Assert that a usage object has positive token counts and consistent totals. - - Args: - usage: Object with "input_tokens", "output_tokens", and - "total_tokens" attributes (e.g. an OpenAI CompletionUsage). - output_tokens_exact: If provided, asserts the output token count - equals this value exactly. - expect_reasoning: If True, also asserts that - "output_tokens_details.reasoning_tokens" is present and positive. - """ - assert usage.input_tokens > 0 - assert usage.output_tokens > 0 - assert usage.total_tokens == usage.input_tokens + usage.output_tokens - if output_tokens_exact is not None: - assert usage.output_tokens == output_tokens_exact - if expect_reasoning: - assert usage.output_tokens_details is not None - assert usage.output_tokens_details.reasoning_tokens > 0 - - -def assert_stream_text_events(events: list[Any]) -> None: - """Assert the structure of streamed text events. - - For each unique assistant message ID, validates that there is exactly one - "output_item.added" and one "output_item.done", at least one - "output_text.delta", and at least one "output_text.done" referencing that - item ID. - - Args: - events: Collected stream event objects from a Molto.chat() call. - """ - from molto.types.openai.responses import ( - OpenAIResponsesStreamOutput, - OpenAIResponsesStreamText, - ) - - msg_item_added = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamOutput) - and e.type == "response.output_item.added" - and hasattr(e.item, "role") - and e.item.role == "assistant" - ] - msg_item_done = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamOutput) - and e.type == "response.output_item.done" - and hasattr(e.item, "role") - and e.item.role == "assistant" - ] - assert len(msg_item_added) >= 1 - assert len(msg_item_done) >= 1 - added_ids = [e.item.id for e in msg_item_added] - done_ids = [e.item.id for e in msg_item_done] - for aid in added_ids: - assert aid is not None - assert aid.startswith("msg_") - assert added_ids == done_ids - - for msg_id in added_ids: - deltas = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamText) - and e.type == "response.output_text.delta" - and e.item_id == msg_id - ] - assert len(deltas) >= 1 - - done = [ - e - for e in events - if isinstance(e, OpenAIResponsesStreamText) - and e.type == "response.output_text.done" - and e.item_id == msg_id - ] - assert len(done) == 1, f"expected 1 text_done for item {msg_id!r}, got {len(done)}" - - assert_events_before_terminal(events, "response.output_text.delta") - - -def assert_events_before_terminal(events: list[Any], event_type: str) -> None: - """Assert all events of "event_type" appear before the terminal stream event.""" - indices = [i for i, event in enumerate(events) if event.type == event_type] - assert all(i < len(events) - 1 for i in indices) - - -# TODO: Add a code interpreter stream parity test once a cassette is available. -_SDK_TYPE_MAP: dict[str, str] = { - "response.reasoning_summary_text.delta": "response.reasoning.delta", - "response.reasoning_summary_text.done": "response.reasoning.done", -} - -# field -> event types that carry it (used for 1:1 payload comparison) -_FIELD_CHECKS: dict[str, frozenset[str]] = { - "item_id": frozenset( - { - "response.output_text.delta", - "response.output_text.done", - "response.function_call_arguments.delta", - "response.function_call_arguments.done", - "response.reasoning.delta", - "response.reasoning.done", - "response.content_part.added", - "response.content_part.done", - "response.reasoning_summary_part.added", - "response.reasoning_summary_part.done", - "response.web_search_call.in_progress", - "response.web_search_call.searching", - "response.web_search_call.completed", - "response.code_interpreter_call.in_progress", - "response.code_interpreter_call.interpreting", - "response.code_interpreter_call.completed", - "response.code_interpreter_call_code.delta", - "response.code_interpreter_call_code.done", - } - ), - "delta": frozenset( - { - "response.output_text.delta", - "response.function_call_arguments.delta", - "response.reasoning.delta", - } - ), - "text": frozenset({"response.output_text.done", "response.reasoning.done"}), - "arguments": frozenset({"response.function_call_arguments.done"}), -} - - -def _normalize_sdk_event_type(event_type: str) -> str: - """Return the Molto/OpenResponses event type matching an SDK event type.""" - return _SDK_TYPE_MAP.get(event_type, event_type) - - -def _normalized_event_types(events: list[Any]) -> list[str]: - """Return event types after applying SDK-to-Molto naming compatibility.""" - return [_normalize_sdk_event_type(e.type) for e in events] - - -def _assert_event_type_sequence_matches(sdk_events: list[Any], molto_events: list[Any]) -> None: - sdk_types = _normalized_event_types(sdk_events) - molto_types = [e.type for e in molto_events] - assert sdk_types == molto_types, ( - f"Event type sequence mismatch\nSDK: {sdk_types}\nMolto: {molto_types}" - ) - - -def _assert_matching_scalar_fields(event_type: str, sdk_event: Any, molto_event: Any) -> None: - for field_name, event_types in _FIELD_CHECKS.items(): - if event_type in event_types: - assert getattr(sdk_event, field_name, None) == getattr( - molto_event, field_name, None - ), f"{field_name} mismatch at {event_type}" - - -def _assert_matching_output_item(event_type: str, sdk_event: Any, molto_event: Any) -> None: - if event_type not in {"response.output_item.added", "response.output_item.done"}: - return - - sdk_item = getattr(sdk_event, "item", None) - molto_item = getattr(molto_event, "item", None) - if sdk_item is None or molto_item is None: - return - - assert sdk_item.id == molto_item.id, f"item.id mismatch at {event_type}" - assert sdk_item.type == molto_item.type, f"item.type mismatch at {event_type}" - - -def _assert_matching_terminal_response_id( - event_type: str, sdk_event: Any, molto_event: Any -) -> None: - if event_type not in {"response.completed", "response.incomplete"}: - return - - # Only compare response.id for terminal events: Molto uses a provisional UUID - # for response.created/in_progress that will not match the cassette ID. - sdk_response_id = getattr(getattr(sdk_event, "response", None), "id", None) - if sdk_response_id is not None: - molto_response_id = getattr(getattr(molto_event, "response", None), "id", None) - assert sdk_response_id == molto_response_id, f"response.id mismatch at {event_type}" - - -def assert_output_item_order(events: list[Any]) -> None: - """Assert every output_item.added event precedes its corresponding output_item.done.""" - added_indices = [i for i, e in enumerate(events) if e.type == "response.output_item.added"] - done_indices = [i for i, e in enumerate(events) if e.type == "response.output_item.done"] - assert len(added_indices) == len(done_indices) - assert all(added_indices[i] < done_indices[i] for i in range(len(added_indices))) - - -def assert_stream_events_match(sdk_events: list[Any], molto_events: list[Any]) -> None: - """Assert SDK and Molto stream events have the same order and key payloads.""" - _assert_event_type_sequence_matches(sdk_events, molto_events) - - for sdk_event, molto_event in zip(sdk_events, molto_events, strict=True): - event_type = _normalize_sdk_event_type(sdk_event.type) - _assert_matching_scalar_fields(event_type, sdk_event, molto_event) - _assert_matching_output_item(event_type, sdk_event, molto_event) - _assert_matching_terminal_response_id(event_type, sdk_event, molto_event) - - -def make_openai_client( - cassette_manager: OpenAICassetteManager, - *, - cassette_suffix: str | None = None, - cassette_endpoint: str = "responses", - expected_request_body: dict[str, Any] | None = None, - assert_attrs: list[str] | None = None, - api_key: str | None = None, -) -> AsyncOpenAI: - """Create an AsyncOpenAI client backed by cassette replay/recording. - - Example: - client = make_openai_client(manager) - client.max_retries - # 0 - """ - if not cassette_manager.record: - cassette_manager.read(cassette_manager.cassette_path(cassette_endpoint, cassette_suffix)) - - resolved_api_key = ENV_CONFIG.openai_api_key_plain if api_key is None else api_key - if cassette_manager.record and api_key is None and not resolved_api_key: - raise RuntimeError("OPENAI_API_KEY is required when recording cassettes") - if not resolved_api_key and not cassette_manager.record: - resolved_api_key = "test-api-key" - return AsyncOpenAI( - http_client=httpx.AsyncClient( - transport=OpenAICassetteTransport( - cassette_manager, - cassette_suffix=cassette_suffix, - expected_request_body=expected_request_body, - assert_attrs=assert_attrs, - ), - ), - api_key=resolved_api_key, - max_retries=0, - ) - - -def make_molto_client( - cassette_manager: OpenAICassetteManager, - *, - cassette_suffix: str | None = None, - expected_request_body: dict[str, Any] | None = None, - assert_attrs: list[str] | None = None, -) -> Molto: - """Create a Molto instance backed by playback-only cassette transport. - - Example: - molto = make_molto_client(manager, cassette_suffix="sse") - isinstance(molto, Molto) - # True - """ - return Molto( - http_client=httpx.AsyncClient( - transport=OpenAICassetteTransport( - cassette_manager, - cassette_suffix=cassette_suffix, - playback_only=True, - expected_request_body=expected_request_body, - assert_attrs=assert_attrs, - ), - ), - ) - - -def prepend_model_prefix(body: dict[str, Any], prefix: str = "openai/") -> dict[str, Any]: - """Return a shallow copy of "body" with the model field prefixed. - - Example:: - - prepend_model_prefix({"model": "gpt-4o", ...}) - # {"model": "openai/gpt-4o", ...} - """ - copy_body = deepcopy(body) - copy_body["model"] = prefix + copy_body["model"] - return copy_body diff --git a/python/molto/utils/types.py b/python/molto/utils/types.py index bffd034..c3a1cc3 100644 --- a/python/molto/utils/types.py +++ b/python/molto/utils/types.py @@ -1,315 +1,6 @@ -import argparse -import unicodedata from collections import OrderedDict -from datetime import date as _date -from datetime import datetime as _datetime -from datetime import timezone -from enum import Enum -from functools import partial -from pathlib import Path -from typing import Annotated, Any, Callable, Dict, List, Tuple, Type, TypeVar, Union +from typing import Any -from pydantic import AfterValidator, BaseModel, BeforeValidator, Field -from pydantic.types import AwareDatetime -from pydantic_extra_types.country import _index_by_alpha2 as iso_3166 -from pydantic_extra_types.language_code import _index_by_alpha2 as iso_639 - -# from vtol.configs import ENV_CONFIG - -# fmt: off -FilePath = Union[str, Path] -# Superficial JSON input/output types -# https://github.com/python/typing/issues/182#issuecomment-186684288 -JSONOutput = Union[str, int, float, bool, None, Dict[str, Any], List[Any]] -JSONOutputBin = Union[bytes, str, int, float, bool, None, Dict[str, Any], List[Any]] -# For input, we also accept tuples, ordered dicts etc. -JSONInput = Union[str, int, float, bool, None, Dict[str, Any], List[Any], Tuple[Any, ...], OrderedDict] -JSONInputBin = Union[bytes, str, int, float, bool, None, Dict[str, Any], List[Any], Tuple[Any, ...], OrderedDict] -YAMLInput = JSONInput -YAMLOutput = JSONOutput -# fmt: on - - -### --- Datetime Validator --- ### - - -# def _datetime_to_str(value: Any) -> Any: -# if isinstance(value, datetime): -# return value.isoformat() -# return value - - -# No longer used, but kept for reference -# ISO_8601_UTC = Annotated[ -# str, BeforeValidator(_datetime_to_str), AfterValidator(utc_iso_from_string) -# ] - - -def _to_utc(d: AwareDatetime) -> AwareDatetime: - return d.astimezone(timezone.utc) - - -DatetimeUTC = Annotated[AwareDatetime, AfterValidator(_to_utc)] -DatetimeNaiveUTC = Annotated[_datetime, AfterValidator(_to_utc)] - - -def _to_date(value: _date | _datetime) -> _date: - if isinstance(value, _datetime): - return value.date() - if isinstance(value, _date): - return value - raise ValueError("Value cannot be converted to date.") - - -DateUTC = Annotated[_date, AfterValidator(_to_date)] - -### --- String Validator --- ### - - -def _is_bad_char(char: str, *, allow_newline: bool) -> bool: - """ - Checks if a character is disallowed. - """ - # 1. Handle newlines based on the flag - if char == "\n": - return not allow_newline # Bad if newlines are NOT allowed - - # 2. Check for other non-printable characters (like tabs, control codes) - # str.isprintable() is False for all non-printing chars except space. - if not char.isprintable(): - return True - - # 3. Check for specific disallowed Unicode categories and blocks - # Box drawing - if "\u2500" <= char <= "\u257f": - return True - # Block elements - if "\u2580" <= char <= "\u259f": - return True - # Braille patterns - if "\u2800" <= char <= "\u28ff": - return True - - return False - - -def _str_pre_validator( - value: Any, *, disallow_empty_string: bool = False, allow_newline: bool = False -) -> str: - if not isinstance(value, str): - value = str(value) - value = value.strip() - if disallow_empty_string and len(value) == 0: - raise ValueError("Text is empty.") - - # Reject excessive consecutive combining marks (Zalgo text) while - # preserving valid scripts (Thai, Arabic, Hindi, Vietnamese, etc.) - consecutive = 0 - for char in value: - if unicodedata.category(char).startswith("M"): - consecutive += 1 - if consecutive > 6: - raise ValueError("Text contains excessive combining marks.") - else: - consecutive = 0 - - if any(_is_bad_char(char, allow_newline=allow_newline) for char in value): - raise ValueError("Text contains disallowed or non-printable characters.") - return value - - -SanitisedStr = Annotated[ - str, - BeforeValidator(_str_pre_validator), - # Cannot use Field here due to conflict with SQLModel -] -SanitisedMultilineStr = Annotated[ - str, - BeforeValidator(partial(_str_pre_validator, disallow_empty_string=False, allow_newline=True)), - # Cannot use Field here due to conflict with SQLModel -] -SanitisedNonEmptyStr = Annotated[ - str, - BeforeValidator(partial(_str_pre_validator, disallow_empty_string=True)), - # Cannot use Field here due to conflict with SQLModel -] -SanitisedNonEmptyMultilineStr = Annotated[ - str, - BeforeValidator(partial(_str_pre_validator, disallow_empty_string=True, allow_newline=True)), - # Cannot use Field here due to conflict with SQLModel -] - - -def _none_to_zero(v: int | None) -> int: - if v is None: - return 0 - return v - - -ZeroIfNoneInt = Annotated[int, BeforeValidator(_none_to_zero)] -PositiveNonZeroInt = Annotated[int, Field(gt=0, description="Positive non-zero integer.")] - - -def _none_to_empty_string(v: str | None) -> str: - if v is None: - return "" - return v - - -EmptyIfNoneStr = Annotated[str, BeforeValidator(_none_to_empty_string)] - - -### --- Language Code Validator --- ### - - -WILDCARD_LANG_CODES = {"*", "mul"} -DEFAULT_MUL_LANGUAGES = [ - # ChatGPT supported languages - # "sq", # Albanian - # "am", # Amharic - # "ar", # Arabic - # "hy", # Armenian - # "bn", # Bengali - # "bs", # Bosnian - # "bg", # Bulgarian - # "my", # Burmese - # "ca", # Catalan - "zh", # Chinese - # "hr", # Croatian - # "cs", # Czech - # "da", # Danish - # "nl", # Dutch - "en", # English - # "et", # Estonian - # "fi", # Finnish - "fr", # French - # "ka", # Georgian - # "de", # German - # "el", # Greek - # "gu", # Gujarati - # "hi", # Hindi - # "hu", # Hungarian - # "is", # Icelandic - # "id", # Indonesian - "it", # Italian - "ja", # Japanese - # "kn", # Kannada - # "kk", # Kazakh - "ko", # Korean - # "lv", # Latvian - # "lt", # Lithuanian - # "mk", # Macedonian - # "ms", # Malay - # "ml", # Malayalam - # "mr", # Marathi - # "mn", # Mongolian - # "no", # Norwegian - # "fa", # Persian - # "pl", # Polish - # "pt", # Portuguese - # "pa", # Punjabi - # "ro", # Romanian - # "ru", # Russian - # "sr", # Serbian - # "sk", # Slovak - # "sl", # Slovenian - # "so", # Somali - "es", # Spanish - # "sw", # Swahili - # "sv", # Swedish - # "tl", # Tagalog - # "ta", # Tamil - # "te", # Telugu - # "th", # Thai - # "tr", # Turkish - # "uk", # Ukrainian - # "ur", # Urdu - # "vi", # Vietnamese -] - - -def _validate_lang(s: str) -> str: - try: - code = s.split("-") - lang = code[0] - lang = lang.lower().strip() - if lang not in iso_639(): - raise ValueError - if len(code) == 2: - country = code[1] - country = country.upper().strip() - if country not in iso_3166(): - raise ValueError - return f"{lang}-{country}" - elif len(code) == 1: - return lang - else: - raise ValueError - except Exception as e: - raise ValueError( - f'Language code "{s}" is not ISO 639-1 alpha-2 or BCP-47 ([ISO 639-1 alpha-2]-[ISO 3166-1 alpha-2]).' - ) from e - - -def _validate_lang_list(s: list[str]) -> list[str]: - s = {lang.strip() for lang in s} - if len(s & WILDCARD_LANG_CODES) > 0: - s = list((s - WILDCARD_LANG_CODES) | set(DEFAULT_MUL_LANGUAGES)) - return [_validate_lang(lang) for lang in s] - - -LanguageCodeList = Annotated[list[str], AfterValidator(_validate_lang_list)] - - -### --- Enum Validator --- ### - -E = TypeVar("E", bound=Enum) - - -def get_enum_validator(enum_cls: Type[E]) -> Callable[[str], E]: - def _validator(v: str) -> E: - try: - return enum_cls[v] - except KeyError: - return enum_cls(v) - - return _validator - - -### --- Pydantic Model Validator --- ### - -# M = TypeVar("M", bound=BaseModel) - - -# def get_pydantic_validator(model_cls: Type[M]) -> Callable[[dict[str, Any] | M], M]: -# def _validator(v: dict[str, Any] | M) -> M: -# return model_cls.model_validate(v) - -# return _validator - - -class CLI(BaseModel): - @classmethod - def parse_args(cls) -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - ) - for field_name, field_info in cls.model_fields.items(): - field_type = field_info.annotation - default = field_info.default - description = field_info.description or "" - if field_type is bool: - parser.add_argument( - f"--{field_name}", - action="store_true", - help=description, - ) - else: - parser.add_argument( - f"--{field_name}", - type=field_type, - default=default, - required=default is ..., - help=description, - ) - return cls(**vars(parser.parse_args())) +# Superficial JSON types; inputs also accept tuples and ordered mappings. +JSONOutput = str | int | float | bool | None | dict[str, Any] | list[Any] +JSONInput = JSONOutput | tuple[Any, ...] | OrderedDict diff --git a/scripts/match_openai_cassette_events.py b/scripts/match_openai_cassette_events.py index 8681cfd..cb6782d 100644 --- a/scripts/match_openai_cassette_events.py +++ b/scripts/match_openai_cassette_events.py @@ -10,6 +10,8 @@ including the response ID, creation time, model, target-default service tier, tool calls, and usage. Cache requests also copy the canonical cache options, keys, retention, and content-part breakpoints without changing their prefix boundaries. +Tool-result images move to user messages after the complete tool-response block, +preserving their source order and the portable call IDs in their labels. Matched reasoning requests carry the canonical Responses effort as `reasoning_effort`. When a continuation contains reasoning history but omits a @@ -128,6 +130,7 @@ def _chat_messages_from_response_input(response_input: Any) -> list[dict[str, An raise ValueError("Responses input must be a string or an input-item list.") messages: list[dict[str, Any]] = [] + deferred_image_messages: list[dict[str, Any]] = [] tool_call_ids: set[str] = set() returned_tool_call_ids: set[str] = set() for item in response_input: @@ -135,6 +138,9 @@ def _chat_messages_from_response_input(response_input: Any) -> list[dict[str, An raise ValueError("Responses input items must be objects.") item_type = item.get("type", "message") + if item_type != "function_call_output": + messages.extend(deferred_image_messages) + deferred_image_messages.clear() if item_type == "reasoning": messages.append( { @@ -175,9 +181,53 @@ def _chat_messages_from_response_input(response_input: Any) -> list[dict[str, An raise ValueError(f"Responses function call output has unknown ID: {call_id!r}.") if call_id in returned_tool_call_ids: raise ValueError(f"Duplicate Responses function call output ID: {call_id!r}.") + image_content: list[dict[str, Any]] = [] + if isinstance(output, list): + text_content = [] + for part in output: + if not isinstance(part, dict) or part.get("type") != "input_image": + text_content.append(part) + continue + image_url = part.get("image_url") + if not isinstance(image_url, str): + raise ValueError("Responses image content requires an image_url string.") + mapped_url = {"url": image_url} + if part.get("detail") is not None: + if part["detail"] not in {"auto", "low", "high"}: + raise ValueError( + "Responses image detail cannot map to Chat Completions." + ) + mapped_url["detail"] = part["detail"] + image_content.append({"type": "image_url", "image_url": mapped_url}) + content = _response_message_content(text_content, preserve_parts=True) + else: + content = _response_message_content(output, preserve_parts=True) + if (deferred_image_messages or image_content) and _has_cache_breakpoint(output): + raise ValueError("Tool-result image relocation cannot preserve cache breakpoints.") + if image_content: + content.append( + { + "type": "text", + "text": ( + f"The image result of tool call {call_id!r} will be " + "attached as user prompt after all tool responses." + ), + } + ) + # Chat tool messages cannot carry images, and every parallel + # result must precede any user message containing those images. + deferred_image_messages.append( + { + "role": "user", + "content": [ + {"type": "text", "text": f"Image returned by tool call {call_id!r}:"}, + *image_content, + ], + } + ) messages.append( { - "content": _response_message_content(output, preserve_parts=True), + "content": content, "role": "tool", "tool_call_id": call_id, } @@ -205,6 +255,7 @@ def _chat_messages_from_response_input(response_input: Any) -> list[dict[str, An messages[-1].update(message) else: messages.append(message) + messages.extend(deferred_image_messages) return messages diff --git a/tests/adapters/test_openai.py b/tests/adapters/test_openai.py index e0a2b55..23cecf8 100644 --- a/tests/adapters/test_openai.py +++ b/tests/adapters/test_openai.py @@ -170,6 +170,51 @@ def test_chat_normalizes_complete_assistant_messages_without_flattening_parts(): ] +@pytest.mark.parametrize("arguments", ['{"city":"Paris"}', "{bad json", '["not","an","object"]']) +@pytest.mark.parametrize("protocol", ["responses", "chat/completions"]) +def test_tool_history_preserves_raw_arguments(protocol, arguments): + """Ensures valid, malformed, and non-object JSON arguments survive OpenAI history projection.""" + if protocol == "responses": + request = OpenAIResponsesCreateRequest( + model="m", + input=[ + { + "type": "function_call", + "call_id": "call_1", + "name": "lookup", + "arguments": arguments, + } + ], + ) + normalized = OpenAIResponsesAdapter(_CAPABILITIES).normalize_request(request) + [tool_call] = normalized.input + else: + request = OpenAIChatCompletionsCreateRequest( + model="m", + messages=[ + { + "role": "assistant", + "tool_calls": [ + { + "type": "function", + "id": "call_1", + "function": {"name": "lookup", "arguments": arguments}, + } + ], + } + ], + ) + normalized = OpenAIChatCompletionsAdapter(_CAPABILITIES).normalize_request(request) + [assistant] = normalized.input + [tool_call] = assistant.content + + assert tool_call.args == arguments + responses = OpenAIResponsesClient._native_request(normalized).model_dump() + chat = OpenAIChatCompletionsClient._native_request(normalized).model_dump() + assert responses["input"][0]["arguments"] == arguments + assert chat["messages"][0]["tool_calls"][0]["function"]["arguments"] == arguments + + def test_adapters_preserve_multimodal_input_boundaries_and_order(): responses = OpenAIResponsesAdapter(_CAPABILITIES).normalize_request( OpenAIResponsesCreateRequest( @@ -545,6 +590,36 @@ def _chat_adapter(capabilities: ProviderCapabilities): _CHAT_START = ResponseStartEvent(id="chatcmpl_123", created_at=1, model="m") +@pytest.mark.parametrize("arguments", ['{"city":"Paris"}', "{bad json", '["not","an","object"]']) +@pytest.mark.parametrize("protocol", ["responses", "chat/completions"]) +async def test_response_projection_preserves_raw_tool_arguments(protocol, arguments): + """Ensures collected OpenAI output retains raw tool JSON without parsing or repairing it.""" + factory = _responses_adapter if protocol == "responses" else _chat_adapter + adapter, request = factory(_CAPABILITIES) + part = ToolCall(tool_name="lookup", args=arguments, tool_call_id="call_1") + response = await adapter.project_response( + adapter.project_events( + _stream( + _RESPONSE_START, + PartStartEvent(index=0, part=part), + PartEndEvent(index=0, part=part), + ResponseEndEvent( + id="resp_123", created_at=1, model="m", termination_reason="tool_call" + ), + ), + request, + ), + request, + ) + + if protocol == "responses": + [tool_call] = response.output + assert tool_call.arguments == arguments + else: + [tool_call] = response.choices[0].message.tool_calls + assert tool_call.function.arguments == arguments + + async def test_responses_response_projection_returns_terminal_response() -> None: adapter, request = _responses_adapter(_CAPABILITIES) diff --git a/tests/cassette_discovery.py b/tests/cassette_discovery.py new file mode 100644 index 0000000..c0e6b21 --- /dev/null +++ b/tests/cassette_discovery.py @@ -0,0 +1,254 @@ +"""Filename discovery shared by public-route replay and matcher tests.""" + +import re +from collections import defaultdict +from collections.abc import Iterable +from dataclasses import dataclass +from pathlib import Path +from typing import Literal, cast + +from molto.providers import DEFAULT_PROVIDER_BY_ENDPOINT, PROVIDER_CAPABILITIES, Endpoint, Provider + +CASSETTE_DIR = Path(__file__).parent / "cassettes" +Mode = Literal["stream", "non_stream"] +PROTOCOLS: tuple[Endpoint, ...] = ("responses", "chat/completions", "messages") +ENCRYPTED_SCENARIOS = ( + "reasoning_encrypted", + "input_image_with_reasoning_encrypted", + "tool_call_with_reasoning_encrypted", +) +SCENARIO_PROTOCOLS = dict.fromkeys( + ( + "simple_text", + "reasoning_raw", + "input_image_base64", + "input_image_remote_url", + "tool_call", + "tool_call_choice", + "tool_call_parallel", + "tool_call_image_result_parallel", + "prompt_cache_implicit", + "prompt_cache_explicit", + "error-invalid_request_error", + ), + PROTOCOLS, +) +SCENARIO_PROTOCOLS.update(dict.fromkeys(ENCRYPTED_SCENARIOS, ("responses", "messages"))) +_FILENAME = re.compile( + r"(?P[a-z0-9_]+)-(?Presponses|chat_completions|messages)-" + r"(?Pstream|non_stream)-(?P[0-9]+)\.yaml" +) + + +@dataclass(frozen=True) +class Cassette: + path: Path + scenario: str + provider: Provider + endpoint: Endpoint + mode: Mode + turn: int + + +def parse_cassette(path: Path) -> Cassette: + match = _FILENAME.fullmatch(path.name) + if match is None: + raise ValueError( + f"Invalid cassette filename {path}; expected provider-endpoint-mode-turn.yaml" + ) + provider = match["provider"] + if provider not in PROVIDER_CAPABILITIES: + raise ValueError( + f"Unsupported provider profile {provider!r} in {path}; update PROVIDER_CAPABILITIES" + ) + return Cassette( + path, + path.parent.name, + cast(Provider, provider), + cast(Endpoint, match["endpoint"].replace("chat_completions", "chat/completions")), + cast(Mode, match["mode"]), + int(match["turn"]), + ) + + +@dataclass(frozen=True) +class Conversation: + scenario: str + provider: Provider + endpoint: Endpoint + mode: Mode + cassettes: tuple[Cassette, ...] + + @property + def paths(self) -> list[Path]: + return [cassette.path for cassette in self.cassettes] + + @property + def turns(self) -> tuple[int, ...]: + return tuple(cassette.turn for cassette in self.cassettes) + + @property + def id(self) -> str: + return f"{self.scenario}-{self.provider}-{self.endpoint}-{self.mode}" + + +def discover_conversations( + root: Path, *, scenarios: Iterable[str] | None = None +) -> tuple[Conversation, ...]: + """Inspect only scenario directories directly inside the requested root.""" + selected = None if scenarios is None else set(scenarios) + grouped: dict[tuple[str, Provider, Endpoint, Mode], dict[int, Cassette]] = defaultdict(dict) + for path in sorted(root.glob("*/*.yaml")): + if selected is not None and path.parent.name not in selected: + continue + cassette = parse_cassette(path) + key = (cassette.scenario, cassette.provider, cassette.endpoint, cassette.mode) + turns = grouped[key] + if cassette.turn in turns: + raise ValueError( + f"Duplicate cassette identity: {turns[cassette.turn].path} and {path}" + ) + turns[cassette.turn] = cassette + conversations = [] + for key, turns in sorted(grouped.items()): + if sorted(turns) != list(range(max(turns) + 1)): + raise ValueError( + f"Missing turns for {key}: found {sorted(turns)}; require consecutive turns from 0" + ) + conversations.append(Conversation(*key, tuple(turns[turn] for turn in sorted(turns)))) + return tuple(conversations) + + +def select_conversation( + conversations: Iterable[Conversation], + scenario: str, + endpoint: Endpoint, + mode: Mode, + *, + provider: Provider | None = None, +) -> Conversation: + candidates = [ + conversation + for conversation in conversations + if (conversation.scenario, conversation.endpoint, conversation.mode) + == (scenario, endpoint, mode) + ] + preferred = provider or DEFAULT_PROVIDER_BY_ENDPOINT[endpoint] + for conversation in candidates: + if conversation.provider == preferred: + return conversation + if provider is None and len(candidates) == 1: + return candidates[0] + raise ValueError( + f"Missing or ambiguous {scenario}/{endpoint}/{mode} counterpart for provider {preferred!r}; " + f"found {[conversation.id for conversation in candidates]}" + ) + + +@dataclass(frozen=True) +class RouteCase: + downstream: Conversation + upstream: Conversation + reference: Conversation + + @property + def id(self) -> str: + return f"{self.downstream.id}-via-{self.upstream.provider}-{self.upstream.endpoint}" + + +def _matched_issuer(conversation: Conversation) -> Provider: + # Only the curated Messages fixtures use the anthropic label for + # OpenAI-issued opaque state. This is not a cross-provider contract. + if conversation.endpoint == "messages" and conversation.provider == "anthropic": + return "openai" + return conversation.provider + + +def route_cases( + conversations: Iterable[Conversation], + scenario: str, + mode: Mode, + routes: Iterable[tuple[Endpoint, Endpoint]], +) -> tuple[RouteCase, ...]: + """Vary upstream providers against deterministic companions, never provider products.""" + selected = [c for c in conversations if c.scenario == scenario and c.mode == mode] + cases = [] + for downstream, upstream in routes: + upstreams = [c for c in selected if c.endpoint == upstream] + if not upstreams: + raise ValueError(f"Missing {scenario}/{upstream}/{mode} conversation") + for source in upstreams: + target = ( + source + if downstream == upstream + else select_conversation(selected, scenario, downstream, mode) + ) + reference = select_conversation(selected, scenario, "responses", mode) + for counterpart in (target, reference): + if source.turns != counterpart.turns: + raise ValueError( + f"Mismatched turns: {source.id} {source.turns} versus {counterpart.id} {counterpart.turns}" + ) + if scenario in ENCRYPTED_SCENARIOS: + if _matched_issuer(source) != _matched_issuer(counterpart): + raise ValueError( + f"Incompatible encrypted-state issuers: {source.id} and {counterpart.id}" + ) + cases.append(RouteCase(target, source, reference)) + return tuple(cases) + + +def public_conversations(root: Path) -> tuple[Conversation, ...]: + conversations = discover_conversations(root) + for conversation in conversations: + scenario = conversation.scenario + if scenario not in SCENARIO_PROTOCOLS: + raise ValueError( + f"Unsupported scenario {scenario!r} in {root}; add scenario assertions before replay" + ) + if root.name == "native" and scenario == "error-invalid_request_error": + raise ValueError(f"Error scenario in {root}; use matched error assertions instead") + if conversation.endpoint not in SCENARIO_PROTOCOLS[scenario]: + raise ValueError(f"Unsupported endpoint in {conversation.id}") + thinking = PROVIDER_CAPABILITIES[conversation.provider].thinking + if (scenario == "reasoning_raw" and thinking != "raw") or ( + scenario in ENCRYPTED_SCENARIOS and thinking != "summary" + ): + raise ValueError( + f"Incompatible provider reasoning profile in {conversation.id}: {thinking}" + ) + if ( + root.name == "matched" + and conversation.mode == "non_stream" + and scenario not in {"simple_text", "reasoning_encrypted"} + ): + raise ValueError( + f"Unsupported matched response mode in {conversation.id}; add scenario assertions" + ) + if root.name == "matched": + minimum_turns = { + "tool_call": 3, + "tool_call_with_reasoning_encrypted": 3, + "error-invalid_request_error": 1, + }.get(scenario, 2) + if len(conversation.cassettes) < minimum_turns: + raise ValueError( + f"Missing required turns in {conversation.id}: expected at least {minimum_turns}, found {conversation.turns}" + ) + return conversations + + +MATCHED_CONVERSATIONS = public_conversations(CASSETTE_DIR / "matched") +NATIVE_CONVERSATIONS = public_conversations(CASSETTE_DIR / "native") + + +def matcher_pairs( + scenario: str, endpoint: Endpoint, mode: Mode = "stream" +) -> tuple[tuple[int, Path, Path], ...]: + return tuple( + (source.turn, source.path, reference.path) + for case in route_cases(MATCHED_CONVERSATIONS, scenario, mode, [("responses", endpoint)]) + for source, reference in zip( + case.upstream.cassettes, case.reference.cassettes, strict=True + ) + ) diff --git a/tests/cassettes/README.md b/tests/cassettes/README.md index f3b4d83..4bc657f 100644 --- a/tests/cassettes/README.md +++ b/tests/cassettes/README.md @@ -2,16 +2,41 @@ These YAML files capture sanitized HTTP requests and provider responses for deterministic test playback. Most cassettes are faithful recordings apart from secret masking and the filtering of unstable transport metadata. -Normal test runs are playback-only. Do not record or rewrite cassettes during a test run. +Normal test runs are playback-only. Do not record or rewrite cassettes during a test run. Pytest has no recording option or cassette manager; its default async HTTP transport is blocked unconditionally. Approved recordings use standalone tooling such as `scripts/recorder_proxy.py`, which retains its authorization masking and retry policy. + +## Conversation discovery + +Public-route and matcher tests discover files directly inside scenario directories using `{provider}-{endpoint}-{mode}-{turn}.yaml`. The filename endpoint `chat_completions` maps to `chat/completions`. Conversations are grouped by scenario, provider, endpoint, and mode, with turns ordered numerically from zero. Adding a provider cannot overwrite another provider's turn with the same number. + +Discovery has separate purposes for each root: + +- `matched/` supplies compatible protocol conversations and Responses-referenced translation checks. +- `native/` optionally holds faithful provider-deviation recordings for native SDK parity in supported scenarios. They do not require matched counterparts or establish translated behavior. +- `errors/` supplies only the explicitly registered `ERROR_SCENARIOS`. The Responses-only incomplete-result recordings retain their focused interface tests. +- `sources/` holds source-only originals and does not generate public-route cases. Reuse an original already under `native/` or `upstream_ir/` rather than copying it here. `upstream_ir/` retains its separate projection and continuation runner; archives and legacy provider directories do not join generic discovery. + +Each additional matched upstream provider runs against the canonical downstream companion and Responses reference, preferring the endpoint's default provider or requiring a unique available conversation. Native routes use that upstream provider's own request and SDK result. This preserves the existing routes without taking a cross-product of providers. Both native SDK runners pass the discovered provider explicitly. The existing native SDK baseline scenarios remain selected; other supported matched scenarios retain their native public-route assertions. + +Malformed filenames, duplicate numeric identities, missing turns or required counterparts, unsupported scenarios/modes, and incompatible registered capability profiles fail collection with the affected identity. Matched scenarios retain their required two-turn conversations, three-turn sequential tool exchanges, and single-turn unknown-error cases. A new error category or unsupported scenario still needs explicit assertions. Raw reasoning requires the raw profile; encrypted matched fixtures retain the single-issuer assumption described below, including the existing `anthropic` Messages filename label. Filenames select replay behavior; they do not establish live provider support or provenance. ## Recorded cassettes -The cassettes under provider directories such as `openai/` preserve the recorded request and response as closely as possible. Authorization values and secret-looking request fields are masked, and only selected headers are retained so the fixtures remain safe and deterministic. +Faithful originals live under `native/`, `sources/`, `upstream_ir/`, or `errors/`, according to their test purpose. Preserve each original separately from any deliberately edited matched companion. Authorization values are masked, and only selected headers are retained so the fixtures remain safe and deterministic. Review request bodies for secrets before retaining recordings. + +For each provider deviation, a nearby README must identify the source provider, endpoint, model and server version when available, response mode, purpose, and recording provenance. Retain the complete sanitized conversation. Native tests compare requests and SDK-parsed results with that original, asserting the observed deviation separately from any documented Molto adjustment. If translation is affected, retain the difference in the upstream replay and compare against Responses-referenced expectations; matching must not erase the deviation under test. + +The matched `reasoning_raw` omission regression separately checks that the OpenAI SDK observes `cache_write_tokens` as `None` and Molto adjusts it to zero. It has no verified faithful original establishing the omission's provider provenance. Its filename selects the raw-reasoning profile; this regression does not establish live deployment behavior. Replay verifies the saved wire contract, while live provider acceptance requires approved source evidence. Recorded headers are informational. In particular, `content-length` is not guaranteed to match the serialized body after sanitization or other approved cassette edits and must not be used as a fixture integrity check. Treat these files as provider evidence. Do not edit a recorded value merely to make an implementation pass a test. If a committed recording is demonstrably wrong, document the correction and review its diff explicitly. +### SDK schema mismatches + +When a cassette fails validation against the pinned SDK because a recorded field is missing or incompatible, identify the cassette path, SDK version, and validation error, and ask the developer to record a fresh cassette from an approved source. Do not synthesize missing values, add compatibility defaults or coercions, weaken runtime or test-helper validation, or fabricate fields in the fixture solely to make that recording pass. For example, a missing SDK-required `cache_write_tokens` count requires a new recording rather than an assumed zero. + +Preserve the original evidence, continue unaffected work, and report dependent verification as awaiting the new recording. New recordings must be sanitized, reviewed, and committed before matching edits; normal test runs remain replay-only. If a fresh recording reproduces the mismatch, establish the supported provider contract with the developer before implementing compatibility behavior. + ### Multi-turn upstream IR recordings `upstream_ir/{scenario}/{provider}-{endpoint}-stream-{turn}.yaml` contains independent, unchanged provider recordings for `tests/upstream/test_multi_turn.py`. The scenarios are two-turn `text_chat`, `text_image_chat`, and `consecutive_user_text`, plus three-turn `tool_use` and `tool_use_reasoning`. Text, multimodal input, consecutive user messages, and tool use cover all three upstream clients; reasoning tool use covers Responses and Messages. @@ -30,7 +55,9 @@ The cassettes under `errors/{scenario}/` preserve the native request and error r errors/{scenario}/{provider}-{endpoint}-{mode}-{turn}.yaml ``` -`errors/incomplete_response/` contains HTTP `200` Responses recordings that stop at `max_output_tokens`. These are incomplete results, not API exceptions, so they are covered in `tests/core/test_interface.py` rather than `ERROR_SCENARIOS`. The tests cover native Responses and Responses-to-Chat translation in both downstream modes, comparing partial text and token usage with SDK-parsed recordings and asserting incomplete/length termination. Native non-streaming replay uses `openai-responses-non_stream-00.yaml`; native streaming and both translated modes share `openai-responses-stream-00.yaml`, because translated non-streaming calls still consume an upstream stream. Both files were moved unchanged from `openai/responses/test_incomplete_responses/`; the redundant `test_incomplete_response-non-stream-sse.yaml` recording was removed. +`errors/incomplete_response/` contains HTTP `200` Responses recordings that stop at `max_output_tokens`. These are incomplete results, not API exceptions, so they are covered in `tests/core/test_interface.py` rather than `ERROR_SCENARIOS`. The tests cover native Responses and Responses-to-Chat translation in both downstream modes, comparing partial text and token usage with SDK-parsed recordings and asserting incomplete/length termination. Native non-streaming replay uses `openai-responses-non_stream-00.yaml`; native streaming and both translated modes share `openai-responses-stream-00.yaml`, because translated non-streaming calls still consume an upstream stream. + +The streaming file was freshly recorded on November 2, 2026 through `scripts/recorder_proxy.py` against the official OpenAI Responses API, outside pytest. The developer approved changing only `model` from retired `gpt-4.1-nano` to `gpt-4.1-mini`; both prompts, `max_output_tokens: 20`, `stream: true`, and all other request-body fields remain unchanged. The sanitized recording was copied without further edits. Its terminal response includes the SDK-required `cache_write_tokens: 0` directly from the provider; no usage fields were synthesized. Unlike matched success cassettes, equivalent errors are not rewritten to share a status code, message, or body shape. Those differences are the behavior under test. Cross-protocol tests combine the request from the downstream protocol's cassette with the response from the upstream protocol's cassette. Add error categories to `ERROR_SCENARIOS` in `tests/core/test_exceptions.py`. The shared test replays streaming requests through the native SDK and every Molto route, asserting SDK error parity, the normalized cause chain, and preservation of the upstream response. It consumes returned streams to cover errors delivered after successful HTTP headers as well as immediate HTTP failures. @@ -67,6 +94,24 @@ Responses is the canonical behavioral reference. A matched Chat Completions or A These edits make translation errors observable without requiring unrelated provider-generated values to coincide by chance. +### Comparison checks + +Request expectations are compared independently of Molto's translator. For encrypted Messages-to-Responses requests, the comparison allows only the documented missing output-item IDs/phase, `include=["reasoning.encrypted_content"]`, `store=false`, and SSE padding option `stream_options.include_obfuscation=false`. It treats omitted reasoning `content` as an empty list and an implicit message `type` as `message`. Scalar assistant text is equivalent to one completed `output_text` part with empty annotations and log probabilities; it cannot stand in for multiple parts or messages. Output-only reasoning `status` is removed from the expected history, and reconstructed input must omit it. Call IDs, opaque state, input/part order, token limits, and cache settings remain compared. + +Responses stream checks validate each output index and item ID before generated IDs are removed from cross-protocol comparisons. Every item update must occur between that item's start and completion. Completed and incomplete terminal responses must contain the completed items in output-index order. Translated terminal reasoning retains the `done` encrypted snapshot; native Responses may expose its separate terminal snapshot and remains covered by SDK parity. + +Non-streaming comparisons retain ordered supported output items and part boundaries, all reasoning items and opaque snapshots, terminal state, and semantic token usage. The incomplete-stream helper tests use an SDK-parsed recording to check `incomplete_details`, partial output, and final usage. The fresh streaming recording supplies the SDK-required cache-write count, allowing the incomplete-result comparison and its five negative cases to reach their assertions. A separate regression verifies that the helper rejects a missing count without inventing a value. Negative checks cover altered requests, item identities, output order, incomplete reasons, and usage. These checks do not add incomplete-route coverage beyond the routes described above or establish arbitrary interleaved-item support. + +### Actual-output continuation + +Matched public-route conversations start with the first saved request and carry its input forward cumulatively. Later calls append the actual returned assistant output and only the next saved user input or tool results, retaining that turn's settings. Before sending, the harness compares the complete carried history against the next cassette; the replay transport independently checks the outgoing upstream request. This applies to the existing streaming text, reasoning, image, and tool conversations and the existing non-streaming text/encrypted cases. Cache scenarios remain independent prefix-changing requests. + +Collection is independent of Molto's adapters and collectors: Responses uses the terminal SDK response output, Chat uses the SDK's `ChatCompletionStreamState`, and Messages uses the pinned SDK's `accumulate_event`. Complete responses use the same test-side input conversion. The conversion removes reasoning's output-only `status`, streaming tool indexes, SDK parser properties, empty Chat annotations, the default Messages direct caller, and empty unsigned-thinking signatures. It does not recursively discard unknown fields. Unknown or unsupported meaningful fields must still fail comparison or public request validation. + +Responses history comparison permits optional output-item ID omissions, omitted/empty reasoning content, implicit message types, and scalar assistant text equivalent to one structured output part. Empty text annotations/log probabilities are equivalent to their omission. Native fixtures may omit the optional `final_answer` phase; native commentary remains exact, while translated comparison omits phase because other protocols cannot represent it. Actual returned IDs and phase remain in the carried request wherever supplied. Portable call IDs, arguments, text/reasoning order, part boundaries, and opaque snapshots remain exact. First requests retain the original request assertions; these continuation equivalences apply only to later requests. + +Negative public-replay checks change returned call IDs and opaque snapshots and require rejection before the next call. A three-turn check verifies that earlier actual output, including generated IDs absent from the fixture, remains in later requests. + ### Encrypted reasoning For encrypted reasoning from closed-source models, matched Responses and Messages cassettes assume that OpenAI serves both endpoints. Under that same-provider fixture contract, Responses `encrypted_content` and a Messages thinking `signature` are two protocol representations of the same OpenAI-issued opaque state. The Messages cassette is therefore edited to carry the encrypted content or signature from the Responses cassette. This does not imply that an OpenAI-issued value is valid against Anthropic's API, or that opaque reasoning state is portable across providers. @@ -89,16 +134,16 @@ The `matched/{scenario}/` directories currently exercise these scenarios. One sc | Scenario | What it exercises | | --- | --- | -| `simple_text` | A single plain-text exchange over every protocol pair. | +| `simple_text` | Two plain-text turns over every protocol pair, carrying actual returned history. | | `reasoning_raw` | Raw reasoning projected through Chat and Messages as well as Responses. Uses `vllm-*` filenames (`provider="vllm"`); see below. | | `reasoning_encrypted` | A summarized reasoning item whose continuation is opaque encrypted state, exercising the encrypted-snapshot mapping. | | `input_image_base64` | Base64-data-URL image user input. | -| `input_image_remote_url` | Remote-URL image user input. | +| `input_image_remote_url` | Two remote-URL image turns over all nine protocol pairs, preserving the URL and text/image order in actual continued history. | | `input_image_with_reasoning_encrypted` | An image user turn followed by encrypted reasoning continuation. | | `tool_call` | Three turns: a function call, then a result plus another call, then a result plus final text; exercises tool-call history over translated routes. | | `tool_call_choice` | Named tool selection (`tool_choice: {name: read_file}`) followed by a disabled tool use (`tool_choice: none`). | | `tool_call_parallel` | Two function calls and results with `parallel_tool_calls` enabled. | -| `tool_call_image_result_parallel` | Parallel tool calls where a result carries an image, exercising the Chat image-tool-result relocation. | +| `tool_call_image_result_parallel` | Two parallel calls followed by image results and a final answer, replayed over Responses/Messages routes and Responses or Messages callers using Chat upstream. All results precede relocated images, with linked call IDs and preserved image order. | | `tool_call_with_reasoning_encrypted` | A tool call whose conversation carries encrypted reasoning continuation across three turns. | | `prompt_cache_implicit` | Two requests with automatic caching of a user prefix. | | `prompt_cache_explicit` | Two requests with an explicit breakpoint on a system prefix and a changing user suffix. | @@ -106,6 +151,16 @@ The `matched/{scenario}/` directories currently exercise these scenarios. One sc The `reasoning_raw` scenario is named with `vllm-*` filenames and its test derives `provider="vllm"` from that filename prefix, selecting the raw reasoning profile across all three protocols. A base URL never selects either behavior. +### Image and request projection checks + +The Chat streaming matcher converts image-bearing Responses tool results into text-only tool messages followed by labeled user image messages. All parallel tool results stay contiguous before any relocated image, and images retain their source order within and across results. Constructed matcher tests assert contiguous results with multiple images and verify repeat matching on temporary files without rewriting recordings. + +The two Chat companions in `matched/tool_call_image_result_parallel/` derive from the unchanged official OpenAI recordings under `sources/`. Request-only matching aligns the model, output-token limit, streaming options, and history; event matching aligns reasoning effort, portable call IDs and their history/labels, response IDs, creation times, response model, target-default service tier, text/tool-argument deltas, finish state, and semantic usage with Responses. The first matched stream has 7 chunks and the second has 23. Transport headers, recording timestamps, and source identifiers remain unchanged. The matched model is a replay value, not evidence that these edited requests were sent live. Matcher tests rebuild both companions on temporary files, validate native SDK schemas, and verify byte idempotence while preserving the originals. + +Focused public request tests check Responses and Messages callers using Chat upstream with images in the first, last, or both parallel results. They compare complete expected requests, including linked call IDs, result order, and image order. These tests reuse SDK-parsed text responses to check output parity; they do not establish live acceptance or replace full Chat image-result conversation replay. + +Additional mocked request checks cover `required`/Messages `any` tool selection with parallel calls enabled and disabled, and nonempty Responses top-level `instructions` translated ahead of existing instructions. Replayed responses in these checks do not establish provider acceptance of the modified requests. + ### Prompt caching `matched/prompt_cache_implicit/` and `matched/prompt_cache_explicit/` each contain two streaming requests per protocol, numbered `-00` and `-01` in recording order. Responses remains unmodified and supplies the canonical request content, response ID, model, text deltas, and token counts. Chat also carries the Responses creation timestamp; Messages has no timestamp field. diff --git a/tests/cassettes/errors/incomplete_response/openai-responses-stream-00.yaml b/tests/cassettes/errors/incomplete_response/openai-responses-stream-00.yaml index 2ffb1d6..a52adcd 100644 --- a/tests/cassettes/errors/incomplete_response/openai-responses-stream-00.yaml +++ b/tests/cassettes/errors/incomplete_response/openai-responses-stream-00.yaml @@ -1,27 +1,28 @@ +filename: 2026-11-02-01a19c16-1e0c-7c63-8603-6cb0ae879b57 request: - method: POST - path: /v1/responses - query_params: {} + body: + input: + - content: You are a financial advisor + role: system + - content: Who are you? + role: user + instructions: You are a financial advisor for the user. + max_output_tokens: 20 + model: gpt-4.1-mini + stream: true headers: - accept: application/json + accept: '*/*' accept-encoding: gzip, deflate authorization: Bearer *** connection: keep-alive content-length: '229' content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: system - content: You are a financial advisor - - role: user - content: Who are you? - instructions: You are a financial advisor for the user. - max_output_tokens: 20 - model: gpt-4.1-nano - stream: true + user-agent: python-httpx/0.28.1 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a19c16-1e0c-7c63-8603-6cb0ae879b57 response: - status_code: 200 headers: connection: keep-alive content-type: text/event-stream; charset=utf-8 @@ -29,8 +30,8 @@ response: - 'event: response.created ' - - 'data: {"type":"response.created","response":{"id":"resp_0590158a2fb765a7006a4e120f63cc819aa90a0c8160696480","object":"response","created_at":1783501327,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + - 'data: {"type":"response.created","response":{"id":"resp_03664e80f7a3117e006ae8785a18f887d286a7164e63e50933","object":"response","created_at":1793620058,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You + are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} ' - ' @@ -39,8 +40,8 @@ response: - 'event: response.in_progress ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0590158a2fb765a7006a4e120f63cc819aa90a0c8160696480","object":"response","created_at":1783501327,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + - 'data: {"type":"response.in_progress","response":{"id":"resp_03664e80f7a3117e006ae8785a18f887d286a7164e63e50933","object":"response","created_at":1793620058,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You + are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} ' - ' @@ -49,7 +50,7 @@ response: - 'event: response.output_item.added ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + - 'data: {"type":"response.output_item.added","item":{"id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} ' - ' @@ -58,7 +59,7 @@ response: - 'event: response.content_part.added ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} ' - ' @@ -67,7 +68,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"3xwleVEfIzgp6jL","output_index":0,"sequence_number":4} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"p0tk1JFvA7KWcrV","output_index":0,"sequence_number":4} ' - ' @@ -76,7 +77,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" am","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"9kpODOEjSfspq","output_index":0,"sequence_number":5} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"’m","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"BG7B7SmauG6535","output_index":0,"sequence_number":5} ' - ' @@ -85,7 +86,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"8al36xjeeF7lwQ","output_index":0,"sequence_number":6} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" your","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"4sj9RCXfEsE","output_index":0,"sequence_number":6} ' - ' @@ -94,7 +95,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" financial","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"E2A5gk","output_index":0,"sequence_number":7} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" financial","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"z34Chd","output_index":0,"sequence_number":7} ' - ' @@ -103,7 +104,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" advisor","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"OGqpuh7S","output_index":0,"sequence_number":8} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" advisor","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"vN62Fbcp","output_index":0,"sequence_number":8} ' - ' @@ -112,7 +113,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" here","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"OroCmzNAR9Q","output_index":0,"sequence_number":9} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" here","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"CdFRpM2qlcT","output_index":0,"sequence_number":9} ' - ' @@ -121,7 +122,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"2tgl7bswhoiJS","output_index":0,"sequence_number":10} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"hv9n4cSrfyE7y","output_index":0,"sequence_number":10} ' - ' @@ -130,7 +131,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" help","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"qWAbMznPnfY","output_index":0,"sequence_number":11} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" help","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"XloZ7LiohDR","output_index":0,"sequence_number":11} ' - ' @@ -139,7 +140,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"D8uIIK59pgHF","output_index":0,"sequence_number":12} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"0epRllTibcJS","output_index":0,"sequence_number":12} ' - ' @@ -148,7 +149,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"lS6AFAbrtZK","output_index":0,"sequence_number":13} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"3tICmnzlbwp","output_index":0,"sequence_number":13} ' - ' @@ -157,7 +158,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" any","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"E4cNHy5k0I9B","output_index":0,"sequence_number":14} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" questions","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"NMnaF1","output_index":0,"sequence_number":14} ' - ' @@ -166,7 +167,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" questions","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"OZVQ0U","output_index":0,"sequence_number":15} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"yBOc4qF9os","output_index":0,"sequence_number":15} ' - ' @@ -175,7 +176,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" or","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"cVsaMdvkX9AIa","output_index":0,"sequence_number":16} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" budgeting","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"JG3GZT","output_index":0,"sequence_number":16} ' - ' @@ -184,7 +185,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" concerns","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"rnE33Mv","output_index":0,"sequence_number":17} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"zRt9nppnwt52SRi","output_index":0,"sequence_number":17} ' - ' @@ -193,7 +194,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"fVb2Ufc0pLJl","output_index":0,"sequence_number":18} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" investing","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"QnPijs","output_index":0,"sequence_number":18} ' - ' @@ -202,7 +203,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" have","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"UwKulAt4VNj","output_index":0,"sequence_number":19} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"FSRI54hWhwNac2h","output_index":0,"sequence_number":19} ' - ' @@ -211,7 +212,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" about","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"2A47bg50p5","output_index":0,"sequence_number":20} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" retirement","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"pSiBz","output_index":0,"sequence_number":20} ' - ' @@ -220,7 +221,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" managing","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"Y44SIgg","output_index":0,"sequence_number":21} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" planning","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"8VesEWx","output_index":0,"sequence_number":21} ' - ' @@ -229,7 +230,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" your","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"hLKqjpjCj2Y","output_index":0,"sequence_number":22} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"vMRI6OnJTgm6eiv","output_index":0,"sequence_number":22} ' - ' @@ -238,7 +239,7 @@ response: - 'event: response.output_text.delta ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" finances","item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"obfuscation":"d4DKaR0","output_index":0,"sequence_number":23} + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" debt","item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"obfuscation":"wk84oapaczl","output_index":0,"sequence_number":23} ' - ' @@ -247,9 +248,9 @@ response: - 'event: response.output_text.done ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","logprobs":[],"output_index":0,"sequence_number":24,"text":"I - am a financial advisor here to help you with any questions or concerns you have - about managing your finances"} + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","logprobs":[],"output_index":0,"sequence_number":24,"text":"I’m + your financial advisor here to help you with questions about budgeting, investing, + retirement planning, debt"} ' - ' @@ -258,9 +259,9 @@ response: - 'event: response.content_part.done ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"I - am a financial advisor here to help you with any questions or concerns you have - about managing your finances"},"sequence_number":25} + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"I’m + your financial advisor here to help you with questions about budgeting, investing, + retirement planning, debt"},"sequence_number":25} ' - ' @@ -269,9 +270,9 @@ response: - 'event: response.output_item.done ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","type":"message","status":"incomplete","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"I - am a financial advisor here to help you with any questions or concerns you have - about managing your finances"}],"role":"assistant"},"output_index":0,"sequence_number":26} + - 'data: {"type":"response.output_item.done","item":{"id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","type":"message","status":"incomplete","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"I’m + your financial advisor here to help you with questions about budgeting, investing, + retirement planning, debt"}],"role":"assistant"},"output_index":0,"sequence_number":26} ' - ' @@ -280,12 +281,14 @@ response: - 'event: response.incomplete ' - - 'data: {"type":"response.incomplete","response":{"id":"resp_0590158a2fb765a7006a4e120f63cc819aa90a0c8160696480","object":"response","created_at":1783501327,"status":"incomplete","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":{"reason":"max_output_tokens"},"instructions":"You - are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[{"id":"msg_0590158a2fb765a7006a4e121141b0819a9fef05f77cffb287","type":"message","status":"incomplete","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"I - am a financial advisor here to help you with any questions or concerns you have - about managing your finances"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":33,"input_tokens_details":{"cached_tokens":0},"output_tokens":20,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":53},"user":null,"metadata":{}},"sequence_number":27} + - 'data: {"type":"response.incomplete","response":{"id":"resp_03664e80f7a3117e006ae8785a18f887d286a7164e63e50933","object":"response","created_at":1793620058,"status":"incomplete","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":{"reason":"max_output_tokens"},"instructions":"You + are a financial advisor for the user.","max_output_tokens":20,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_03664e80f7a3117e006ae8785ab56887d2982238643b654ce8","type":"message","status":"incomplete","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"I’m + your financial advisor here to help you with questions about budgeting, investing, + retirement planning, debt"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":33,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":20,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":53},"user":null,"metadata":{}},"sequence_number":27} ' - ' ' + status_code: 200 +timestamp: '2026-11-02T11:47:37.612636+00:00' diff --git a/tests/cassettes/matched/input_image_remote_url/anthropic-messages-stream-01.yaml b/tests/cassettes/matched/input_image_remote_url/anthropic-messages-stream-01.yaml index e41a98e..2a0a0f1 100644 --- a/tests/cassettes/matched/input_image_remote_url/anthropic-messages-stream-01.yaml +++ b/tests/cassettes/matched/input_image_remote_url/anthropic-messages-stream-01.yaml @@ -13,7 +13,7 @@ request: role: user - content: - type: text - text: That is the **GitHub logo**, featuring the Octocat silhouette. + text: That is the **GitHub logo**, featuring the stylized “Octocat” silhouette. role: assistant - content: - type: text diff --git a/tests/cassettes/matched/input_image_remote_url/openai-chat_completions-stream-01.yaml b/tests/cassettes/matched/input_image_remote_url/openai-chat_completions-stream-01.yaml index 23a524b..bb74ef6 100644 --- a/tests/cassettes/matched/input_image_remote_url/openai-chat_completions-stream-01.yaml +++ b/tests/cassettes/matched/input_image_remote_url/openai-chat_completions-stream-01.yaml @@ -10,7 +10,7 @@ request: url: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png type: image_url role: user - - content: That is the **GitHub logo**, featuring the Octocat silhouette. + - content: That is the **GitHub logo**, featuring the stylized “Octocat” silhouette. role: assistant - content: - text: What is the animal? diff --git a/tests/cassettes/matched/input_image_remote_url/openai-responses-stream-01.yaml b/tests/cassettes/matched/input_image_remote_url/openai-responses-stream-01.yaml index de0fe3d..c43b2a6 100644 --- a/tests/cassettes/matched/input_image_remote_url/openai-responses-stream-01.yaml +++ b/tests/cassettes/matched/input_image_remote_url/openai-responses-stream-01.yaml @@ -11,7 +11,7 @@ request: - content: - annotations: [] logprobs: [] - text: That is the **GitHub logo**, featuring the Octocat silhouette. + text: That is the **GitHub logo**, featuring the stylized “Octocat” silhouette. type: output_text role: assistant status: completed diff --git a/tests/cassettes/matched/reasoning_encrypted/anthropic-messages-stream-01.yaml b/tests/cassettes/matched/reasoning_encrypted/anthropic-messages-stream-01.yaml index 443a932..7d8cc23 100644 --- a/tests/cassettes/matched/reasoning_encrypted/anthropic-messages-stream-01.yaml +++ b/tests/cassettes/matched/reasoning_encrypted/anthropic-messages-stream-01.yaml @@ -15,7 +15,7 @@ request: I need to come up with a classic tongue twister, maybe something like "How much wood would a woodchuck chuck if a woodchuck could chuck wood?" That’s a fun one! The user asked how much, so it should be concise. I could clarify - that there isn''''t a definitive answer, just a play on words. Let’s ensure + that there isn''t a definitive answer, just a play on words. Let’s ensure I convey that in a clear way!' type: thinking - text: "A woodchuck would chuck as much wood as a woodchuck could chuck—if\ diff --git a/tests/cassettes/matched/reasoning_encrypted/openai-responses-stream-01.yaml b/tests/cassettes/matched/reasoning_encrypted/openai-responses-stream-01.yaml index 4c16ccc..b19f3a9 100644 --- a/tests/cassettes/matched/reasoning_encrypted/openai-responses-stream-01.yaml +++ b/tests/cassettes/matched/reasoning_encrypted/openai-responses-stream-01.yaml @@ -17,7 +17,7 @@ request: I need to come up with a classic tongue twister, maybe something like "How much wood would a woodchuck chuck if a woodchuck could chuck wood?" That’s a fun one! The user asked how much, so it should be concise. I could clarify - that there isn''''t a definitive answer, just a play on words. Let’s ensure + that there isn''t a definitive answer, just a play on words. Let’s ensure I convey that in a clear way!' type: summary_text type: reasoning diff --git a/tests/cassettes/matched/simple_text/anthropic-messages-stream-01.yaml b/tests/cassettes/matched/simple_text/anthropic-messages-stream-01.yaml index cc0d580..9d9aed6 100644 --- a/tests/cassettes/matched/simple_text/anthropic-messages-stream-01.yaml +++ b/tests/cassettes/matched/simple_text/anthropic-messages-stream-01.yaml @@ -4,7 +4,9 @@ request: max_tokens: 1024 messages: - content: - - text: Write one short sentence about the ocean. + - text: 'Write one short sentence ' + type: text + - text: about the ocean. type: text role: user - content: diff --git a/tests/cassettes/matched/simple_text/openai-chat_completions-stream-01.yaml b/tests/cassettes/matched/simple_text/openai-chat_completions-stream-01.yaml index 627098a..603ef68 100644 --- a/tests/cassettes/matched/simple_text/openai-chat_completions-stream-01.yaml +++ b/tests/cassettes/matched/simple_text/openai-chat_completions-stream-01.yaml @@ -4,7 +4,9 @@ request: max_completion_tokens: 1024 messages: - content: - - text: Write one short sentence about the ocean. + - text: 'Write one short sentence ' + type: text + - text: about the ocean. type: text role: user - content: The ocean is a vast and mysterious blue world. diff --git a/tests/cassettes/matched/simple_text/openai-responses-stream-01.yaml b/tests/cassettes/matched/simple_text/openai-responses-stream-01.yaml index 3524067..3a3914c 100644 --- a/tests/cassettes/matched/simple_text/openai-responses-stream-01.yaml +++ b/tests/cassettes/matched/simple_text/openai-responses-stream-01.yaml @@ -3,7 +3,9 @@ request: body: input: - content: - - text: Write one short sentence about the ocean. + - text: 'Write one short sentence ' + type: input_text + - text: about the ocean. type: input_text role: user - content: diff --git a/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml b/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml new file mode 100644 index 0000000..725fabd --- /dev/null +++ b/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml @@ -0,0 +1,98 @@ +filename: 2026-11-03-01a1a065-d257-7b51-add3-46beaee11c53 +request: + body: + max_completion_tokens: 4096 + messages: + - content: + - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. + type: text + role: user + model: gpt-5.6-luna + parallel_tool_calls: true + reasoning_effort: none + stream: true + stream_options: + include_obfuscation: false + include_usage: true + tools: + - function: + description: Read an image from a file path. + name: read_image + parameters: + additionalProperties: false + properties: + file_path: + description: Path to the image file. + type: string + required: + - file_path + type: object + strict: false + type: function + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '562' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a065-d257-7b51-add3-46beaee11c53 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null,"refusal":null},"logprobs":null,"finish_reason":null}],"obfuscation":"3j07B"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"content":null,"tool_calls":[{"index":0,"id":"call_wgPIU8nkqwiW0U6sWZhQQEoo","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"OFlkx"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"file_path\":\"a.png\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"eqsmD6vStWL"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"content":null,"tool_calls":[{"index":1,"id":"call_ogRaxNumPm3Uuqe7kStvbch8","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"w2K9SIIPtjM"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"file_path\":\"b.png\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"yrnk4GdP"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"HJ3TWN1FE4cNWP"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5ae41087d088561140059266a9","object":"chat.completion.chunk","created":1787133274,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[],"usage":{"prompt_tokens":73,"completion_tokens":52,"total_tokens":125,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"BgoIf1dL"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-03T07:53:09.975046+00:00' diff --git a/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml b/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml new file mode 100644 index 0000000..6bf8085 --- /dev/null +++ b/tests/cassettes/matched/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml @@ -0,0 +1,246 @@ +filename: 2026-11-03-01a1a065-dae9-78a3-8674-02cc2c923294 +request: + body: + max_completion_tokens: 4096 + messages: + - content: + - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. + type: text + role: user + - role: assistant + tool_calls: + - function: + arguments: '{"file_path":"a.png"}' + name: read_image + id: call_wgPIU8nkqwiW0U6sWZhQQEoo + type: function + - function: + arguments: '{"file_path":"b.png"}' + name: read_image + id: call_ogRaxNumPm3Uuqe7kStvbch8 + type: function + - content: + - text: The image result of tool call 'call_wgPIU8nkqwiW0U6sWZhQQEoo' will be + attached as user prompt after all tool responses. + type: text + role: tool + tool_call_id: call_wgPIU8nkqwiW0U6sWZhQQEoo + - content: + - text: The image result of tool call 'call_ogRaxNumPm3Uuqe7kStvbch8' will be + attached as user prompt after all tool responses. + type: text + role: tool + tool_call_id: call_ogRaxNumPm3Uuqe7kStvbch8 + - content: + - text: 'Image returned by tool call ''call_wgPIU8nkqwiW0U6sWZhQQEoo'':' + type: text + - image_url: + url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== + type: image_url + role: user + - content: + - text: 'Image returned by tool call ''call_ogRaxNumPm3Uuqe7kStvbch8'':' + type: text + - image_url: + url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== + type: image_url + role: user + - content: + - text: What are the logos? + type: text + role: user + model: gpt-5.6-luna + parallel_tool_calls: true + reasoning_effort: none + stream: true + stream_options: + include_obfuscation: false + include_usage: true + tools: + - function: + description: Read an image from a file path. + name: read_image + parameters: + additionalProperties: false + properties: + file_path: + description: Path to the image file. + type: string + required: + - file_path + type: object + strict: false + type: function + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '4693' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a065-dae9-78a3-8674-02cc2c923294 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AW2edIQZ"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Both"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Jew5sCR"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + images"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DIz"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + show"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3fbOXw"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + **"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pWMPI"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Git"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"elZTQ"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Hub"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0p5C3y"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + Oct"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aiALSK"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"ocat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rFvAdve"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + logo"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCavp"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"**"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1eeOa5sQB"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"—"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s12L"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Mc0rI0U"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + silhouette"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iF0tIY"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pwFpjp84LSXotXt"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + Git"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DXjpgKu"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Hub"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YEG6acEW"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"’s"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pbMAS9"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + mascot"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CV5Oz"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iaaYwAy"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"F30L"} + + ' + - ' + + ' + - 'data: {"id":"resp_05818b751411a2f1006a857d5cfe7487d0ac097bb44a14db08","object":"chat.completion.chunk","created":1787133277,"model":"gpt-5.6-luna","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[],"usage":{"prompt_tokens":772,"completion_tokens":24,"total_tokens":796,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ow8Ob"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-03T07:53:12.169336+00:00' diff --git a/tests/cassettes/openai/chat_completions/invalid_api_key.yaml b/tests/cassettes/openai/chat_completions/invalid_api_key.yaml deleted file mode 100644 index aae3ddf..0000000 --- a/tests/cassettes/openai/chat_completions/invalid_api_key.yaml +++ /dev/null @@ -1,45 +0,0 @@ -filename: 2026-04-06-019d6165-7f51-7f02-802d-1b4886f88754 -request: - body: - messages: - - content: What number am I thinking of? - role: user - model: gpt-4.1-nano - tool_choice: required - tools: - - function: - description: Guess a number. - name: guess_number - parameters: - additionalProperties: false - properties: - number: - description: The guessed number. - type: integer - required: - - number - type: object - type: function - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '378' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 019d6165-7f51-7f02-802d-1b4886f88754 -response: - body: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: test.\ - \ You can find your API key at https://platform.openai.com/account/api-keys.\"\ - ,\n \"type\": \"invalid_request_error\",\n \"param\": null,\n \ - \ \"code\": \"invalid_api_key\"\n }\n}\n" - headers: - connection: keep-alive - content-length: '254' - content-type: application/json; charset=utf-8 - status_code: 401 -timestamp: '2026-04-06T06:05:34.929274+00:00' diff --git a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream-sse.yaml b/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream-sse.yaml deleted file mode 100644 index 7bb627d..0000000 --- a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream-sse.yaml +++ /dev/null @@ -1,329 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '21996' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: - - type: text - text: What is shown in this image? - - type: image_url - image_url: - url: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9UKKKKAH0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX4OeNP+Cmf7SOk+LNbsrX4jeXa29/cQwx/2HpjbUWRlUZNsSeBX7x1/L38Rv8AkfPEf/YUuv8A0c1AH0N/w9E/aY/6KT/5QdL/APkWvrj/AIJk/tmfGD9ob4/ax4c8f+Lzr2jW3hy41CO1/s2ytsTLcWyK26GFG4WV+M456V+Ttfe3/BF//k6jxF/2J93/AOldnQB+2VFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXjn7Tn7T2hfsq+ELDxR4m8O+Ita0S4ufsstzoFvBN9lcjKeaJJo8BvmAIyMrg4JXPsdcz8SPh5onxW8E614T8R2i3uiavavaXMJA3bWH3lP8LqQGVuzKD1AoA+Jv+H1XwR/6FX4gf8Agvsf/kyj/h9V8EP+hV+IH/gvsf8A5Mr8qf2lPgBr37M/xg1zwNrqtL9kfzbC/wBhVL60YkxTqPcDBAJ2srrklTXl1AH9Cf7Ln7fHw3/a18RaxofhK01vStU022W7a216CCF54ixUtEIppMhDtDE4x5idc8fSdfzKfA74wa38BPij4f8AHPh5/wDiY6TcrKYWYrHcREFZYXx/C6FlPpn1r+j/AOFPxM0X4yfDvQPGnh2fz9H1m1W5hJI3oTw8b44DowZGHZlIoA6yiiigAooooAo61rVl4e0u81LUbiOz0+zge5ubmY4SKJBud2PYAZJ9ga+FLj/gtD8EIZpFTw348uY1cqssWn2e1wD94BrsEA9sgH2rif8Agr3+1gPDPh23+DHh66Kalq0aXevyRMQ0VnkNHb5HQysNzDP3FAPElfkQpoA/an/h9N8Ev+hU+IH/AILrH/5Mqzpn/BZT4Pa1qlnp1h4M+Il3fXcqwQW8OmWTSSyMQFRVF4SSScAepFfihX6ff8Ei/wBj86tft8bvFdjmztWe28NW8y5EsuCst39E5RP9veeCgoA/VvTbyS/sYZ5bWWxlkRWe2nKmSJiMlWKFlyOnBI96tUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUlV9Q1G30mzmu7uaO1tIEaWaeZwkcaKCWZmJAAABJJ4AFfk3+2p/wAFY9S1a/vfBnwUuG03TYmaG88XDma66AraAj90o5/en5jnK7MbmAP0V+NH7U/wu/Z9s/N8c+L7DSLpl3R6crGa8lHYpBGGcjkc4wM8mvif4kf8FtfCul3E1v4I+Hep63tO0Xes3kdmhweoSMSkj6kV+Supate65qFzf6leXGoahcyGWe6upDJLKx6szNkk+5NU2WgD9Ate/wCC0/xhvmZNL8J+DdMgPTzLe6nlH/AvPVf/AB2saP8A4LJfHaP/AJh3g9v97TZz/wC16+FdtG2gD9IfDP8AwW48f2rAeIvhz4b1VO66Zc3FkT+Lmb2r6V+FX/BYb4OeMpktPFVjrXgS4OAZ7qEXloCeg3w5k/Exgc8mvxJ20dKAP6h/BPj3w/8AEbw/b654Z1mw17Sbgfu73TblLiFj3G5TjI7g8juK3wa/mb+C/wC0B49/Z98SJrfgbxHd6LcZBmt0ctbXIH8M0J+SQdfvDjORg81+0X7EP/BQzwx+1Fbp4d1mKDwv8RY4976Y037i/wADLSWpY5PGSYj8yjkFgCQAfYdFFFACV8uftJf8FCvBP7K/jiHwz408IeM5pbm3W6tNR0mztZbO6jPDbHe5Rsq2VYFQQRnoQT9SV86/ty/ss2X7VHwVvNEiSKLxbpu+90C8k+XZcBeYmbGfLlACN6Ha2DtAoA8L/wCH0/wT/wChT+IP/gusv/kyj/h9P8E/+hT+IP8A4LrL/wCTK/GTWNHvdA1S803UbWWyv7OZ7a4trhCkkUqHa6MvYggj8KpUAf0q/s7/ALRnhH9pz4cxeMvBz3S2DXElpNaagiJc20yHlJFR3AJUo4wx+V175A9QBzX4I/8ABN39qtf2bfjYllrd0IfBHihorHVGkfCWsgY+RdfRGYhv9h2PO0Cv3uVgyhlIKkZBHegBaKKKACiiigDzf9oL4++Fv2a/hnf+N/F0k/8AZls6Qx21mqNcXUrnCxRKzKGbG5uSAArEkAV8kf8AD6v4If8AQrfED/wXWP8A8mV8Uf8ABT79rA/H340SeG9AvGl8EeE5Hs7Z43zFe3YOJrgY4K5+RTyCq7h9+vi2gD9qf+H1fwQ/6Fb4gf8Agusf/kyvQ/gN/wAFNfhz+0Z8SLHwX4R8IeOG1O5R5ZLi8sLRLe1iQZaWVlumKoOBnBOWUAEmvwTr96f+CcP7Ia/s3fB1dU120EXj7xPGl1qLFQHsoSP3VoD2Kj5n/wBtiOdoNAH1/RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfI3/BR/8AZJb9pr4QrfaFbq/jrwws15pi7ebyMqPOtM+rhVKf7aqOAxNfgkytGzK4KspwVYYIPpX9U1fjH/wVe/Y/X4a+Nx8WvC1rs8M+Jbll1a3jTC2WoNli/ss2Gbno4bnDKAAfnrX6O/8ABIf9rD/hC/HFx8HvEV3s0TxDKbjRJJX+W3v8fNCM9pVAwM/fQAAmSvzhWrOmapd6HqNrf2FxJaXlrKs8M8TbXjdTlWB7EGgD+p6ivnb9hf8Aaetv2pPgbp2vTyInibTQuna5bKfu3KL/AK4Dskq4cemWXJ2k19E0AFeb/tDfHPQ/2cvhJr3jvXh51tp0WLezWTZJeXLcRQIcHBZuM4O0ZbBANekV+HX/AAVK/atPxq+Lh8CaDeef4M8HztB5iOGS9vxlZpsjgqnMa9ejkHD0AfIXxI8fa18VPHGs+LfEV0bzWtXuXurqY92bsPRVGFUdgoFc2Bin1a0nS7rXNUs9OsYJLq9u5lggt4ULySyMcKqqBkkkgADuaAPZP2O/2Z9T/am+Nuk+FbdJItEg/wBN1q+UHFvZoRuAPZ3OI192z0Bx/RB4W8N6b4N8O6doWj2cOn6Tp1vHa2lpboEjiiRQqqAOgAFeB/sH/sqWX7KvwXttKnWOXxhrAjvtfu4zkGbadkKk/wAEQJA9WZ243YH0jQAUUUUAFfy9/Eb/AJHzxH/2FLr/ANHNX9Qlfy9/Eb/kfPEf/YUuv/RzUAc3X3x/wRd/5Oo8R/8AYn3f/pXZ18D198f8EXf+TqPEf/Yn3f8A6V2dAH7YUUUUAFJmlrz/AOPnxKg+Dvwb8Y+NZxGw0TSri8ijlOFlmVD5UR/3nKr9TQB+af8AwVm/bOu9S8QTfBXwjqDQaXZbG8S3drJg3MxAZbQMP4EBUuO7YU42HP5hg1e1vWL3xHrF7qupXD3mo3sz3NzcyHLyyOSzOx7kkkn3NUttAD1r3f4A/sUfFn9pILdeEvDpj0TfsbXNUf7NZA99rkFpMcZEasRkccivUv8Agmn+x3Z/tNfErUNY8VQeb4G8MGN7y1JK/b7l93l2+4dEwrM5HOAo/jyP3P0nR7PQtNttP0+2is7G1jWGC2gjWOOKNRhUVVACqBgADoBQB+VPhX/giFqk9vDJ4h+LNpZzFcyQ6XojXCg+iyvMh/HZXQXH/BD/AEd0Itvi9ewyd2k0BXH5C4FfqFTVXbQB+JPxf/4I/wDxe8B2MuoeEtQ0n4hWkeSbexY2t5tHcRSfK3fhZCxxwDXxBr2g6p4V1a60rWdOutJ1O1cxz2V9C0M0TDqrIwBB+or+pevl39tb9iPwz+1X4LuJ0t7fSfiFYwMdM19UwX2g4t7gj70bHjJyUzuXurAH8/NaOh69qHhfWLHVtJu5tP1SxnS5tby3cpJDIpyrKR0IODTvE/hrU/BviLU9B1mzksNW025ktLu1lGHilRirofcEEVmUAf0J/sF/tY2/7V3wZj1K9eOLxlorJY67aRqFHmlfknUZ4SUKxHoyuvRcn6Vr8B/+CZPxquPg/wDtVeHLaS5aLRfFTDQL2LkqzzMPs7YzgETCP5j0VnHev33HPNAC0UUUAfk9/wAFdP2Pjp1wvxu8K2JNvMUt/E1vAvEb4CQ3ePRuI399h5yxH5dV/Uj4p8Nab4y8PahoWs2cOo6RqMElreWlwgZJonUqykHsQa/ni/bI/Zn1H9ln40al4XlE1zoNz/puialIP+PmzYnaCem9CCje4zjDCgDwuv3B/wCCWP7Vy/G74QjwTr14r+MfCMSW4Mr5kvLAALDN/tMgAjY/7KEkluPw+r0v9nL45az+zn8XtB8caKzSSWMu26s92Eu7Zvlmhbt8yk4JB2sFbtQB/S3RXPfD/wAdaP8AE3wXo3irw/dLe6Nq1rHd2s6/xI6g4PowzgjsQQeQa6GgAr4s/wCCn37WC/AP4NP4X0K8MPjnxbHJaWzRHElnZn5Z7gHsxHyIRzubcPuV9beOvG2kfDfwdrPinX7pbLRdItZL27uG/gjRSxwO5OMADkkgDrX85f7THx91j9pX4x67441dWt1u5PKsLFn3iys04hhB7kDljxudnbA3GgDygmipNvvXpP7O/wABvEH7SPxa0XwL4dHl3N8xkubx0LR2VsnMs7jI4UdBkbmKrnLCgD68/wCCUv7Hi/FDx0/xV8T2nneFvDFyBpkDr8t7qCgMG56pDlWyOC+3n5WFfs8uAoA4HauT+Fnw10H4O+AND8HeGbIWOi6RbLbQR55bGSzse7sxLM3csTXW0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVy3xO+G+ifF3wDrng/xFb/atE1i1a1uYu+DghlPZlYKynsVBrqaKAP5pP2jvgLr37Nfxc1vwNrymR7N/Ms77YVS9tWJ8qdOvDAcgE7WDLnK15kTmv3q/wCCj37Io/aT+EY1XQ7MT+PPDCSXWnFQN95AQDLan1ZgAycfeUAY3E1+C8itG7Iy7WU4KkYIoA+kv2Bv2oZP2X/jlZalqE7L4O1rbp+uw8lViJylwFGctE3zdCdpkUY3Zr+gy1uo7y3jnhkWWGRQ6OhyGUjIIPcYr+WFW9q/YP8A4Jd/tq6RefBPWvBPjvWI7S88CafJqMF5cMf3mkx5LD3MPC8dVeMAfKSQD2P/AIKS/tXJ+zv8FZNM0W7WHxv4pSSy0wxviS1hIAnus/wlQ21TkHe6kZ2mvwZ8w17D+1j+0Lqf7Tnxq1rxxfb4LGVvsul6e75+x2UZPlRgepyztjq7ueM4rxygCTNfp7/wSN/ZDfUtU/4Xb4otCLK0Z7fw3bzICs0vKy3XPZOUX/a3ngoM/GX7Hf7M+p/tTfGjS/CtuskGhwMLzWtQVSRbWin5hn++5wi+7Z6A1/Q/4Z8Mab4N8O6ZoOi2cOn6RpttHaWlpAoVIokUKqgD0AFAGoKWiigAooooAK/l7+I3/I+eI/8AsKXX/o5q/qEr+Xv4jf8AI+eI/wDsKXX/AKOagDm6++P+CLv/ACdR4j/7E+7/APSuzr4Hr74/4Iu/8nUeI/8AsT7v/wBK7OgD9sKKKKACvkr/AIKo6hJZfsQ+OkjOPtM+nQMf9k3sLH/0GvrWvnT/AIKF+A7r4jfsdfErSbKNpLqGwXUkVRkkWsqXLADuSsTD8e/SgD+eKiiigD9xv+CP+i22m/sipfRLi41LXr24uG/vMojiH/jsa19wrX5Gf8Eg/wBrDQvBEmqfCDxVex6XFq999v0O+uXCQtctGqSWzMeFZxGjJk4Ztyj5mUH9cwMUALRRRQAUUUUAfiR/wWL+Gdl4N/aW03xJYIsUfinSUubpFwP9KhYwu2B6xrD9SDXwdX9SuqeGdI1yRJNR0qyv3QEK11bpIVB643A4qkPh/wCFz/zLekf+AMX/AMTQB/MR4d1q48Oa5p2q2jtHdWN1FdxMpwQ8bBlIPY5Ff1H2N0l5ZwzxHdFIiujeqkAg/rWM3w78Kt18NaQf+3GL/wCJroFUIoVRgDgCgBaKKKACvnH9u39lWz/aq+C9zpECRReL9K33mgXknAWfb80LNjISRV2n3CNg7RX0dSFc4oA/lm1bSL3QdTu9O1C1lsr6zme2uLadCkkUqHDoynoQQR+FU6/UD/grl+x3/ZWo/wDC7vClkRZ3ZS38S20KfLDLgLFd/R+Ef/aCHkua/L8GgD9Nv+CQf7WR0LWbz4LeIrv/AEDUGe+8PSTycR3PWa3BPQScuo6bw46vX63hs1/LRoOuX3hfW7HV9LupbLU7CeO6tbqFtrwyowZHB9QQCPev21T/AIKQaEf2If8AhbRktz4xVBon9jZ5OtbOBt/55bf33X7nHWgD58/4LAftZDUtWtfgn4cuc21jIl74inhfiSbCvBbZHZMiRh/eMfQqRX5fLWhr+v6h4q1zUdZ1a7l1DVdQuJLu7u52y80zsWd2PcliSfrVGgB1fvD/AME2v2SV/Zx+EEes6/ZKnjzxMkd3f7lw1lDt/c2g9CoJZ/8AacjJ2g18O/8ABKf9kP8A4Wt48f4o+JrDf4W8MXSDToZ1IF5qAAZWxjlIsqx6fMyc4DCv2hoAdiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/F7/AIKv/sgH4X+P/wDhanhiw8jwn4kmP9pxQj5LPUWyzNgchZuW9A4bkblA/aGuT+KHwx0D4xeAdc8HeJ7QXui6vbNbTx91zyrqezqwDK3YqDQB/MIvepLe4lt/M8qRo96lG2nqp6ivR/2jPgPr/wCzb8XNb8C+IFLzWT+Za3gQql5atkxTp7MOoBO1gy5yprzUGgBNtWtN0q61i+trGxhku725lWCC2hQvJLIxwqqo5JJIAA7kVWr9OP8Agkb+x/8A25qh+NviuxJsLJ3g8NW8y/LNNgrLde4TlF/2954MYyAfbn7CP7KNj+yv8G7XTp44ZfGWsLHe69eIM5m2/LArHny4wcD1Yu2BuwPpKo1GM1JQAUUUUAFFFFABX8vfxG/5HzxH/wBhS6/9HNX9Qlfy9/Eb/kfPEf8A2FLr/wBHNQBzdffH/BF3/k6jxH/2J93/AOldnXwPX3x/wRd/5Oo8R/8AYn3f/pXZ0AfthRRRQAVDeWcOoWs1tcRrLbzI0ckbdGVhgg/UGpqKAP53/wBuX9lvUP2WvjVf6OkLSeEdTeS88P3235ZLctkwlu8kRYI3cja3AYCvnev6Yfjx8AvCH7Rnw/uvCPjHTxd2Mjebb3EeFns5gDtlif8AhYZ+hBIIINfh7+1d/wAE/wD4k/sv3NxqE1nJ4m8Dhsw+IdOiLLEp6C5QZMJ9z8h7MTwAD5gr7A/Z/wD+CoHxg+B9jaaPfXcPjzw5bjZHZ6+zNcwx4ACxXIO9QAAAH3qBwAK+P6dQB+2/wq/4LD/Brxp5Nv4rs9Y8BX7cO9zCb2zDHoBLCC5+pjUCvq/4f/H74c/FW3jk8I+NtB8QyOu77PYajE849Q0W4OpHoyiv5mmHSgs0f3WI+hoA/qlor+cL4Y/to/Gz4Qyp/wAI58R9djtUwFsb+5N7bL9Ipt6Dr2Hp6Cvsj4P/APBarxLp00Fr8SvBVhrFruxJqPh9zbXAX1MLsyO3ToycUAfrrRXhfwL/AG2PhD+0R5Ft4S8VQDWpBn+w9S/0W+B6kCNjiTHrGWHPWvdKACiiigAooooAKKKKAMnxV4Z03xp4d1LQdZs4dQ0fUraS0u7SdAySxOpVlIPsa/ni/bE/Zp1P9lv40an4VuVmn0af/TdH1CXn7RasflBPQuhBRvdc9CK/ozr5t/bx/ZVsv2qfgvc6XAscXjDRxJfaBdSZAE20b4WI/gkCgH0ZUbnbggH89jc45pRdTC38jzX8ndv8vcdu7GM49cd6n1XSbzQ9Tu9Pv7aWzvrSZ7ee3nQpJFIpwysp6EEEYqrtoAFr0r9nj4E+IP2kPizovgXw6uy5vnL3N4ybo7O2XBlncZGQo6DI3MVXOSK82C4r94f+CbX7IK/s3fCQaxr9siePfE0SXOoApiWxtyA0Vpk8gjO58Y+c452AkA+mvhb8NNC+Dvw/0Pwb4atFstE0e3W2t4lABIHLOx/idmLMzd2YnvXV0gGKWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK574gePtD+F/g3WfFPiO+TT9F0m1kvLqdzyEQdFHVmJIVVHJZgByRXQ1+Of/AAVn/bD/AOE88Xn4PeFrwS+HtAn363cwP8t1fr0gyOqwZ5H/AD0zkAxg0AfHf7UH7Q2uftO/GLWPG+tFoY5j9n06w3blsrNSfKhB743Fie7Mx4zivKFpKVaAFr9Uv+CRP7YCqv8AwpDxTdKD89x4ZupmwTyXls8/UvIn1cf3RX5W1f0LXr/wvrFlq2l3UtjqljPHdWl3CxV4JUYMkinswIBBoA/qW4pa+fP2J/2pNO/as+DNl4h3Q2/iqwC2evafFx5NyBxIq9RHIBuX/gS5JU19B0AFFFFABRRRQAV/L38Rv+R88R/9hS6/9HNX9Qlfy9/Eb/kfPEf/AGFLr/0c1AHN198f8EXf+TqPEf8A2J93/wCldnXwPX3x/wAEXf8Ak6jxH/2J93/6V2dAH7YUUUUAFFFFABUc8Ed1C8UsayxOCrI6hlYHsQeoqSigD5C+O3/BLz4K/Ghrm/sdLl8B+IJdzG+8O7YoHc87ntiDH167AhOeW6V8HfFf/gjj8XvBzT3Hg/VNI8fWK58uKKT7DesPeOU+WPwlJ9q/a6kIzigD+Zv4kfAL4k/CGRx4y8Da74djUhftF9YyJbsT02y42N/wEmvPt26v6pGRW+8oP1FeTePv2S/g58TvMfxJ8OPD1/cSffu47FLe4b6zRBZP/HqAP5tCM02v2a+Ln/BGn4ZeJI7m58BeINW8E3rcx2dx/wATGyHsFciUfUyN9K/OP9pH9iH4pfsvzPc+KdIW/wDDhk8uHxFo5aexcnorNgNExPG2QLk5xuxmgDwW1uprK4jnt5ZIJ42DJLGxVlYdCCOhr75/Y/8A+Cq3i/4U3Nl4a+J8tx4y8IFljXU5GL6lYDpnd/y3Qd1c7vRuNp+AqKAP6jvCXjDR/HnhvTfEPh7UbfWND1KBbi0vrV96Soe49PQg8g5BAIrZr8Uv+CVf7XV98K/itafDHXLwv4N8VXQhtFmbixv34jZfRZDhCMdSh4wc/tbuoAWiiigAooooAK+f/wBtn9p6x/ZX+C9/4kLQz+Ir0NY6Jp8pz590w4dl7xxj52+gXILCvcPEGvWHhXQdR1nVblLPTNPt5Lq5uJDhY4kUszH2ABNfzz/ttftR6h+1X8ZrzxCTJB4asA1jodi/HlWwb77D/npIfmY+6ryFFAHh/iDXr7xRrV9q+q3Ml9ql/PJdXd3M2555nYu7sfUsSao02n0ASWt3LZXEc0MjxSxsHV422sCOhBr99P8Agnb+1sv7UPwZjj1i4VvHfh1Y7LWV6G4GD5V0B/00VTn/AG0fgDFfgMRmvVv2X/2htc/Zh+MWj+N9G3XEUJ+z6jp+/at9ZuR5sLH8Ayk5w6IcHGKAP6UKK574e+PdE+KHgnRfFfh28W/0XV7VLu1mXqVYfdYfwspyrKeVZSDyK6GgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoornviB490T4YeDdX8VeI76PTtD0m2e7u7iQ/dRRnAHdicKFHJJAHJoA+cf+CiH7WkP7Mfwdkh0m7jTx94gD2uiwhgWgXAEt2w9EDYXPBdl4IBx+BE0z3Eryyu0kjkszsclieSSe5r1f9qH9obXP2nPjBrHjbWiYY5m8nT7ANuSytF4jhX1OMsx43OzHAzivJqACv1E/wCCU37E+l+MvCOvfFDx5pcd/pmr21zoui2N0hw0Lo0Vzc/iGeJcekh/umviX9kP9nLU/wBqD42aR4Os2e20zP2rV74LkW1mhG8/7zErGv8AtOO2a/ol8K+GdM8F+HdM0HRbOPT9H0y2jtLSzhBCQxIoVVGT0AAH4UAfzrftbfs76l+zD8cNc8F3nnT6ch+1aTfSj/j7snJ8t8+owyN6MjDpgnxuv3t/4KQ/son9pX4Lte6JbeZ458MLLe6WFGWu4yo861+rhQV/20UZAY1+CTKY2ZXBVlOCpGCD6UAe/fsVftQ6h+yr8ZrLxGDJceHLwLZ63p6n/X2xb76j/npGfnX1wVyAxr+hfQPEGn+KNE0/V9Ku4b/Tb+3jurW6t33xyxOoZHU9wQQa/lqPNfqf/wAEif2vDGx+CHiq9+RjJc+GbmZ+jHLy2eTxz80iD18wd1FAH6r0UlLQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABVKbWbK3neGW7hjkXGULjcM+oq7X8/f/AAU38Ny+G/21/iGJEKxX0lrfQv2dZLWIkj6MHX6qaAP31/t7Tv8An9g/77FOi1mxnnSGK7geR84QSDcfoO9fyyV67+yP4+t/hj+0v8N/Et5IsNjZ63brczM2BHDI/lyOeOiq7H8KAP6S6KKKACiiigBu2qesaLZeINLutN1K2hvtOu4mguLS4iWSKaNhhlZWBBBGQQfWr1FAH4Gf8FHf2UbP9l/40xHw/G8fgzxLE19pcTuW+yMpCzWu4kkhCyFSc/JIgJJBJ+TtvvX7Ef8ABbKysX+Dfw6vpRm+h8QvDF/1ye3dpP1jir8daALNhfXGk6ha31pK0F3bSrNDKvVHUgqR9CBX9M/wZ8cH4m/CXwZ4tJXfrmi2epSKo4V5YEdl+oLYr+ZKv6Lv2F/MH7IPwlEibD/wj9tjnORtyDQB7rRRRQAUUV4B+2t+1Dp37K/wYvtfZoZvEmobrLQ7GTB825I/1jKSMxxg72/4CuQWFAHxd/wV2/bAKKPgf4UvV+by7nxLdQPyOjw2mf8AvmR/+2Yz94V+U9aPiDxBf+KdcvtY1W6lv9Uv55Lq7up23PNK7Fndj6kkmqFAElrayXkyxRKZJXO1EXksfQV+xfwx/wCCY+kz/sU6l4N1+zitPijr4TWn1KRAW0+8RGNtbFufkVXdHIzzNIRn5cfN/wDwSb/ZQ/4Wr8SJPif4htBN4V8KzhbKGRci71H5WQ4PVYgwc/7RTtkV+0wULQB/Lb4k8N6l4P8AEGpaJq9q9jqmm3MlndW8gw0U0bFXU+4IxWYRmv1K/wCCv/7J32Oa3+N/h62xBK0Vj4jggThZOEguz6A4WJj6iLrliPy1BzQB+jX/AASZ/bGT4f8Ailvg/wCKrzy9A1ybfoM8zgJa3zdYCT0WY4xzxIBgHzCR+xlfyuRSvBKksTtHIjBldDgqRyCD2Nfvn/wTr/a4X9p74MRwa1crJ488NrHZ6wP4rlcERXXp+8Cndj+NX4AIFAH1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFfmN/wVu/bE13wPdWHwf8HahNpU97ZC+17ULWQpN5UhYRWysOUyFLvjqrIOhYEA+3vFn7WvwZ8C6o+l6/8AE7wrp2px5Etm2qRPJEw6q6qSVPs2DXQ/Dv46fDz4tbx4N8baF4llQbng03UIppUHPLIG3Doeo7Gv5ka1vCvirVvBOu2etaDqN1pGs2Uomtb+ylaKaFx0KsORQB/UlRXzv+wh+0lJ+1B8ANO8SajHHB4l0+4fStZjhGEN1Gqt5ijsHSRHx0BZgPu19EUAFFFFABX46f8ABWL9sL/hPPFknwf8L3yy+HtDn3a7LCflur5T8sO4HlYckEf89Ac/cFfb3/BQz9riH9mH4PyQ6Tcx/wDCeeIkls9Gi3Ddb8ASXRHpGCNueC5UYIBx+BM00lxK8krtJI7FndzlmJ5JJ7mgCKinV96/8EpP2S2+MHxP/wCFla/arJ4S8JXAa1ilGVu9SADRDHdYgRIf9ryxyCaAPv3/AIJy/sqr+zT8EYJ9XtlTxv4kEd/qrMuHt12/urX/ALZgnd/tu/UAGvrBaNlAGKAHivxJ/wCCrH7J3/CnfipF8QvD1n5HhHxfOzzxxj93ZaictInssg3SL7iQDgCv21WuB+O3wZ0T4/fCvXfA+vrix1OHalwqgyWsy/NFOmf4kYBvfGOhNAH8zIGK0ND1u/8ADes2Wq6Xdy2Go2UyXFtcwNteKRSGVlPYggEVt/FT4a618HviFr3g3xFB9n1jR7prWdR918YKyIe6OpV1PcMDXL0Af0PfsT/tTaf+1V8HLTXQ0MHifTttlrthH8ojuAOJVXqI5R86+nzLklSa+g1r+db9iv8Aaf1D9lT40WPiVTJceHbwCy1uwQ/6+1ZuWX/ppGcOvrtK5AY1/Qz4f8Q6f4q0TT9Z0i8h1HSdQt47q0vLd90c0TqGR1PcEEH8aANKiiigAr+Xv4jf8j54j/7Cl1/6Oav6hK/l7+I3/I+eI/8AsKXX/o5qAObr74/4Iu/8nUeI/wDsT7v/ANK7Ovgevvj/AIIu/wDJ1HiP/sT7v/0rs6AP2wooooAK/KH/AILU/A24GqeC/itYQM9tJEdA1SRcny2UvLbsR6ENMpPbag7iv1erivjN8JtE+OXwz1/wR4hi36Zq1u0LSBcvA/WOZPR0cKwPqtAH8xu2lHFegfHj4I+Jv2ePidq3gnxTbiLULJt0VxGD5V3AxPlzxHujAfgQQeQRXn33qAP3Q/4Jx/tuaZ+0D8P7Dwd4j1FIviRolutvMtxIA2qQIMLcx+r4wHX1+b+Lj7Xr+WXQde1HwvrFnq2kX1xpmqWcqzW15aSmOWGQHIZWHII9RX6IfAX/AILKeMfCNhFpfxJ8MR+NYYgANY0+ZbS82jqZU2mOVvceX75oA/Yqivjbwf8A8FZ/2d/E9uj3/iDVPC0rdLfVtJmZh9WgEqj/AL6xXaN/wUg/ZwXH/F0dPx/153f/AMZoA+laK+J/HH/BXf4A+GrN30W91zxjcYISLTdLkgBPHVrnysD3AJ46V8G/tPf8FVPiJ8ctPuPD/hW0Hw88MTgpOtncma+ulIwyvPgBUPI2oq5BIJYHFAGr/wAFZv2oNL+M3xU0rwR4XvotQ8O+EBKk95bsGiuL6TaJAhHVYwipkcbi+OMGvg4GgjNAGKAL+j6Tda9qtnptjBJc315MkEEEYy0kjEKqgepJFf03fCvwWnw4+GPhLwpGQyaHpNppoZRgHyYVjz+O2vyE/wCCS/7LFz8SvioPinrln/xSvhOb/QPNTi81Hb8u3/ZhDCQn+8YuvOP2koAKKKKAM/xBr1h4W0LUdZ1S5Sz03T7eS6ubiQ4WONFLMxPoACa/np/bc/akvv2qvjXf+IAZIPDFhmy0KycFfLtgc+Yy9pJD87enyrkhQa+0/wDgrz+2AV2fBDwrejny7rxLcwOfZ4bTI/CRx/1zH94V+Vm7dQA2u0+D3wp1343/ABK0DwR4bhWbVtYuRBGz52QpgtJK57IiBnbvhTjJrja/Zz/gkx+yYPhn8PX+KniC1CeJPE8CjTI5l+e1048hsZ4MzKr5x9xU/vEUAfZ/wT+EuifAv4X+H/A/h6ARabpNssXmEDfPKeZJnx1d3LMT6mu7pu2nUAYvjLwlpfjzwrq3hzXLOLUNH1S1ks7q1mXKSRupBB79DwQcg81/Od+1J+z1q37Mvxo1zwTqZee2hb7Tpl+U2re2Tk+VKPyZWAJwyOO1f0l18f8A/BSr9lA/tF/BZ9V0K187xv4VWW+02ONcvdwkDz7YDuWCqyjrvRQMbjQB+DW2vU/2Y/2gdb/Zl+L+j+NtGzMkDfZ9Qsd2EvrNyPNgb6gAg87WVW7Yry3BViCMEcEHtQ1AH9QHw5+IGifFTwPovi3w3eLf6HrFsl1azr1KsOVYdmU5Vl6hlIPIrpK/G/8A4JNftiJ8O/GEnwj8VXnl+H/EFxv0W4lfCWd8QcxEnokuABzw4HH7wkfshQAUUUUAFFFFABRRRQAUUUUAFfgv/wAFXtOvrH9tbxZcXa4gvrLT7i0OOsQtY4j+Ukco+oNfvRXx/wD8FBv2HV/av8K2GraBcW+neP8ARI3S0knBEN9CfmNvKwBK4bLI2CASQeGyAD8GQc0AYr2LxZ+x38bfBOsS6bqfwt8U/aYzgtZ6bJdwsR12ywh0Ye4Y123wX/4J2/HD4xa1bW58Gaj4S0pmHn6r4jtns0iTP3ljcB5DwcBVIPcgc0Afd/8AwRN02/T4R/ETU5Qf7NudagggJ7yx24Mv6Sx1+j9ee/AP4J6F+z18K9D8DeHy8tlpsf7y6mAElzMx3SSvjuzE8dhgdq9CoAK574gePNE+GPg3V/FXiO9j07Q9Jtnu7u4kP3UUZwB3YnChRySQBya6Gvjv/goB+zZ8Zv2qNH0fwl4H1vwvonguIi81GPWLy5iuL24DHy1Kx28g8pB8wBblmyQNgNAH46ftPftC67+058YNY8b63mCOdhBp+nhiyWVomRHEPfBLMRjLsxwM4ryivv7/AIcrfG//AKGn4f8A/gxvv/kOj/hyt8b/APoafh//AODG+/8AkOgD4v8AhL8L9e+NHxG0DwV4btvtOsaxdLbQg52Rg8vI+OiIoZ2PZVJr+jf4E/BvRPgD8KvD3gXw+ubDSbcRtcMgV7mU/NJM+P4ncs3tnHQV8w/8E9/+CfF1+ytd6/4n8a32la14zv1+yWc2kvJJb2loQC+DLGhLu2M/LwEAB5Nfb1AAKWiigApKWigD85f+CuP7KP8AwnngZPi74ctA2ueHIPL1mKJSXubEHiXA6mEliTj/AFZJJxGBX45+ZX9Tt9YQ6hbS21zGlxbTIY5YJVDJIhGCpB6givyL+K//AARl8e6l8QtdufAHiTwja+Dprp5NNt9YvLqO6gjY7vKcR28ikIxZQdxJABODwAD81m+av1N/4JF/thGKb/hR/iu+/dSF7jwxcTt91uXltM+h5dB2O8c5UDzD/hyv8bf+hq+H/wD4Mb7/AOQ6vaJ/wRz+PfhrVrPVNM8aeA7HUbOZLi2uoNTvllhkRgyujCz4YEA5oA/ZmlrmvhxH4oj8E6Mvjb+yz4uS1RNUfRXd7OSccNJEXRGCt97BX5c4ycZPS0AFfy9/Ecf8V34j/wCwpd/+jmr+oSvxs8W/8Eb/AIz694m1fULbxR4EW3ur2a4RZb+9DhXcsAQLQ4OD60AfnVX3x/wRd/5Oo8R/9ifd/wDpXZ1N/wAOVvjb/wBDV4B/8D77/wCQ6+m/+CfX/BPL4ifsofGjVvF/i7W/DOo6dd6FNpUcOi3FzLKJHnt5AxElvGAoELdyckcUAfofRRRQAUUUUAeCftbfseeD/wBrXwamna0P7L8QWWX0vX7eIPNaueqsCQJIzj5kPXAIIIBr8Lf2iP2W/iB+zD4oOj+NNIaGGRj9j1W2zJZ3qj+KKTHPupwwyMqMjP8ASbWJ4y8E6D8Q/D11oXiXSLPW9Iul2zWd9Cssbj3VhigD+XKnKa/Yr45f8EaPAviq4ub/AOGniO68GXjhnTSdQU3tluzwFbIljXryTJ24r4z8ff8ABKb9ofwPPL9j8NWHi20j/wCXrQ9SiYN9I5jHIf8AvmgD5AanV63rH7Inxv0Hf9t+EfjRAv3ni0K5lQf8CRCKyF/Zx+LT9Phf4z/8J+7/APjdAHnBGKK9x8M/sR/HrxbcRw2Pwn8UQGQ4VtS097FPxafYB+dfQHw2/wCCO3xo8UzRSeK73Q/A1nkCUXFz9tuVHPISHMZxjvKOooA+EK+xP2M/+CdHjP8AaQvLLxH4it7rwr8Nw6vJqEse251CPqUtUPXI48wjaM5G8jFfoz8AP+CWXwb+DMltqOsWknxD1+IBhda8itaRv3aO1GU54/1nmEYGCK+yPrQBgeAfAuh/DPwfpXhbw1p8OlaFpUC21pZwjARAOpPVmJySx5JJJySTXQUUUAFfP/7bf7UOnfsr/BPUdfLpN4m1BWstCsSeZrkj75H9yMHe30C9WFfQFfmh+2j+wD8f/wBrT4xXXiQ+JPBFj4ZslNpoemTajebre3zks4FpjzXb5mwTjhckKDQB+S3iDXtQ8Ua1favq15LqGqX073N1dTNueWR2LMxPckkmqC19+/8ADlb43f8AQ0eA/wDwYXv/AMiU5f8Agit8bf8AoafAf/gfe/8AyJQB4/8A8E/P2VpP2ovjZBbalAx8FeHzFqGuzY+WRNx8u1z2MzKR67FkIORz/QJbwx28KRxIscaKFVVAAAHAAA6CvDv2N/2ZdP8A2V/gxp3hKOWG+12VvtmtalCpxc3TDBClgCY0ChEyBwoJAJNe60AFFFFABRRRQB+Hv/BU39k9vgl8W/8AhO/D9qsfgzxfOzlI1xHY6hjMsXsr8yL9XAGFFfDoNf0vftBfBPRf2hPhNr/gbXUH2TUoCIbgIC9rcKQ0U6e6MAcDqMjoa/Jxv+CLPxuTp4o8At/3EL7/AOQ6APgWOR7eVJYnaOVGDI6HBUjoQfWv3u/4J0/tdD9pr4OrZ63crJ488NLHZ6uSfmulwRFdf8DCkNg/fRjwCBXwV/w5b+N5/wCZm8Bf+DC+/wDkOvVf2Y/+Cbn7RX7Mfxe0fxto3ivwJIkDeTqGnrqN8FvbRiBJC2LP6Mvoyq38NAH6q0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z - detail: auto - model: gpt-4.1-nano - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"HNtJFJ1V"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hGatHmg"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - image"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"oxcq"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - shows"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"k1xl"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"61sHeM"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - text"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"686ay"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - \"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iPJvQu"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"xlsx"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ipMqke"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NQFN1xds"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"foamn"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5rtdFNoP"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - vertical"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"k"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - line"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6YEXO"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jrniaet"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BxRMoc"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - middle"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Huq"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1Oh7JQ4yR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - dividing"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"X"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - it"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3f5phUj"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - into"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"KuzgW"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - two"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EopfPQ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - parts"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hvZi"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gso4jqApi"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - This"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JekxX"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - likely"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"VsT"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - represents"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pjmsFQA0FIAs6vZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"GRK8HJ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - file"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sTR5o"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - extension"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XtotCL"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - an"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yZnbcPA"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - Excel"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5NuZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - spreadsheet"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"glmQ7NDlvj1OVH"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - file"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9yatv"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Pc9BBTmOw"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - often"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"6OyR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - associated"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3LFC90ZDVxH9E4l"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"cQvQ2"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - Microsoft"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - Excel"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ozDm"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dypWuqNUr"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Yns0"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTEdl7Ebpr07ZIjqvbOsmfNqsE8","object":"chat.completion.chunk","created":1784619984,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[],"usage":{"prompt_tokens":644,"completion_tokens":40,"total_tokens":684,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"aKhMZNp"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream.yaml b/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream.yaml deleted file mode 100644 index d3575c7..0000000 --- a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-non-stream.yaml +++ /dev/null @@ -1,59 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '21957' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: - - type: text - text: What is shown in this image? - - type: image_url - image_url: - url: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9UKKKKAH0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX4OeNP+Cmf7SOk+LNbsrX4jeXa29/cQwx/2HpjbUWRlUZNsSeBX7x1/L38Rv8AkfPEf/YUuv8A0c1AH0N/w9E/aY/6KT/5QdL/APkWvrj/AIJk/tmfGD9ob4/ax4c8f+Lzr2jW3hy41CO1/s2ytsTLcWyK26GFG4WV+M456V+Ttfe3/BF//k6jxF/2J93/AOldnQB+2VFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXjn7Tn7T2hfsq+ELDxR4m8O+Ita0S4ufsstzoFvBN9lcjKeaJJo8BvmAIyMrg4JXPsdcz8SPh5onxW8E614T8R2i3uiavavaXMJA3bWH3lP8LqQGVuzKD1AoA+Jv+H1XwR/6FX4gf8Agvsf/kyj/h9V8EP+hV+IH/gvsf8A5Mr8qf2lPgBr37M/xg1zwNrqtL9kfzbC/wBhVL60YkxTqPcDBAJ2srrklTXl1AH9Cf7Ln7fHw3/a18RaxofhK01vStU022W7a216CCF54ixUtEIppMhDtDE4x5idc8fSdfzKfA74wa38BPij4f8AHPh5/wDiY6TcrKYWYrHcREFZYXx/C6FlPpn1r+j/AOFPxM0X4yfDvQPGnh2fz9H1m1W5hJI3oTw8b44DowZGHZlIoA6yiiigAooooAo61rVl4e0u81LUbiOz0+zge5ubmY4SKJBud2PYAZJ9ga+FLj/gtD8EIZpFTw348uY1cqssWn2e1wD94BrsEA9sgH2rif8Agr3+1gPDPh23+DHh66Kalq0aXevyRMQ0VnkNHb5HQysNzDP3FAPElfkQpoA/an/h9N8Ev+hU+IH/AILrH/5Mqzpn/BZT4Pa1qlnp1h4M+Il3fXcqwQW8OmWTSSyMQFRVF4SSScAepFfihX6ff8Ei/wBj86tft8bvFdjmztWe28NW8y5EsuCst39E5RP9veeCgoA/VvTbyS/sYZ5bWWxlkRWe2nKmSJiMlWKFlyOnBI96tUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUlV9Q1G30mzmu7uaO1tIEaWaeZwkcaKCWZmJAAABJJ4AFfk3+2p/wAFY9S1a/vfBnwUuG03TYmaG88XDma66AraAj90o5/en5jnK7MbmAP0V+NH7U/wu/Z9s/N8c+L7DSLpl3R6crGa8lHYpBGGcjkc4wM8mvif4kf8FtfCul3E1v4I+Hep63tO0Xes3kdmhweoSMSkj6kV+Supate65qFzf6leXGoahcyGWe6upDJLKx6szNkk+5NU2WgD9Ate/wCC0/xhvmZNL8J+DdMgPTzLe6nlH/AvPVf/AB2saP8A4LJfHaP/AJh3g9v97TZz/wC16+FdtG2gD9IfDP8AwW48f2rAeIvhz4b1VO66Zc3FkT+Lmb2r6V+FX/BYb4OeMpktPFVjrXgS4OAZ7qEXloCeg3w5k/Exgc8mvxJ20dKAP6h/BPj3w/8AEbw/b654Z1mw17Sbgfu73TblLiFj3G5TjI7g8juK3wa/mb+C/wC0B49/Z98SJrfgbxHd6LcZBmt0ctbXIH8M0J+SQdfvDjORg81+0X7EP/BQzwx+1Fbp4d1mKDwv8RY4976Y037i/wADLSWpY5PGSYj8yjkFgCQAfYdFFFACV8uftJf8FCvBP7K/jiHwz408IeM5pbm3W6tNR0mztZbO6jPDbHe5Rsq2VYFQQRnoQT9SV86/ty/ss2X7VHwVvNEiSKLxbpu+90C8k+XZcBeYmbGfLlACN6Ha2DtAoA8L/wCH0/wT/wChT+IP/gusv/kyj/h9P8E/+hT+IP8A4LrL/wCTK/GTWNHvdA1S803UbWWyv7OZ7a4trhCkkUqHa6MvYggj8KpUAf0q/s7/ALRnhH9pz4cxeMvBz3S2DXElpNaagiJc20yHlJFR3AJUo4wx+V175A9QBzX4I/8ABN39qtf2bfjYllrd0IfBHihorHVGkfCWsgY+RdfRGYhv9h2PO0Cv3uVgyhlIKkZBHegBaKKKACiiigDzf9oL4++Fv2a/hnf+N/F0k/8AZls6Qx21mqNcXUrnCxRKzKGbG5uSAArEkAV8kf8AD6v4If8AQrfED/wXWP8A8mV8Uf8ABT79rA/H340SeG9AvGl8EeE5Hs7Z43zFe3YOJrgY4K5+RTyCq7h9+vi2gD9qf+H1fwQ/6Fb4gf8Agusf/kyvQ/gN/wAFNfhz+0Z8SLHwX4R8IeOG1O5R5ZLi8sLRLe1iQZaWVlumKoOBnBOWUAEmvwTr96f+CcP7Ia/s3fB1dU120EXj7xPGl1qLFQHsoSP3VoD2Kj5n/wBtiOdoNAH1/RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfI3/BR/8AZJb9pr4QrfaFbq/jrwws15pi7ebyMqPOtM+rhVKf7aqOAxNfgkytGzK4KspwVYYIPpX9U1fjH/wVe/Y/X4a+Nx8WvC1rs8M+Jbll1a3jTC2WoNli/ss2Gbno4bnDKAAfnrX6O/8ABIf9rD/hC/HFx8HvEV3s0TxDKbjRJJX+W3v8fNCM9pVAwM/fQAAmSvzhWrOmapd6HqNrf2FxJaXlrKs8M8TbXjdTlWB7EGgD+p6ivnb9hf8Aaetv2pPgbp2vTyInibTQuna5bKfu3KL/AK4Dskq4cemWXJ2k19E0AFeb/tDfHPQ/2cvhJr3jvXh51tp0WLezWTZJeXLcRQIcHBZuM4O0ZbBANekV+HX/AAVK/atPxq+Lh8CaDeef4M8HztB5iOGS9vxlZpsjgqnMa9ejkHD0AfIXxI8fa18VPHGs+LfEV0bzWtXuXurqY92bsPRVGFUdgoFc2Bin1a0nS7rXNUs9OsYJLq9u5lggt4ULySyMcKqqBkkkgADuaAPZP2O/2Z9T/am+Nuk+FbdJItEg/wBN1q+UHFvZoRuAPZ3OI192z0Bx/RB4W8N6b4N8O6doWj2cOn6Tp1vHa2lpboEjiiRQqqAOgAFeB/sH/sqWX7KvwXttKnWOXxhrAjvtfu4zkGbadkKk/wAEQJA9WZ243YH0jQAUUUUAFfy9/Eb/AJHzxH/2FLr/ANHNX9Qlfy9/Eb/kfPEf/YUuv/RzUAc3X3x/wRd/5Oo8R/8AYn3f/pXZ18D198f8EXf+TqPEf/Yn3f8A6V2dAH7YUUUUAFJmlrz/AOPnxKg+Dvwb8Y+NZxGw0TSri8ijlOFlmVD5UR/3nKr9TQB+af8AwVm/bOu9S8QTfBXwjqDQaXZbG8S3drJg3MxAZbQMP4EBUuO7YU42HP5hg1e1vWL3xHrF7qupXD3mo3sz3NzcyHLyyOSzOx7kkkn3NUttAD1r3f4A/sUfFn9pILdeEvDpj0TfsbXNUf7NZA99rkFpMcZEasRkccivUv8Agmn+x3Z/tNfErUNY8VQeb4G8MGN7y1JK/b7l93l2+4dEwrM5HOAo/jyP3P0nR7PQtNttP0+2is7G1jWGC2gjWOOKNRhUVVACqBgADoBQB+VPhX/giFqk9vDJ4h+LNpZzFcyQ6XojXCg+iyvMh/HZXQXH/BD/AEd0Itvi9ewyd2k0BXH5C4FfqFTVXbQB+JPxf/4I/wDxe8B2MuoeEtQ0n4hWkeSbexY2t5tHcRSfK3fhZCxxwDXxBr2g6p4V1a60rWdOutJ1O1cxz2V9C0M0TDqrIwBB+or+pevl39tb9iPwz+1X4LuJ0t7fSfiFYwMdM19UwX2g4t7gj70bHjJyUzuXurAH8/NaOh69qHhfWLHVtJu5tP1SxnS5tby3cpJDIpyrKR0IODTvE/hrU/BviLU9B1mzksNW025ktLu1lGHilRirofcEEVmUAf0J/sF/tY2/7V3wZj1K9eOLxlorJY67aRqFHmlfknUZ4SUKxHoyuvRcn6Vr8B/+CZPxquPg/wDtVeHLaS5aLRfFTDQL2LkqzzMPs7YzgETCP5j0VnHev33HPNAC0UUUAfk9/wAFdP2Pjp1wvxu8K2JNvMUt/E1vAvEb4CQ3ePRuI399h5yxH5dV/Uj4p8Nab4y8PahoWs2cOo6RqMElreWlwgZJonUqykHsQa/ni/bI/Zn1H9ln40al4XlE1zoNz/puialIP+PmzYnaCem9CCje4zjDCgDwuv3B/wCCWP7Vy/G74QjwTr14r+MfCMSW4Mr5kvLAALDN/tMgAjY/7KEkluPw+r0v9nL45az+zn8XtB8caKzSSWMu26s92Eu7Zvlmhbt8yk4JB2sFbtQB/S3RXPfD/wAdaP8AE3wXo3irw/dLe6Nq1rHd2s6/xI6g4PowzgjsQQeQa6GgAr4s/wCCn37WC/AP4NP4X0K8MPjnxbHJaWzRHElnZn5Z7gHsxHyIRzubcPuV9beOvG2kfDfwdrPinX7pbLRdItZL27uG/gjRSxwO5OMADkkgDrX85f7THx91j9pX4x67441dWt1u5PKsLFn3iys04hhB7kDljxudnbA3GgDygmipNvvXpP7O/wABvEH7SPxa0XwL4dHl3N8xkubx0LR2VsnMs7jI4UdBkbmKrnLCgD68/wCCUv7Hi/FDx0/xV8T2nneFvDFyBpkDr8t7qCgMG56pDlWyOC+3n5WFfs8uAoA4HauT+Fnw10H4O+AND8HeGbIWOi6RbLbQR55bGSzse7sxLM3csTXW0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVy3xO+G+ifF3wDrng/xFb/atE1i1a1uYu+DghlPZlYKynsVBrqaKAP5pP2jvgLr37Nfxc1vwNrymR7N/Ms77YVS9tWJ8qdOvDAcgE7WDLnK15kTmv3q/wCCj37Io/aT+EY1XQ7MT+PPDCSXWnFQN95AQDLan1ZgAycfeUAY3E1+C8itG7Iy7WU4KkYIoA+kv2Bv2oZP2X/jlZalqE7L4O1rbp+uw8lViJylwFGctE3zdCdpkUY3Zr+gy1uo7y3jnhkWWGRQ6OhyGUjIIPcYr+WFW9q/YP8A4Jd/tq6RefBPWvBPjvWI7S88CafJqMF5cMf3mkx5LD3MPC8dVeMAfKSQD2P/AIKS/tXJ+zv8FZNM0W7WHxv4pSSy0wxviS1hIAnus/wlQ21TkHe6kZ2mvwZ8w17D+1j+0Lqf7Tnxq1rxxfb4LGVvsul6e75+x2UZPlRgepyztjq7ueM4rxygCTNfp7/wSN/ZDfUtU/4Xb4otCLK0Z7fw3bzICs0vKy3XPZOUX/a3ngoM/GX7Hf7M+p/tTfGjS/CtuskGhwMLzWtQVSRbWin5hn++5wi+7Z6A1/Q/4Z8Mab4N8O6ZoOi2cOn6RpttHaWlpAoVIokUKqgD0AFAGoKWiigAooooAK/l7+I3/I+eI/8AsKXX/o5q/qEr+Xv4jf8AI+eI/wDsKXX/AKOagDm6++P+CLv/ACdR4j/7E+7/APSuzr4Hr74/4Iu/8nUeI/8AsT7v/wBK7OgD9sKKKKACvkr/AIKo6hJZfsQ+OkjOPtM+nQMf9k3sLH/0GvrWvnT/AIKF+A7r4jfsdfErSbKNpLqGwXUkVRkkWsqXLADuSsTD8e/SgD+eKiiigD9xv+CP+i22m/sipfRLi41LXr24uG/vMojiH/jsa19wrX5Gf8Eg/wBrDQvBEmqfCDxVex6XFq999v0O+uXCQtctGqSWzMeFZxGjJk4Ztyj5mUH9cwMUALRRRQAUUUUAfiR/wWL+Gdl4N/aW03xJYIsUfinSUubpFwP9KhYwu2B6xrD9SDXwdX9SuqeGdI1yRJNR0qyv3QEK11bpIVB643A4qkPh/wCFz/zLekf+AMX/AMTQB/MR4d1q48Oa5p2q2jtHdWN1FdxMpwQ8bBlIPY5Ff1H2N0l5ZwzxHdFIiujeqkAg/rWM3w78Kt18NaQf+3GL/wCJroFUIoVRgDgCgBaKKKACvnH9u39lWz/aq+C9zpECRReL9K33mgXknAWfb80LNjISRV2n3CNg7RX0dSFc4oA/lm1bSL3QdTu9O1C1lsr6zme2uLadCkkUqHDoynoQQR+FU6/UD/grl+x3/ZWo/wDC7vClkRZ3ZS38S20KfLDLgLFd/R+Ef/aCHkua/L8GgD9Nv+CQf7WR0LWbz4LeIrv/AEDUGe+8PSTycR3PWa3BPQScuo6bw46vX63hs1/LRoOuX3hfW7HV9LupbLU7CeO6tbqFtrwyowZHB9QQCPev21T/AIKQaEf2If8AhbRktz4xVBon9jZ5OtbOBt/55bf33X7nHWgD58/4LAftZDUtWtfgn4cuc21jIl74inhfiSbCvBbZHZMiRh/eMfQqRX5fLWhr+v6h4q1zUdZ1a7l1DVdQuJLu7u52y80zsWd2PcliSfrVGgB1fvD/AME2v2SV/Zx+EEes6/ZKnjzxMkd3f7lw1lDt/c2g9CoJZ/8AacjJ2g18O/8ABKf9kP8A4Wt48f4o+JrDf4W8MXSDToZ1IF5qAAZWxjlIsqx6fMyc4DCv2hoAdiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/F7/AIKv/sgH4X+P/wDhanhiw8jwn4kmP9pxQj5LPUWyzNgchZuW9A4bkblA/aGuT+KHwx0D4xeAdc8HeJ7QXui6vbNbTx91zyrqezqwDK3YqDQB/MIvepLe4lt/M8qRo96lG2nqp6ivR/2jPgPr/wCzb8XNb8C+IFLzWT+Za3gQql5atkxTp7MOoBO1gy5yprzUGgBNtWtN0q61i+trGxhku725lWCC2hQvJLIxwqqo5JJIAA7kVWr9OP8Agkb+x/8A25qh+NviuxJsLJ3g8NW8y/LNNgrLde4TlF/2954MYyAfbn7CP7KNj+yv8G7XTp44ZfGWsLHe69eIM5m2/LArHny4wcD1Yu2BuwPpKo1GM1JQAUUUUAFFFFABX8vfxG/5HzxH/wBhS6/9HNX9Qlfy9/Eb/kfPEf8A2FLr/wBHNQBzdffH/BF3/k6jxH/2J93/AOldnXwPX3x/wRd/5Oo8R/8AYn3f/pXZ0AfthRRRQAVDeWcOoWs1tcRrLbzI0ckbdGVhgg/UGpqKAP53/wBuX9lvUP2WvjVf6OkLSeEdTeS88P3235ZLctkwlu8kRYI3cja3AYCvnev6Yfjx8AvCH7Rnw/uvCPjHTxd2Mjebb3EeFns5gDtlif8AhYZ+hBIIINfh7+1d/wAE/wD4k/sv3NxqE1nJ4m8Dhsw+IdOiLLEp6C5QZMJ9z8h7MTwAD5gr7A/Z/wD+CoHxg+B9jaaPfXcPjzw5bjZHZ6+zNcwx4ACxXIO9QAAAH3qBwAK+P6dQB+2/wq/4LD/Brxp5Nv4rs9Y8BX7cO9zCb2zDHoBLCC5+pjUCvq/4f/H74c/FW3jk8I+NtB8QyOu77PYajE849Q0W4OpHoyiv5mmHSgs0f3WI+hoA/qlor+cL4Y/to/Gz4Qyp/wAI58R9djtUwFsb+5N7bL9Ipt6Dr2Hp6Cvsj4P/APBarxLp00Fr8SvBVhrFruxJqPh9zbXAX1MLsyO3ToycUAfrrRXhfwL/AG2PhD+0R5Ft4S8VQDWpBn+w9S/0W+B6kCNjiTHrGWHPWvdKACiiigAooooAKKKKAMnxV4Z03xp4d1LQdZs4dQ0fUraS0u7SdAySxOpVlIPsa/ni/bE/Zp1P9lv40an4VuVmn0af/TdH1CXn7RasflBPQuhBRvdc9CK/ozr5t/bx/ZVsv2qfgvc6XAscXjDRxJfaBdSZAE20b4WI/gkCgH0ZUbnbggH89jc45pRdTC38jzX8ndv8vcdu7GM49cd6n1XSbzQ9Tu9Pv7aWzvrSZ7ee3nQpJFIpwysp6EEEYqrtoAFr0r9nj4E+IP2kPizovgXw6uy5vnL3N4ybo7O2XBlncZGQo6DI3MVXOSK82C4r94f+CbX7IK/s3fCQaxr9siePfE0SXOoApiWxtyA0Vpk8gjO58Y+c452AkA+mvhb8NNC+Dvw/0Pwb4atFstE0e3W2t4lABIHLOx/idmLMzd2YnvXV0gGKWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK574gePtD+F/g3WfFPiO+TT9F0m1kvLqdzyEQdFHVmJIVVHJZgByRXQ1+Of/AAVn/bD/AOE88Xn4PeFrwS+HtAn363cwP8t1fr0gyOqwZ5H/AD0zkAxg0AfHf7UH7Q2uftO/GLWPG+tFoY5j9n06w3blsrNSfKhB743Fie7Mx4zivKFpKVaAFr9Uv+CRP7YCqv8AwpDxTdKD89x4ZupmwTyXls8/UvIn1cf3RX5W1f0LXr/wvrFlq2l3UtjqljPHdWl3CxV4JUYMkinswIBBoA/qW4pa+fP2J/2pNO/as+DNl4h3Q2/iqwC2evafFx5NyBxIq9RHIBuX/gS5JU19B0AFFFFABRRRQAV/L38Rv+R88R/9hS6/9HNX9Qlfy9/Eb/kfPEf/AGFLr/0c1AHN198f8EXf+TqPEf8A2J93/wCldnXwPX3x/wAEXf8Ak6jxH/2J93/6V2dAH7YUUUUAFFFFABUc8Ed1C8UsayxOCrI6hlYHsQeoqSigD5C+O3/BLz4K/Ghrm/sdLl8B+IJdzG+8O7YoHc87ntiDH167AhOeW6V8HfFf/gjj8XvBzT3Hg/VNI8fWK58uKKT7DesPeOU+WPwlJ9q/a6kIzigD+Zv4kfAL4k/CGRx4y8Da74djUhftF9YyJbsT02y42N/wEmvPt26v6pGRW+8oP1FeTePv2S/g58TvMfxJ8OPD1/cSffu47FLe4b6zRBZP/HqAP5tCM02v2a+Ln/BGn4ZeJI7m58BeINW8E3rcx2dx/wATGyHsFciUfUyN9K/OP9pH9iH4pfsvzPc+KdIW/wDDhk8uHxFo5aexcnorNgNExPG2QLk5xuxmgDwW1uprK4jnt5ZIJ42DJLGxVlYdCCOhr75/Y/8A+Cq3i/4U3Nl4a+J8tx4y8IFljXU5GL6lYDpnd/y3Qd1c7vRuNp+AqKAP6jvCXjDR/HnhvTfEPh7UbfWND1KBbi0vrV96Soe49PQg8g5BAIrZr8Uv+CVf7XV98K/itafDHXLwv4N8VXQhtFmbixv34jZfRZDhCMdSh4wc/tbuoAWiiigAooooAK+f/wBtn9p6x/ZX+C9/4kLQz+Ir0NY6Jp8pz590w4dl7xxj52+gXILCvcPEGvWHhXQdR1nVblLPTNPt5Lq5uJDhY4kUszH2ABNfzz/ttftR6h+1X8ZrzxCTJB4asA1jodi/HlWwb77D/npIfmY+6ryFFAHh/iDXr7xRrV9q+q3Ml9ql/PJdXd3M2555nYu7sfUsSao02n0ASWt3LZXEc0MjxSxsHV422sCOhBr99P8Agnb+1sv7UPwZjj1i4VvHfh1Y7LWV6G4GD5V0B/00VTn/AG0fgDFfgMRmvVv2X/2htc/Zh+MWj+N9G3XEUJ+z6jp+/at9ZuR5sLH8Ayk5w6IcHGKAP6UKK574e+PdE+KHgnRfFfh28W/0XV7VLu1mXqVYfdYfwspyrKeVZSDyK6GgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoornviB490T4YeDdX8VeI76PTtD0m2e7u7iQ/dRRnAHdicKFHJJAHJoA+cf+CiH7WkP7Mfwdkh0m7jTx94gD2uiwhgWgXAEt2w9EDYXPBdl4IBx+BE0z3Eryyu0kjkszsclieSSe5r1f9qH9obXP2nPjBrHjbWiYY5m8nT7ANuSytF4jhX1OMsx43OzHAzivJqACv1E/wCCU37E+l+MvCOvfFDx5pcd/pmr21zoui2N0hw0Lo0Vzc/iGeJcekh/umviX9kP9nLU/wBqD42aR4Os2e20zP2rV74LkW1mhG8/7zErGv8AtOO2a/ol8K+GdM8F+HdM0HRbOPT9H0y2jtLSzhBCQxIoVVGT0AAH4UAfzrftbfs76l+zD8cNc8F3nnT6ch+1aTfSj/j7snJ8t8+owyN6MjDpgnxuv3t/4KQ/son9pX4Lte6JbeZ458MLLe6WFGWu4yo861+rhQV/20UZAY1+CTKY2ZXBVlOCpGCD6UAe/fsVftQ6h+yr8ZrLxGDJceHLwLZ63p6n/X2xb76j/npGfnX1wVyAxr+hfQPEGn+KNE0/V9Ku4b/Tb+3jurW6t33xyxOoZHU9wQQa/lqPNfqf/wAEif2vDGx+CHiq9+RjJc+GbmZ+jHLy2eTxz80iD18wd1FAH6r0UlLQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABVKbWbK3neGW7hjkXGULjcM+oq7X8/f/AAU38Ny+G/21/iGJEKxX0lrfQv2dZLWIkj6MHX6qaAP31/t7Tv8An9g/77FOi1mxnnSGK7geR84QSDcfoO9fyyV67+yP4+t/hj+0v8N/Et5IsNjZ63brczM2BHDI/lyOeOiq7H8KAP6S6KKKACiiigBu2qesaLZeINLutN1K2hvtOu4mguLS4iWSKaNhhlZWBBBGQQfWr1FAH4Gf8FHf2UbP9l/40xHw/G8fgzxLE19pcTuW+yMpCzWu4kkhCyFSc/JIgJJBJ+TtvvX7Ef8ABbKysX+Dfw6vpRm+h8QvDF/1ye3dpP1jir8daALNhfXGk6ha31pK0F3bSrNDKvVHUgqR9CBX9M/wZ8cH4m/CXwZ4tJXfrmi2epSKo4V5YEdl+oLYr+ZKv6Lv2F/MH7IPwlEibD/wj9tjnORtyDQB7rRRRQAUUV4B+2t+1Dp37K/wYvtfZoZvEmobrLQ7GTB825I/1jKSMxxg72/4CuQWFAHxd/wV2/bAKKPgf4UvV+by7nxLdQPyOjw2mf8AvmR/+2Yz94V+U9aPiDxBf+KdcvtY1W6lv9Uv55Lq7up23PNK7Fndj6kkmqFAElrayXkyxRKZJXO1EXksfQV+xfwx/wCCY+kz/sU6l4N1+zitPijr4TWn1KRAW0+8RGNtbFufkVXdHIzzNIRn5cfN/wDwSb/ZQ/4Wr8SJPif4htBN4V8KzhbKGRci71H5WQ4PVYgwc/7RTtkV+0wULQB/Lb4k8N6l4P8AEGpaJq9q9jqmm3MlndW8gw0U0bFXU+4IxWYRmv1K/wCCv/7J32Oa3+N/h62xBK0Vj4jggThZOEguz6A4WJj6iLrliPy1BzQB+jX/AASZ/bGT4f8Ailvg/wCKrzy9A1ybfoM8zgJa3zdYCT0WY4xzxIBgHzCR+xlfyuRSvBKksTtHIjBldDgqRyCD2Nfvn/wTr/a4X9p74MRwa1crJ488NrHZ6wP4rlcERXXp+8Cndj+NX4AIFAH1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFfmN/wVu/bE13wPdWHwf8HahNpU97ZC+17ULWQpN5UhYRWysOUyFLvjqrIOhYEA+3vFn7WvwZ8C6o+l6/8AE7wrp2px5Etm2qRPJEw6q6qSVPs2DXQ/Dv46fDz4tbx4N8baF4llQbng03UIppUHPLIG3Doeo7Gv5ka1vCvirVvBOu2etaDqN1pGs2Uomtb+ylaKaFx0KsORQB/UlRXzv+wh+0lJ+1B8ANO8SajHHB4l0+4fStZjhGEN1Gqt5ijsHSRHx0BZgPu19EUAFFFFABX46f8ABWL9sL/hPPFknwf8L3yy+HtDn3a7LCflur5T8sO4HlYckEf89Ac/cFfb3/BQz9riH9mH4PyQ6Tcx/wDCeeIkls9Gi3Ddb8ASXRHpGCNueC5UYIBx+BM00lxK8krtJI7FndzlmJ5JJ7mgCKinV96/8EpP2S2+MHxP/wCFla/arJ4S8JXAa1ilGVu9SADRDHdYgRIf9ryxyCaAPv3/AIJy/sqr+zT8EYJ9XtlTxv4kEd/qrMuHt12/urX/ALZgnd/tu/UAGvrBaNlAGKAHivxJ/wCCrH7J3/CnfipF8QvD1n5HhHxfOzzxxj93ZaictInssg3SL7iQDgCv21WuB+O3wZ0T4/fCvXfA+vrix1OHalwqgyWsy/NFOmf4kYBvfGOhNAH8zIGK0ND1u/8ADes2Wq6Xdy2Go2UyXFtcwNteKRSGVlPYggEVt/FT4a618HviFr3g3xFB9n1jR7prWdR918YKyIe6OpV1PcMDXL0Af0PfsT/tTaf+1V8HLTXQ0MHifTttlrthH8ojuAOJVXqI5R86+nzLklSa+g1r+db9iv8Aaf1D9lT40WPiVTJceHbwCy1uwQ/6+1ZuWX/ppGcOvrtK5AY1/Qz4f8Q6f4q0TT9Z0i8h1HSdQt47q0vLd90c0TqGR1PcEEH8aANKiiigAr+Xv4jf8j54j/7Cl1/6Oav6hK/l7+I3/I+eI/8AsKXX/o5qAObr74/4Iu/8nUeI/wDsT7v/ANK7Ovgevvj/AIIu/wDJ1HiP/sT7v/0rs6AP2wooooAK/KH/AILU/A24GqeC/itYQM9tJEdA1SRcny2UvLbsR6ENMpPbag7iv1erivjN8JtE+OXwz1/wR4hi36Zq1u0LSBcvA/WOZPR0cKwPqtAH8xu2lHFegfHj4I+Jv2ePidq3gnxTbiLULJt0VxGD5V3AxPlzxHujAfgQQeQRXn33qAP3Q/4Jx/tuaZ+0D8P7Dwd4j1FIviRolutvMtxIA2qQIMLcx+r4wHX1+b+Lj7Xr+WXQde1HwvrFnq2kX1xpmqWcqzW15aSmOWGQHIZWHII9RX6IfAX/AILKeMfCNhFpfxJ8MR+NYYgANY0+ZbS82jqZU2mOVvceX75oA/Yqivjbwf8A8FZ/2d/E9uj3/iDVPC0rdLfVtJmZh9WgEqj/AL6xXaN/wUg/ZwXH/F0dPx/153f/AMZoA+laK+J/HH/BXf4A+GrN30W91zxjcYISLTdLkgBPHVrnysD3AJ46V8G/tPf8FVPiJ8ctPuPD/hW0Hw88MTgpOtncma+ulIwyvPgBUPI2oq5BIJYHFAGr/wAFZv2oNL+M3xU0rwR4XvotQ8O+EBKk95bsGiuL6TaJAhHVYwipkcbi+OMGvg4GgjNAGKAL+j6Tda9qtnptjBJc315MkEEEYy0kjEKqgepJFf03fCvwWnw4+GPhLwpGQyaHpNppoZRgHyYVjz+O2vyE/wCCS/7LFz8SvioPinrln/xSvhOb/QPNTi81Hb8u3/ZhDCQn+8YuvOP2koAKKKKAM/xBr1h4W0LUdZ1S5Sz03T7eS6ubiQ4WONFLMxPoACa/np/bc/akvv2qvjXf+IAZIPDFhmy0KycFfLtgc+Yy9pJD87enyrkhQa+0/wDgrz+2AV2fBDwrejny7rxLcwOfZ4bTI/CRx/1zH94V+Vm7dQA2u0+D3wp1343/ABK0DwR4bhWbVtYuRBGz52QpgtJK57IiBnbvhTjJrja/Zz/gkx+yYPhn8PX+KniC1CeJPE8CjTI5l+e1048hsZ4MzKr5x9xU/vEUAfZ/wT+EuifAv4X+H/A/h6ARabpNssXmEDfPKeZJnx1d3LMT6mu7pu2nUAYvjLwlpfjzwrq3hzXLOLUNH1S1ks7q1mXKSRupBB79DwQcg81/Od+1J+z1q37Mvxo1zwTqZee2hb7Tpl+U2re2Tk+VKPyZWAJwyOO1f0l18f8A/BSr9lA/tF/BZ9V0K187xv4VWW+02ONcvdwkDz7YDuWCqyjrvRQMbjQB+DW2vU/2Y/2gdb/Zl+L+j+NtGzMkDfZ9Qsd2EvrNyPNgb6gAg87WVW7Yry3BViCMEcEHtQ1AH9QHw5+IGifFTwPovi3w3eLf6HrFsl1azr1KsOVYdmU5Vl6hlIPIrpK/G/8A4JNftiJ8O/GEnwj8VXnl+H/EFxv0W4lfCWd8QcxEnokuABzw4HH7wkfshQAUUUUAFFFFABRRRQAUUUUAFfgv/wAFXtOvrH9tbxZcXa4gvrLT7i0OOsQtY4j+Ukco+oNfvRXx/wD8FBv2HV/av8K2GraBcW+neP8ARI3S0knBEN9CfmNvKwBK4bLI2CASQeGyAD8GQc0AYr2LxZ+x38bfBOsS6bqfwt8U/aYzgtZ6bJdwsR12ywh0Ye4Y123wX/4J2/HD4xa1bW58Gaj4S0pmHn6r4jtns0iTP3ljcB5DwcBVIPcgc0Afd/8AwRN02/T4R/ETU5Qf7NudagggJ7yx24Mv6Sx1+j9ee/AP4J6F+z18K9D8DeHy8tlpsf7y6mAElzMx3SSvjuzE8dhgdq9CoAK574gePNE+GPg3V/FXiO9j07Q9Jtnu7u4kP3UUZwB3YnChRySQBya6Gvjv/goB+zZ8Zv2qNH0fwl4H1vwvonguIi81GPWLy5iuL24DHy1Kx28g8pB8wBblmyQNgNAH46ftPftC67+058YNY8b63mCOdhBp+nhiyWVomRHEPfBLMRjLsxwM4ryivv7/AIcrfG//AKGn4f8A/gxvv/kOj/hyt8b/APoafh//AODG+/8AkOgD4v8AhL8L9e+NHxG0DwV4btvtOsaxdLbQg52Rg8vI+OiIoZ2PZVJr+jf4E/BvRPgD8KvD3gXw+ubDSbcRtcMgV7mU/NJM+P4ncs3tnHQV8w/8E9/+CfF1+ytd6/4n8a32la14zv1+yWc2kvJJb2loQC+DLGhLu2M/LwEAB5Nfb1AAKWiigApKWigD85f+CuP7KP8AwnngZPi74ctA2ueHIPL1mKJSXubEHiXA6mEliTj/AFZJJxGBX45+ZX9Tt9YQ6hbS21zGlxbTIY5YJVDJIhGCpB6givyL+K//AARl8e6l8QtdufAHiTwja+Dprp5NNt9YvLqO6gjY7vKcR28ikIxZQdxJABODwAD81m+av1N/4JF/thGKb/hR/iu+/dSF7jwxcTt91uXltM+h5dB2O8c5UDzD/hyv8bf+hq+H/wD4Mb7/AOQ6vaJ/wRz+PfhrVrPVNM8aeA7HUbOZLi2uoNTvllhkRgyujCz4YEA5oA/ZmlrmvhxH4oj8E6Mvjb+yz4uS1RNUfRXd7OSccNJEXRGCt97BX5c4ycZPS0AFfy9/Ecf8V34j/wCwpd/+jmr+oSvxs8W/8Eb/AIz694m1fULbxR4EW3ur2a4RZb+9DhXcsAQLQ4OD60AfnVX3x/wRd/5Oo8R/9ifd/wDpXZ1N/wAOVvjb/wBDV4B/8D77/wCQ6+m/+CfX/BPL4ifsofGjVvF/i7W/DOo6dd6FNpUcOi3FzLKJHnt5AxElvGAoELdyckcUAfofRRRQAUUUUAeCftbfseeD/wBrXwamna0P7L8QWWX0vX7eIPNaueqsCQJIzj5kPXAIIIBr8Lf2iP2W/iB+zD4oOj+NNIaGGRj9j1W2zJZ3qj+KKTHPupwwyMqMjP8ASbWJ4y8E6D8Q/D11oXiXSLPW9Iul2zWd9Cssbj3VhigD+XKnKa/Yr45f8EaPAviq4ub/AOGniO68GXjhnTSdQU3tluzwFbIljXryTJ24r4z8ff8ABKb9ofwPPL9j8NWHi20j/wCXrQ9SiYN9I5jHIf8AvmgD5AanV63rH7Inxv0Hf9t+EfjRAv3ni0K5lQf8CRCKyF/Zx+LT9Phf4z/8J+7/APjdAHnBGKK9x8M/sR/HrxbcRw2Pwn8UQGQ4VtS097FPxafYB+dfQHw2/wCCO3xo8UzRSeK73Q/A1nkCUXFz9tuVHPISHMZxjvKOooA+EK+xP2M/+CdHjP8AaQvLLxH4it7rwr8Nw6vJqEse251CPqUtUPXI48wjaM5G8jFfoz8AP+CWXwb+DMltqOsWknxD1+IBhda8itaRv3aO1GU54/1nmEYGCK+yPrQBgeAfAuh/DPwfpXhbw1p8OlaFpUC21pZwjARAOpPVmJySx5JJJySTXQUUUAFfP/7bf7UOnfsr/BPUdfLpN4m1BWstCsSeZrkj75H9yMHe30C9WFfQFfmh+2j+wD8f/wBrT4xXXiQ+JPBFj4ZslNpoemTajebre3zks4FpjzXb5mwTjhckKDQB+S3iDXtQ8Ua1favq15LqGqX073N1dTNueWR2LMxPckkmqC19+/8ADlb43f8AQ0eA/wDwYXv/AMiU5f8Agit8bf8AoafAf/gfe/8AyJQB4/8A8E/P2VpP2ovjZBbalAx8FeHzFqGuzY+WRNx8u1z2MzKR67FkIORz/QJbwx28KRxIscaKFVVAAAHAAA6CvDv2N/2ZdP8A2V/gxp3hKOWG+12VvtmtalCpxc3TDBClgCY0ChEyBwoJAJNe60AFFFFABRRRQB+Hv/BU39k9vgl8W/8AhO/D9qsfgzxfOzlI1xHY6hjMsXsr8yL9XAGFFfDoNf0vftBfBPRf2hPhNr/gbXUH2TUoCIbgIC9rcKQ0U6e6MAcDqMjoa/Jxv+CLPxuTp4o8At/3EL7/AOQ6APgWOR7eVJYnaOVGDI6HBUjoQfWv3u/4J0/tdD9pr4OrZ63crJ488NLHZ6uSfmulwRFdf8DCkNg/fRjwCBXwV/w5b+N5/wCZm8Bf+DC+/wDkOvVf2Y/+Cbn7RX7Mfxe0fxto3ivwJIkDeTqGnrqN8FvbRiBJC2LP6Mvoyq38NAH6q0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z - detail: auto - model: gpt-4.1-nano - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: chatcmpl-E3zTDuKUGzZPdr73Umdr9vNMPYxa4 - object: chat.completion - created: 1784619983 - model: gpt-4.1-nano-2025-04-14 - choices: - - index: 0 - message: - role: assistant - content: This image shows the text ".xlsx" with a vertical line (|) replacing - the letter "l" in the middle. The ".xlsx" extension typically indicates - a Microsoft Excel file. - refusal: null - annotations: [] - logprobs: null - finish_reason: stop - usage: - prompt_tokens: 644 - completion_tokens: 39 - total_tokens: 683 - prompt_tokens_details: - cached_tokens: 0 - audio_tokens: 0 - completion_tokens_details: - reasoning_tokens: 0 - audio_tokens: 0 - accepted_prediction_tokens: 0 - rejected_prediction_tokens: 0 - service_tier: default - system_fingerprint: fp_0f961d15a9 diff --git a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-stream.yaml b/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-stream.yaml deleted file mode 100644 index e9dcbf8..0000000 --- a/tests/cassettes/openai/chat_completions/test_messages/test_multimodal_messages_round_trip_through_sdk-stream.yaml +++ /dev/null @@ -1,320 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '21996' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: - - type: text - text: What is shown in this image? - - type: image_url - image_url: - url: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9UKKKKAH0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX4OeNP+Cmf7SOk+LNbsrX4jeXa29/cQwx/2HpjbUWRlUZNsSeBX7x1/L38Rv8AkfPEf/YUuv8A0c1AH0N/w9E/aY/6KT/5QdL/APkWvrj/AIJk/tmfGD9ob4/ax4c8f+Lzr2jW3hy41CO1/s2ytsTLcWyK26GFG4WV+M456V+Ttfe3/BF//k6jxF/2J93/AOldnQB+2VFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXjn7Tn7T2hfsq+ELDxR4m8O+Ita0S4ufsstzoFvBN9lcjKeaJJo8BvmAIyMrg4JXPsdcz8SPh5onxW8E614T8R2i3uiavavaXMJA3bWH3lP8LqQGVuzKD1AoA+Jv+H1XwR/6FX4gf8Agvsf/kyj/h9V8EP+hV+IH/gvsf8A5Mr8qf2lPgBr37M/xg1zwNrqtL9kfzbC/wBhVL60YkxTqPcDBAJ2srrklTXl1AH9Cf7Ln7fHw3/a18RaxofhK01vStU022W7a216CCF54ixUtEIppMhDtDE4x5idc8fSdfzKfA74wa38BPij4f8AHPh5/wDiY6TcrKYWYrHcREFZYXx/C6FlPpn1r+j/AOFPxM0X4yfDvQPGnh2fz9H1m1W5hJI3oTw8b44DowZGHZlIoA6yiiigAooooAo61rVl4e0u81LUbiOz0+zge5ubmY4SKJBud2PYAZJ9ga+FLj/gtD8EIZpFTw348uY1cqssWn2e1wD94BrsEA9sgH2rif8Agr3+1gPDPh23+DHh66Kalq0aXevyRMQ0VnkNHb5HQysNzDP3FAPElfkQpoA/an/h9N8Ev+hU+IH/AILrH/5Mqzpn/BZT4Pa1qlnp1h4M+Il3fXcqwQW8OmWTSSyMQFRVF4SSScAepFfihX6ff8Ei/wBj86tft8bvFdjmztWe28NW8y5EsuCst39E5RP9veeCgoA/VvTbyS/sYZ5bWWxlkRWe2nKmSJiMlWKFlyOnBI96tUUUAFfy9/Eb/kfPEf8A2FLr/wBHNX9Qlfy9/Eb/AJHzxH/2FLr/ANHNQBzdffH/AARd/wCTqPEf/Yn3f/pXZ18D198f8EXf+TqPEf8A2J93/wCldnQB+2FFFFABRRRQAUlV9Q1G30mzmu7uaO1tIEaWaeZwkcaKCWZmJAAABJJ4AFfk3+2p/wAFY9S1a/vfBnwUuG03TYmaG88XDma66AraAj90o5/en5jnK7MbmAP0V+NH7U/wu/Z9s/N8c+L7DSLpl3R6crGa8lHYpBGGcjkc4wM8mvif4kf8FtfCul3E1v4I+Hep63tO0Xes3kdmhweoSMSkj6kV+Supate65qFzf6leXGoahcyGWe6upDJLKx6szNkk+5NU2WgD9Ate/wCC0/xhvmZNL8J+DdMgPTzLe6nlH/AvPVf/AB2saP8A4LJfHaP/AJh3g9v97TZz/wC16+FdtG2gD9IfDP8AwW48f2rAeIvhz4b1VO66Zc3FkT+Lmb2r6V+FX/BYb4OeMpktPFVjrXgS4OAZ7qEXloCeg3w5k/Exgc8mvxJ20dKAP6h/BPj3w/8AEbw/b654Z1mw17Sbgfu73TblLiFj3G5TjI7g8juK3wa/mb+C/wC0B49/Z98SJrfgbxHd6LcZBmt0ctbXIH8M0J+SQdfvDjORg81+0X7EP/BQzwx+1Fbp4d1mKDwv8RY4976Y037i/wADLSWpY5PGSYj8yjkFgCQAfYdFFFACV8uftJf8FCvBP7K/jiHwz408IeM5pbm3W6tNR0mztZbO6jPDbHe5Rsq2VYFQQRnoQT9SV86/ty/ss2X7VHwVvNEiSKLxbpu+90C8k+XZcBeYmbGfLlACN6Ha2DtAoA8L/wCH0/wT/wChT+IP/gusv/kyj/h9P8E/+hT+IP8A4LrL/wCTK/GTWNHvdA1S803UbWWyv7OZ7a4trhCkkUqHa6MvYggj8KpUAf0q/s7/ALRnhH9pz4cxeMvBz3S2DXElpNaagiJc20yHlJFR3AJUo4wx+V175A9QBzX4I/8ABN39qtf2bfjYllrd0IfBHihorHVGkfCWsgY+RdfRGYhv9h2PO0Cv3uVgyhlIKkZBHegBaKKKACiiigDzf9oL4++Fv2a/hnf+N/F0k/8AZls6Qx21mqNcXUrnCxRKzKGbG5uSAArEkAV8kf8AD6v4If8AQrfED/wXWP8A8mV8Uf8ABT79rA/H340SeG9AvGl8EeE5Hs7Z43zFe3YOJrgY4K5+RTyCq7h9+vi2gD9qf+H1fwQ/6Fb4gf8Agusf/kyvQ/gN/wAFNfhz+0Z8SLHwX4R8IeOG1O5R5ZLi8sLRLe1iQZaWVlumKoOBnBOWUAEmvwTr96f+CcP7Ia/s3fB1dU120EXj7xPGl1qLFQHsoSP3VoD2Kj5n/wBtiOdoNAH1/RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfI3/BR/8AZJb9pr4QrfaFbq/jrwws15pi7ebyMqPOtM+rhVKf7aqOAxNfgkytGzK4KspwVYYIPpX9U1fjH/wVe/Y/X4a+Nx8WvC1rs8M+Jbll1a3jTC2WoNli/ss2Gbno4bnDKAAfnrX6O/8ABIf9rD/hC/HFx8HvEV3s0TxDKbjRJJX+W3v8fNCM9pVAwM/fQAAmSvzhWrOmapd6HqNrf2FxJaXlrKs8M8TbXjdTlWB7EGgD+p6ivnb9hf8Aaetv2pPgbp2vTyInibTQuna5bKfu3KL/AK4Dskq4cemWXJ2k19E0AFeb/tDfHPQ/2cvhJr3jvXh51tp0WLezWTZJeXLcRQIcHBZuM4O0ZbBANekV+HX/AAVK/atPxq+Lh8CaDeef4M8HztB5iOGS9vxlZpsjgqnMa9ejkHD0AfIXxI8fa18VPHGs+LfEV0bzWtXuXurqY92bsPRVGFUdgoFc2Bin1a0nS7rXNUs9OsYJLq9u5lggt4ULySyMcKqqBkkkgADuaAPZP2O/2Z9T/am+Nuk+FbdJItEg/wBN1q+UHFvZoRuAPZ3OI192z0Bx/RB4W8N6b4N8O6doWj2cOn6Tp1vHa2lpboEjiiRQqqAOgAFeB/sH/sqWX7KvwXttKnWOXxhrAjvtfu4zkGbadkKk/wAEQJA9WZ243YH0jQAUUUUAFfy9/Eb/AJHzxH/2FLr/ANHNX9Qlfy9/Eb/kfPEf/YUuv/RzUAc3X3x/wRd/5Oo8R/8AYn3f/pXZ18D198f8EXf+TqPEf/Yn3f8A6V2dAH7YUUUUAFJmlrz/AOPnxKg+Dvwb8Y+NZxGw0TSri8ijlOFlmVD5UR/3nKr9TQB+af8AwVm/bOu9S8QTfBXwjqDQaXZbG8S3drJg3MxAZbQMP4EBUuO7YU42HP5hg1e1vWL3xHrF7qupXD3mo3sz3NzcyHLyyOSzOx7kkkn3NUttAD1r3f4A/sUfFn9pILdeEvDpj0TfsbXNUf7NZA99rkFpMcZEasRkccivUv8Agmn+x3Z/tNfErUNY8VQeb4G8MGN7y1JK/b7l93l2+4dEwrM5HOAo/jyP3P0nR7PQtNttP0+2is7G1jWGC2gjWOOKNRhUVVACqBgADoBQB+VPhX/giFqk9vDJ4h+LNpZzFcyQ6XojXCg+iyvMh/HZXQXH/BD/AEd0Itvi9ewyd2k0BXH5C4FfqFTVXbQB+JPxf/4I/wDxe8B2MuoeEtQ0n4hWkeSbexY2t5tHcRSfK3fhZCxxwDXxBr2g6p4V1a60rWdOutJ1O1cxz2V9C0M0TDqrIwBB+or+pevl39tb9iPwz+1X4LuJ0t7fSfiFYwMdM19UwX2g4t7gj70bHjJyUzuXurAH8/NaOh69qHhfWLHVtJu5tP1SxnS5tby3cpJDIpyrKR0IODTvE/hrU/BviLU9B1mzksNW025ktLu1lGHilRirofcEEVmUAf0J/sF/tY2/7V3wZj1K9eOLxlorJY67aRqFHmlfknUZ4SUKxHoyuvRcn6Vr8B/+CZPxquPg/wDtVeHLaS5aLRfFTDQL2LkqzzMPs7YzgETCP5j0VnHev33HPNAC0UUUAfk9/wAFdP2Pjp1wvxu8K2JNvMUt/E1vAvEb4CQ3ePRuI399h5yxH5dV/Uj4p8Nab4y8PahoWs2cOo6RqMElreWlwgZJonUqykHsQa/ni/bI/Zn1H9ln40al4XlE1zoNz/puialIP+PmzYnaCem9CCje4zjDCgDwuv3B/wCCWP7Vy/G74QjwTr14r+MfCMSW4Mr5kvLAALDN/tMgAjY/7KEkluPw+r0v9nL45az+zn8XtB8caKzSSWMu26s92Eu7Zvlmhbt8yk4JB2sFbtQB/S3RXPfD/wAdaP8AE3wXo3irw/dLe6Nq1rHd2s6/xI6g4PowzgjsQQeQa6GgAr4s/wCCn37WC/AP4NP4X0K8MPjnxbHJaWzRHElnZn5Z7gHsxHyIRzubcPuV9beOvG2kfDfwdrPinX7pbLRdItZL27uG/gjRSxwO5OMADkkgDrX85f7THx91j9pX4x67441dWt1u5PKsLFn3iys04hhB7kDljxudnbA3GgDygmipNvvXpP7O/wABvEH7SPxa0XwL4dHl3N8xkubx0LR2VsnMs7jI4UdBkbmKrnLCgD68/wCCUv7Hi/FDx0/xV8T2nneFvDFyBpkDr8t7qCgMG56pDlWyOC+3n5WFfs8uAoA4HauT+Fnw10H4O+AND8HeGbIWOi6RbLbQR55bGSzse7sxLM3csTXW0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVy3xO+G+ifF3wDrng/xFb/atE1i1a1uYu+DghlPZlYKynsVBrqaKAP5pP2jvgLr37Nfxc1vwNrymR7N/Ms77YVS9tWJ8qdOvDAcgE7WDLnK15kTmv3q/wCCj37Io/aT+EY1XQ7MT+PPDCSXWnFQN95AQDLan1ZgAycfeUAY3E1+C8itG7Iy7WU4KkYIoA+kv2Bv2oZP2X/jlZalqE7L4O1rbp+uw8lViJylwFGctE3zdCdpkUY3Zr+gy1uo7y3jnhkWWGRQ6OhyGUjIIPcYr+WFW9q/YP8A4Jd/tq6RefBPWvBPjvWI7S88CafJqMF5cMf3mkx5LD3MPC8dVeMAfKSQD2P/AIKS/tXJ+zv8FZNM0W7WHxv4pSSy0wxviS1hIAnus/wlQ21TkHe6kZ2mvwZ8w17D+1j+0Lqf7Tnxq1rxxfb4LGVvsul6e75+x2UZPlRgepyztjq7ueM4rxygCTNfp7/wSN/ZDfUtU/4Xb4otCLK0Z7fw3bzICs0vKy3XPZOUX/a3ngoM/GX7Hf7M+p/tTfGjS/CtuskGhwMLzWtQVSRbWin5hn++5wi+7Z6A1/Q/4Z8Mab4N8O6ZoOi2cOn6RpttHaWlpAoVIokUKqgD0AFAGoKWiigAooooAK/l7+I3/I+eI/8AsKXX/o5q/qEr+Xv4jf8AI+eI/wDsKXX/AKOagDm6++P+CLv/ACdR4j/7E+7/APSuzr4Hr74/4Iu/8nUeI/8AsT7v/wBK7OgD9sKKKKACvkr/AIKo6hJZfsQ+OkjOPtM+nQMf9k3sLH/0GvrWvnT/AIKF+A7r4jfsdfErSbKNpLqGwXUkVRkkWsqXLADuSsTD8e/SgD+eKiiigD9xv+CP+i22m/sipfRLi41LXr24uG/vMojiH/jsa19wrX5Gf8Eg/wBrDQvBEmqfCDxVex6XFq999v0O+uXCQtctGqSWzMeFZxGjJk4Ztyj5mUH9cwMUALRRRQAUUUUAfiR/wWL+Gdl4N/aW03xJYIsUfinSUubpFwP9KhYwu2B6xrD9SDXwdX9SuqeGdI1yRJNR0qyv3QEK11bpIVB643A4qkPh/wCFz/zLekf+AMX/AMTQB/MR4d1q48Oa5p2q2jtHdWN1FdxMpwQ8bBlIPY5Ff1H2N0l5ZwzxHdFIiujeqkAg/rWM3w78Kt18NaQf+3GL/wCJroFUIoVRgDgCgBaKKKACvnH9u39lWz/aq+C9zpECRReL9K33mgXknAWfb80LNjISRV2n3CNg7RX0dSFc4oA/lm1bSL3QdTu9O1C1lsr6zme2uLadCkkUqHDoynoQQR+FU6/UD/grl+x3/ZWo/wDC7vClkRZ3ZS38S20KfLDLgLFd/R+Ef/aCHkua/L8GgD9Nv+CQf7WR0LWbz4LeIrv/AEDUGe+8PSTycR3PWa3BPQScuo6bw46vX63hs1/LRoOuX3hfW7HV9LupbLU7CeO6tbqFtrwyowZHB9QQCPev21T/AIKQaEf2If8AhbRktz4xVBon9jZ5OtbOBt/55bf33X7nHWgD58/4LAftZDUtWtfgn4cuc21jIl74inhfiSbCvBbZHZMiRh/eMfQqRX5fLWhr+v6h4q1zUdZ1a7l1DVdQuJLu7u52y80zsWd2PcliSfrVGgB1fvD/AME2v2SV/Zx+EEes6/ZKnjzxMkd3f7lw1lDt/c2g9CoJZ/8AacjJ2g18O/8ABKf9kP8A4Wt48f4o+JrDf4W8MXSDToZ1IF5qAAZWxjlIsqx6fMyc4DCv2hoAdiloooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/F7/AIKv/sgH4X+P/wDhanhiw8jwn4kmP9pxQj5LPUWyzNgchZuW9A4bkblA/aGuT+KHwx0D4xeAdc8HeJ7QXui6vbNbTx91zyrqezqwDK3YqDQB/MIvepLe4lt/M8qRo96lG2nqp6ivR/2jPgPr/wCzb8XNb8C+IFLzWT+Za3gQql5atkxTp7MOoBO1gy5yprzUGgBNtWtN0q61i+trGxhku725lWCC2hQvJLIxwqqo5JJIAA7kVWr9OP8Agkb+x/8A25qh+NviuxJsLJ3g8NW8y/LNNgrLde4TlF/2954MYyAfbn7CP7KNj+yv8G7XTp44ZfGWsLHe69eIM5m2/LArHny4wcD1Yu2BuwPpKo1GM1JQAUUUUAFFFFABX8vfxG/5HzxH/wBhS6/9HNX9Qlfy9/Eb/kfPEf8A2FLr/wBHNQBzdffH/BF3/k6jxH/2J93/AOldnXwPX3x/wRd/5Oo8R/8AYn3f/pXZ0AfthRRRQAVDeWcOoWs1tcRrLbzI0ckbdGVhgg/UGpqKAP53/wBuX9lvUP2WvjVf6OkLSeEdTeS88P3235ZLctkwlu8kRYI3cja3AYCvnev6Yfjx8AvCH7Rnw/uvCPjHTxd2Mjebb3EeFns5gDtlif8AhYZ+hBIIINfh7+1d/wAE/wD4k/sv3NxqE1nJ4m8Dhsw+IdOiLLEp6C5QZMJ9z8h7MTwAD5gr7A/Z/wD+CoHxg+B9jaaPfXcPjzw5bjZHZ6+zNcwx4ACxXIO9QAAAH3qBwAK+P6dQB+2/wq/4LD/Brxp5Nv4rs9Y8BX7cO9zCb2zDHoBLCC5+pjUCvq/4f/H74c/FW3jk8I+NtB8QyOu77PYajE849Q0W4OpHoyiv5mmHSgs0f3WI+hoA/qlor+cL4Y/to/Gz4Qyp/wAI58R9djtUwFsb+5N7bL9Ipt6Dr2Hp6Cvsj4P/APBarxLp00Fr8SvBVhrFruxJqPh9zbXAX1MLsyO3ToycUAfrrRXhfwL/AG2PhD+0R5Ft4S8VQDWpBn+w9S/0W+B6kCNjiTHrGWHPWvdKACiiigAooooAKKKKAMnxV4Z03xp4d1LQdZs4dQ0fUraS0u7SdAySxOpVlIPsa/ni/bE/Zp1P9lv40an4VuVmn0af/TdH1CXn7RasflBPQuhBRvdc9CK/ozr5t/bx/ZVsv2qfgvc6XAscXjDRxJfaBdSZAE20b4WI/gkCgH0ZUbnbggH89jc45pRdTC38jzX8ndv8vcdu7GM49cd6n1XSbzQ9Tu9Pv7aWzvrSZ7ee3nQpJFIpwysp6EEEYqrtoAFr0r9nj4E+IP2kPizovgXw6uy5vnL3N4ybo7O2XBlncZGQo6DI3MVXOSK82C4r94f+CbX7IK/s3fCQaxr9siePfE0SXOoApiWxtyA0Vpk8gjO58Y+c452AkA+mvhb8NNC+Dvw/0Pwb4atFstE0e3W2t4lABIHLOx/idmLMzd2YnvXV0gGKWgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK574gePtD+F/g3WfFPiO+TT9F0m1kvLqdzyEQdFHVmJIVVHJZgByRXQ1+Of/AAVn/bD/AOE88Xn4PeFrwS+HtAn363cwP8t1fr0gyOqwZ5H/AD0zkAxg0AfHf7UH7Q2uftO/GLWPG+tFoY5j9n06w3blsrNSfKhB743Fie7Mx4zivKFpKVaAFr9Uv+CRP7YCqv8AwpDxTdKD89x4ZupmwTyXls8/UvIn1cf3RX5W1f0LXr/wvrFlq2l3UtjqljPHdWl3CxV4JUYMkinswIBBoA/qW4pa+fP2J/2pNO/as+DNl4h3Q2/iqwC2evafFx5NyBxIq9RHIBuX/gS5JU19B0AFFFFABRRRQAV/L38Rv+R88R/9hS6/9HNX9Qlfy9/Eb/kfPEf/AGFLr/0c1AHN198f8EXf+TqPEf8A2J93/wCldnXwPX3x/wAEXf8Ak6jxH/2J93/6V2dAH7YUUUUAFFFFABUc8Ed1C8UsayxOCrI6hlYHsQeoqSigD5C+O3/BLz4K/Ghrm/sdLl8B+IJdzG+8O7YoHc87ntiDH167AhOeW6V8HfFf/gjj8XvBzT3Hg/VNI8fWK58uKKT7DesPeOU+WPwlJ9q/a6kIzigD+Zv4kfAL4k/CGRx4y8Da74djUhftF9YyJbsT02y42N/wEmvPt26v6pGRW+8oP1FeTePv2S/g58TvMfxJ8OPD1/cSffu47FLe4b6zRBZP/HqAP5tCM02v2a+Ln/BGn4ZeJI7m58BeINW8E3rcx2dx/wATGyHsFciUfUyN9K/OP9pH9iH4pfsvzPc+KdIW/wDDhk8uHxFo5aexcnorNgNExPG2QLk5xuxmgDwW1uprK4jnt5ZIJ42DJLGxVlYdCCOhr75/Y/8A+Cq3i/4U3Nl4a+J8tx4y8IFljXU5GL6lYDpnd/y3Qd1c7vRuNp+AqKAP6jvCXjDR/HnhvTfEPh7UbfWND1KBbi0vrV96Soe49PQg8g5BAIrZr8Uv+CVf7XV98K/itafDHXLwv4N8VXQhtFmbixv34jZfRZDhCMdSh4wc/tbuoAWiiigAooooAK+f/wBtn9p6x/ZX+C9/4kLQz+Ir0NY6Jp8pz590w4dl7xxj52+gXILCvcPEGvWHhXQdR1nVblLPTNPt5Lq5uJDhY4kUszH2ABNfzz/ttftR6h+1X8ZrzxCTJB4asA1jodi/HlWwb77D/npIfmY+6ryFFAHh/iDXr7xRrV9q+q3Ml9ql/PJdXd3M2555nYu7sfUsSao02n0ASWt3LZXEc0MjxSxsHV422sCOhBr99P8Agnb+1sv7UPwZjj1i4VvHfh1Y7LWV6G4GD5V0B/00VTn/AG0fgDFfgMRmvVv2X/2htc/Zh+MWj+N9G3XEUJ+z6jp+/at9ZuR5sLH8Ayk5w6IcHGKAP6UKK574e+PdE+KHgnRfFfh28W/0XV7VLu1mXqVYfdYfwspyrKeVZSDyK6GgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoornviB490T4YeDdX8VeI76PTtD0m2e7u7iQ/dRRnAHdicKFHJJAHJoA+cf+CiH7WkP7Mfwdkh0m7jTx94gD2uiwhgWgXAEt2w9EDYXPBdl4IBx+BE0z3Eryyu0kjkszsclieSSe5r1f9qH9obXP2nPjBrHjbWiYY5m8nT7ANuSytF4jhX1OMsx43OzHAzivJqACv1E/wCCU37E+l+MvCOvfFDx5pcd/pmr21zoui2N0hw0Lo0Vzc/iGeJcekh/umviX9kP9nLU/wBqD42aR4Os2e20zP2rV74LkW1mhG8/7zErGv8AtOO2a/ol8K+GdM8F+HdM0HRbOPT9H0y2jtLSzhBCQxIoVVGT0AAH4UAfzrftbfs76l+zD8cNc8F3nnT6ch+1aTfSj/j7snJ8t8+owyN6MjDpgnxuv3t/4KQ/son9pX4Lte6JbeZ458MLLe6WFGWu4yo861+rhQV/20UZAY1+CTKY2ZXBVlOCpGCD6UAe/fsVftQ6h+yr8ZrLxGDJceHLwLZ63p6n/X2xb76j/npGfnX1wVyAxr+hfQPEGn+KNE0/V9Ku4b/Tb+3jurW6t33xyxOoZHU9wQQa/lqPNfqf/wAEif2vDGx+CHiq9+RjJc+GbmZ+jHLy2eTxz80iD18wd1FAH6r0UlLQAUUUUAFfy9/Eb/kfPEf/AGFLr/0c1f1CV/L38Rv+R88R/wDYUuv/AEc1AHN198f8EXf+TqPEf/Yn3f8A6V2dfA9ffH/BF3/k6jxH/wBifd/+ldnQB+2FFFFABVKbWbK3neGW7hjkXGULjcM+oq7X8/f/AAU38Ny+G/21/iGJEKxX0lrfQv2dZLWIkj6MHX6qaAP31/t7Tv8An9g/77FOi1mxnnSGK7geR84QSDcfoO9fyyV67+yP4+t/hj+0v8N/Et5IsNjZ63brczM2BHDI/lyOeOiq7H8KAP6S6KKKACiiigBu2qesaLZeINLutN1K2hvtOu4mguLS4iWSKaNhhlZWBBBGQQfWr1FAH4Gf8FHf2UbP9l/40xHw/G8fgzxLE19pcTuW+yMpCzWu4kkhCyFSc/JIgJJBJ+TtvvX7Ef8ABbKysX+Dfw6vpRm+h8QvDF/1ye3dpP1jir8daALNhfXGk6ha31pK0F3bSrNDKvVHUgqR9CBX9M/wZ8cH4m/CXwZ4tJXfrmi2epSKo4V5YEdl+oLYr+ZKv6Lv2F/MH7IPwlEibD/wj9tjnORtyDQB7rRRRQAUUV4B+2t+1Dp37K/wYvtfZoZvEmobrLQ7GTB825I/1jKSMxxg72/4CuQWFAHxd/wV2/bAKKPgf4UvV+by7nxLdQPyOjw2mf8AvmR/+2Yz94V+U9aPiDxBf+KdcvtY1W6lv9Uv55Lq7up23PNK7Fndj6kkmqFAElrayXkyxRKZJXO1EXksfQV+xfwx/wCCY+kz/sU6l4N1+zitPijr4TWn1KRAW0+8RGNtbFufkVXdHIzzNIRn5cfN/wDwSb/ZQ/4Wr8SJPif4htBN4V8KzhbKGRci71H5WQ4PVYgwc/7RTtkV+0wULQB/Lb4k8N6l4P8AEGpaJq9q9jqmm3MlndW8gw0U0bFXU+4IxWYRmv1K/wCCv/7J32Oa3+N/h62xBK0Vj4jggThZOEguz6A4WJj6iLrliPy1BzQB+jX/AASZ/bGT4f8Ailvg/wCKrzy9A1ybfoM8zgJa3zdYCT0WY4xzxIBgHzCR+xlfyuRSvBKksTtHIjBldDgqRyCD2Nfvn/wTr/a4X9p74MRwa1crJ488NrHZ6wP4rlcERXXp+8Cndj+NX4AIFAH1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFfmN/wVu/bE13wPdWHwf8HahNpU97ZC+17ULWQpN5UhYRWysOUyFLvjqrIOhYEA+3vFn7WvwZ8C6o+l6/8AE7wrp2px5Etm2qRPJEw6q6qSVPs2DXQ/Dv46fDz4tbx4N8baF4llQbng03UIppUHPLIG3Doeo7Gv5ka1vCvirVvBOu2etaDqN1pGs2Uomtb+ylaKaFx0KsORQB/UlRXzv+wh+0lJ+1B8ANO8SajHHB4l0+4fStZjhGEN1Gqt5ijsHSRHx0BZgPu19EUAFFFFABX46f8ABWL9sL/hPPFknwf8L3yy+HtDn3a7LCflur5T8sO4HlYckEf89Ac/cFfb3/BQz9riH9mH4PyQ6Tcx/wDCeeIkls9Gi3Ddb8ASXRHpGCNueC5UYIBx+BM00lxK8krtJI7FndzlmJ5JJ7mgCKinV96/8EpP2S2+MHxP/wCFla/arJ4S8JXAa1ilGVu9SADRDHdYgRIf9ryxyCaAPv3/AIJy/sqr+zT8EYJ9XtlTxv4kEd/qrMuHt12/urX/ALZgnd/tu/UAGvrBaNlAGKAHivxJ/wCCrH7J3/CnfipF8QvD1n5HhHxfOzzxxj93ZaictInssg3SL7iQDgCv21WuB+O3wZ0T4/fCvXfA+vrix1OHalwqgyWsy/NFOmf4kYBvfGOhNAH8zIGK0ND1u/8ADes2Wq6Xdy2Go2UyXFtcwNteKRSGVlPYggEVt/FT4a618HviFr3g3xFB9n1jR7prWdR918YKyIe6OpV1PcMDXL0Af0PfsT/tTaf+1V8HLTXQ0MHifTttlrthH8ojuAOJVXqI5R86+nzLklSa+g1r+db9iv8Aaf1D9lT40WPiVTJceHbwCy1uwQ/6+1ZuWX/ppGcOvrtK5AY1/Qz4f8Q6f4q0TT9Z0i8h1HSdQt47q0vLd90c0TqGR1PcEEH8aANKiiigAr+Xv4jf8j54j/7Cl1/6Oav6hK/l7+I3/I+eI/8AsKXX/o5qAObr74/4Iu/8nUeI/wDsT7v/ANK7Ovgevvj/AIIu/wDJ1HiP/sT7v/0rs6AP2wooooAK/KH/AILU/A24GqeC/itYQM9tJEdA1SRcny2UvLbsR6ENMpPbag7iv1erivjN8JtE+OXwz1/wR4hi36Zq1u0LSBcvA/WOZPR0cKwPqtAH8xu2lHFegfHj4I+Jv2ePidq3gnxTbiLULJt0VxGD5V3AxPlzxHujAfgQQeQRXn33qAP3Q/4Jx/tuaZ+0D8P7Dwd4j1FIviRolutvMtxIA2qQIMLcx+r4wHX1+b+Lj7Xr+WXQde1HwvrFnq2kX1xpmqWcqzW15aSmOWGQHIZWHII9RX6IfAX/AILKeMfCNhFpfxJ8MR+NYYgANY0+ZbS82jqZU2mOVvceX75oA/Yqivjbwf8A8FZ/2d/E9uj3/iDVPC0rdLfVtJmZh9WgEqj/AL6xXaN/wUg/ZwXH/F0dPx/153f/AMZoA+laK+J/HH/BXf4A+GrN30W91zxjcYISLTdLkgBPHVrnysD3AJ46V8G/tPf8FVPiJ8ctPuPD/hW0Hw88MTgpOtncma+ulIwyvPgBUPI2oq5BIJYHFAGr/wAFZv2oNL+M3xU0rwR4XvotQ8O+EBKk95bsGiuL6TaJAhHVYwipkcbi+OMGvg4GgjNAGKAL+j6Tda9qtnptjBJc315MkEEEYy0kjEKqgepJFf03fCvwWnw4+GPhLwpGQyaHpNppoZRgHyYVjz+O2vyE/wCCS/7LFz8SvioPinrln/xSvhOb/QPNTi81Hb8u3/ZhDCQn+8YuvOP2koAKKKKAM/xBr1h4W0LUdZ1S5Sz03T7eS6ubiQ4WONFLMxPoACa/np/bc/akvv2qvjXf+IAZIPDFhmy0KycFfLtgc+Yy9pJD87enyrkhQa+0/wDgrz+2AV2fBDwrejny7rxLcwOfZ4bTI/CRx/1zH94V+Vm7dQA2u0+D3wp1343/ABK0DwR4bhWbVtYuRBGz52QpgtJK57IiBnbvhTjJrja/Zz/gkx+yYPhn8PX+KniC1CeJPE8CjTI5l+e1048hsZ4MzKr5x9xU/vEUAfZ/wT+EuifAv4X+H/A/h6ARabpNssXmEDfPKeZJnx1d3LMT6mu7pu2nUAYvjLwlpfjzwrq3hzXLOLUNH1S1ks7q1mXKSRupBB79DwQcg81/Od+1J+z1q37Mvxo1zwTqZee2hb7Tpl+U2re2Tk+VKPyZWAJwyOO1f0l18f8A/BSr9lA/tF/BZ9V0K187xv4VWW+02ONcvdwkDz7YDuWCqyjrvRQMbjQB+DW2vU/2Y/2gdb/Zl+L+j+NtGzMkDfZ9Qsd2EvrNyPNgb6gAg87WVW7Yry3BViCMEcEHtQ1AH9QHw5+IGifFTwPovi3w3eLf6HrFsl1azr1KsOVYdmU5Vl6hlIPIrpK/G/8A4JNftiJ8O/GEnwj8VXnl+H/EFxv0W4lfCWd8QcxEnokuABzw4HH7wkfshQAUUUUAFFFFABRRRQAUUUUAFfgv/wAFXtOvrH9tbxZcXa4gvrLT7i0OOsQtY4j+Ukco+oNfvRXx/wD8FBv2HV/av8K2GraBcW+neP8ARI3S0knBEN9CfmNvKwBK4bLI2CASQeGyAD8GQc0AYr2LxZ+x38bfBOsS6bqfwt8U/aYzgtZ6bJdwsR12ywh0Ye4Y123wX/4J2/HD4xa1bW58Gaj4S0pmHn6r4jtns0iTP3ljcB5DwcBVIPcgc0Afd/8AwRN02/T4R/ETU5Qf7NudagggJ7yx24Mv6Sx1+j9ee/AP4J6F+z18K9D8DeHy8tlpsf7y6mAElzMx3SSvjuzE8dhgdq9CoAK574gePNE+GPg3V/FXiO9j07Q9Jtnu7u4kP3UUZwB3YnChRySQBya6Gvjv/goB+zZ8Zv2qNH0fwl4H1vwvonguIi81GPWLy5iuL24DHy1Kx28g8pB8wBblmyQNgNAH46ftPftC67+058YNY8b63mCOdhBp+nhiyWVomRHEPfBLMRjLsxwM4ryivv7/AIcrfG//AKGn4f8A/gxvv/kOj/hyt8b/APoafh//AODG+/8AkOgD4v8AhL8L9e+NHxG0DwV4btvtOsaxdLbQg52Rg8vI+OiIoZ2PZVJr+jf4E/BvRPgD8KvD3gXw+ubDSbcRtcMgV7mU/NJM+P4ncs3tnHQV8w/8E9/+CfF1+ytd6/4n8a32la14zv1+yWc2kvJJb2loQC+DLGhLu2M/LwEAB5Nfb1AAKWiigApKWigD85f+CuP7KP8AwnngZPi74ctA2ueHIPL1mKJSXubEHiXA6mEliTj/AFZJJxGBX45+ZX9Tt9YQ6hbS21zGlxbTIY5YJVDJIhGCpB6givyL+K//AARl8e6l8QtdufAHiTwja+Dprp5NNt9YvLqO6gjY7vKcR28ikIxZQdxJABODwAD81m+av1N/4JF/thGKb/hR/iu+/dSF7jwxcTt91uXltM+h5dB2O8c5UDzD/hyv8bf+hq+H/wD4Mb7/AOQ6vaJ/wRz+PfhrVrPVNM8aeA7HUbOZLi2uoNTvllhkRgyujCz4YEA5oA/ZmlrmvhxH4oj8E6Mvjb+yz4uS1RNUfRXd7OSccNJEXRGCt97BX5c4ycZPS0AFfy9/Ecf8V34j/wCwpd/+jmr+oSvxs8W/8Eb/AIz694m1fULbxR4EW3ur2a4RZb+9DhXcsAQLQ4OD60AfnVX3x/wRd/5Oo8R/9ifd/wDpXZ1N/wAOVvjb/wBDV4B/8D77/wCQ6+m/+CfX/BPL4ifsofGjVvF/i7W/DOo6dd6FNpUcOi3FzLKJHnt5AxElvGAoELdyckcUAfofRRRQAUUUUAeCftbfseeD/wBrXwamna0P7L8QWWX0vX7eIPNaueqsCQJIzj5kPXAIIIBr8Lf2iP2W/iB+zD4oOj+NNIaGGRj9j1W2zJZ3qj+KKTHPupwwyMqMjP8ASbWJ4y8E6D8Q/D11oXiXSLPW9Iul2zWd9Cssbj3VhigD+XKnKa/Yr45f8EaPAviq4ub/AOGniO68GXjhnTSdQU3tluzwFbIljXryTJ24r4z8ff8ABKb9ofwPPL9j8NWHi20j/wCXrQ9SiYN9I5jHIf8AvmgD5AanV63rH7Inxv0Hf9t+EfjRAv3ni0K5lQf8CRCKyF/Zx+LT9Phf4z/8J+7/APjdAHnBGKK9x8M/sR/HrxbcRw2Pwn8UQGQ4VtS097FPxafYB+dfQHw2/wCCO3xo8UzRSeK73Q/A1nkCUXFz9tuVHPISHMZxjvKOooA+EK+xP2M/+CdHjP8AaQvLLxH4it7rwr8Nw6vJqEse251CPqUtUPXI48wjaM5G8jFfoz8AP+CWXwb+DMltqOsWknxD1+IBhda8itaRv3aO1GU54/1nmEYGCK+yPrQBgeAfAuh/DPwfpXhbw1p8OlaFpUC21pZwjARAOpPVmJySx5JJJySTXQUUUAFfP/7bf7UOnfsr/BPUdfLpN4m1BWstCsSeZrkj75H9yMHe30C9WFfQFfmh+2j+wD8f/wBrT4xXXiQ+JPBFj4ZslNpoemTajebre3zks4FpjzXb5mwTjhckKDQB+S3iDXtQ8Ua1favq15LqGqX073N1dTNueWR2LMxPckkmqC19+/8ADlb43f8AQ0eA/wDwYXv/AMiU5f8Agit8bf8AoafAf/gfe/8AyJQB4/8A8E/P2VpP2ovjZBbalAx8FeHzFqGuzY+WRNx8u1z2MzKR67FkIORz/QJbwx28KRxIscaKFVVAAAHAAA6CvDv2N/2ZdP8A2V/gxp3hKOWG+12VvtmtalCpxc3TDBClgCY0ChEyBwoJAJNe60AFFFFABRRRQB+Hv/BU39k9vgl8W/8AhO/D9qsfgzxfOzlI1xHY6hjMsXsr8yL9XAGFFfDoNf0vftBfBPRf2hPhNr/gbXUH2TUoCIbgIC9rcKQ0U6e6MAcDqMjoa/Jxv+CLPxuTp4o8At/3EL7/AOQ6APgWOR7eVJYnaOVGDI6HBUjoQfWv3u/4J0/tdD9pr4OrZ63crJ488NLHZ6uSfmulwRFdf8DCkNg/fRjwCBXwV/w5b+N5/wCZm8Bf+DC+/wDkOvVf2Y/+Cbn7RX7Mfxe0fxto3ivwJIkDeTqGnrqN8FvbRiBJC2LP6Mvoyq38NAH6q0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z - detail: auto - model: gpt-4.1-nano - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gWwrbMen"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"hDREHb1"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - image"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Sybv"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - shows"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vtZ3"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"p09iZG"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - text"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"qcXMy"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - \"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u4aCZ7"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"xls"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"a2yprwI"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"x"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"J7mqptdbu"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9XuO4VYR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"deg1m"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kDnE755r"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - vertical"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - line"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wVknv"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - ("},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"84bZeuDR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"|"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WrAM2eCQT"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":")"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"egB1f0JaN"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - in"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8ySqPBQ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - place"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZvlJ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Z5wGqqS"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"zV8K0A"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - letter"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"5G4"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - \""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"U8qQmeZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"l"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vhRXc5T89"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":",\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4fZ8Msp"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - which"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"tDY9"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - appears"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rB"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FLLijkd"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - represent"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CfYcGB9c"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - file"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"NZfsd"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - extension"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - commonly"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"k"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - used"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"w0Hjq"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aUyg3a"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - Microsoft"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - Excel"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"EeEX"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - spreadsheet"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0uncxbSsDE8ZEv"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":" - files"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ZJ0J"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"yHXGRuZoK"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"prgR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zTCRWHFaM4k9d4pyrFxzgMXqtJR","object":"chat.completion.chunk","created":1784619982,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_0f961d15a9","choices":[],"usage":{"prompt_tokens":644,"completion_tokens":39,"total_tokens":683,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"UoDoGnW"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream-sse.yaml b/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream-sse.yaml deleted file mode 100644 index 4f099de..0000000 --- a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream-sse.yaml +++ /dev/null @@ -1,66 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '360' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: 'Reply with exactly: pong' - model: gpt-4.1-nano - frequency_penalty: 0.0 - logprobs: true - max_completion_tokens: 20 - presence_penalty: 0.0 - prompt_cache_key: chat-cache - prompt_cache_retention: 24h - store: false - stream: true - stream_options: - include_usage: true - temperature: 0.45 - top_logprobs: 1 - top_p: 0.55 -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFfVBYefWjVkr4uYjUN73cMu9in","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":{"content":[],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"MAVeFjSgGC3AU22"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFfVBYefWjVkr4uYjUN73cMu9in","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{"content":"pong"},"logprobs":{"content":[{"token":"pong","logprob":-0.00001652451464906335,"bytes":[112,111,110,103],"top_logprobs":[{"token":"pong","logprob":-0.00001652451464906335,"bytes":[112,111,110,103]}]}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"Um8"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFfVBYefWjVkr4uYjUN73cMu9in","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"Dnjt"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFfVBYefWjVkr4uYjUN73cMu9in","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":1,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"85jAo4mEna"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream.yaml b/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream.yaml deleted file mode 100644 index 36baed1..0000000 --- a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-non-stream.yaml +++ /dev/null @@ -1,78 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '321' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: 'Reply with exactly: pong' - model: gpt-4.1-nano - frequency_penalty: 0.0 - logprobs: true - max_completion_tokens: 20 - presence_penalty: 0.0 - prompt_cache_key: chat-cache - prompt_cache_retention: 24h - store: false - stream: false - temperature: 0.45 - top_logprobs: 1 - top_p: 0.55 -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: chatcmpl-E3zFeEtC9zV7WYoqlKB9EeX0qyYda - object: chat.completion - created: 1784619142 - model: gpt-4.1-nano-2025-04-14 - choices: - - index: 0 - message: - role: assistant - content: pong - refusal: null - annotations: [] - logprobs: - content: - - token: pong - logprob: -1.652451464906335e-05 - bytes: - - 112 - - 111 - - 110 - - 103 - top_logprobs: - - token: pong - logprob: -1.652451464906335e-05 - bytes: - - 112 - - 111 - - 110 - - 103 - refusal: null - finish_reason: stop - usage: - prompt_tokens: 12 - completion_tokens: 1 - total_tokens: 13 - prompt_tokens_details: - cached_tokens: 0 - audio_tokens: 0 - completion_tokens_details: - reasoning_tokens: 0 - audio_tokens: 0 - accepted_prediction_tokens: 0 - rejected_prediction_tokens: 0 - service_tier: default - system_fingerprint: fp_90b6cb65ff diff --git a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-stream.yaml b/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-stream.yaml deleted file mode 100644 index ca3c33d..0000000 --- a/tests/cassettes/openai/chat_completions/test_model_settings/test_chat_model_settings_round_trip_through_sdk-stream.yaml +++ /dev/null @@ -1,66 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '360' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: 'Reply with exactly: pong' - model: gpt-4.1-nano - frequency_penalty: 0.0 - logprobs: true - max_completion_tokens: 20 - presence_penalty: 0.0 - prompt_cache_key: chat-cache - prompt_cache_retention: 24h - store: false - stream: true - stream_options: - include_usage: true - temperature: 0.45 - top_logprobs: 1 - top_p: 0.55 -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFdHCDXRfWWnwF1G3tOmpcCs3fv","object":"chat.completion.chunk","created":1784619141,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":{"content":[],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"g1ynMHNh4JcbkrZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFdHCDXRfWWnwF1G3tOmpcCs3fv","object":"chat.completion.chunk","created":1784619141,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{"content":"pong"},"logprobs":{"content":[{"token":"pong","logprob":-0.00001652451464906335,"bytes":[112,111,110,103],"top_logprobs":[{"token":"pong","logprob":-0.00001652451464906335,"bytes":[112,111,110,103]}]}],"refusal":null},"finish_reason":null}],"usage":null,"obfuscation":"BBE"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFdHCDXRfWWnwF1G3tOmpcCs3fv","object":"chat.completion.chunk","created":1784619141,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"fotb"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFdHCDXRfWWnwF1G3tOmpcCs3fv","object":"chat.completion.chunk","created":1784619141,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_90b6cb65ff","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":1,"total_tokens":13,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"pG0oVXCndd"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object-sse.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object-sse.yaml deleted file mode 100644 index fbd9a49..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object-sse.yaml +++ /dev/null @@ -1,88 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '238' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_object - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"kbe05sMx"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"{\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"l9CYP0G"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"name"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1bQmTt"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"\":\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UtIlP"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"Mol"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sUPHQzz"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OrRtKTvD"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"\"}"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YZgiqev"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ypmV"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFlB7Izyl6j7DXJCT0OcKDzFIt5","object":"chat.completion.chunk","created":1784619149,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[],"usage":{"prompt_tokens":24,"completion_tokens":6,"total_tokens":30,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"nZ7IyKbQgP"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object.yaml deleted file mode 100644 index 5295483..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-object.yaml +++ /dev/null @@ -1,53 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '199' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_object - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: chatcmpl-E3zFkC8yhKrExUZ7ljW5mgxMnmrxt - object: chat.completion - created: 1784619148 - model: gpt-4.1-nano-2025-04-14 - choices: - - index: 0 - message: - role: assistant - content: '{"name":"Molto"}' - refusal: null - annotations: [] - logprobs: null - finish_reason: stop - usage: - prompt_tokens: 24 - completion_tokens: 6 - total_tokens: 30 - prompt_tokens_details: - cached_tokens: 0 - audio_tokens: 0 - completion_tokens_details: - reasoning_tokens: 0 - audio_tokens: 0 - accepted_prediction_tokens: 0 - rejected_prediction_tokens: 0 - service_tier: default - system_fingerprint: fp_a3916001b6 diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema-sse.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema-sse.yaml deleted file mode 100644 index b5ad902..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema-sse.yaml +++ /dev/null @@ -1,100 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '453' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_schema - json_schema: - name: final_result - description: A deterministic JSON response. - schema: - type: object - properties: - name: - type: string - required: - - name - additionalProperties: false - strict: true - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wUcoYKub"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"{\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"SgUtNoY"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"name"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"u5qthl"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"\":\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Svdmf"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"Mol"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"bQJt6un"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uvpZuzY2"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"\"}"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9ArMAHR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"MD2f"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFjSxZCbRSv8xLwVeESxC7FqQLk","object":"chat.completion.chunk","created":1784619147,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[],"usage":{"prompt_tokens":60,"completion_tokens":6,"total_tokens":66,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"rS0tw8CAwl"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema.yaml deleted file mode 100644 index c39b3fd..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-non-stream-json-schema.yaml +++ /dev/null @@ -1,65 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '414' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_schema - json_schema: - name: final_result - description: A deterministic JSON response. - schema: - type: object - properties: - name: - type: string - required: - - name - additionalProperties: false - strict: true - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: chatcmpl-E3zFjIYV8OZkanF0l5phxZI7uQMDt - object: chat.completion - created: 1784619147 - model: gpt-4.1-nano-2025-04-14 - choices: - - index: 0 - message: - role: assistant - content: '{"name":"Molto"}' - refusal: null - annotations: [] - logprobs: null - finish_reason: stop - usage: - prompt_tokens: 60 - completion_tokens: 6 - total_tokens: 66 - prompt_tokens_details: - cached_tokens: 0 - audio_tokens: 0 - completion_tokens_details: - reasoning_tokens: 0 - audio_tokens: 0 - accepted_prediction_tokens: 0 - rejected_prediction_tokens: 0 - service_tier: default - system_fingerprint: fp_d2dd1eedd3 diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-object.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-object.yaml deleted file mode 100644 index 228fac7..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-object.yaml +++ /dev/null @@ -1,88 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '238' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_object - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s2V1eQRj"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"{\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JvrEruI"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"name"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"wRNBAd"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"\":\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s4ZvO"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"Mol"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dxPBdSO"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"V54AqyVw"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"content":"\"}"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CE7fEte"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"GLTO"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFgPPPjzjPquuHtQuGOXIeoWtaS","object":"chat.completion.chunk","created":1784619144,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[],"usage":{"prompt_tokens":24,"completion_tokens":6,"total_tokens":30,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"DH2LL55jd3"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-schema.yaml b/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-schema.yaml deleted file mode 100644 index a21176f..0000000 --- a/tests/cassettes/openai/chat_completions/test_response_format/test_response_format_round_trip_through_sdk-stream-json-schema.yaml +++ /dev/null @@ -1,100 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '453' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: Return exactly the JSON object {"name":"Molto"}. Do not include markdown. - model: gpt-4.1-nano - response_format: - type: json_schema - json_schema: - name: final_result - description: A deterministic JSON response. - schema: - type: object - properties: - name: - type: string - required: - - name - additionalProperties: false - strict: true - stream: true - stream_options: - include_usage: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Q8m6rGOF"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"{\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"U381VtO"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"name"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"eW7BbY"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"\":\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fIVPl"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"Mol"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"z0wJoeg"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"to"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OjbrEOzp"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{"content":"\"}"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"f66Rm54"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"ArMb"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFf7t9lZM4KBzmabSmzw9FsI94W","object":"chat.completion.chunk","created":1784619143,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_d2dd1eedd3","choices":[],"usage":{"prompt_tokens":60,"completion_tokens":6,"total_tokens":66,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"IYVsI2q7eo"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream-sse.yaml b/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream-sse.yaml deleted file mode 100644 index 76da9cf..0000000 --- a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream-sse.yaml +++ /dev/null @@ -1,96 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '446' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: true - stream_options: - include_usage: true - tool_choice: required - tools: - - type: function - function: - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_GGybMSkIBmt3hqahQ0oY3jpN","type":"function","function":{"name":"guess_number","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Wo"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"i5gzQ3tIdq6ZK"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"number"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"JdWIL8BHUS"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e3YYB3V46mNzf"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"50"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2KFdcFDM7X1BMb"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"uixqRxJlHE8WHnx"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"vHXi2SmqYmDI3f"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFoWvBWtcEUSR6IkdI1Mo5C4lHu","object":"chat.completion.chunk","created":1784619152,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[],"usage":{"prompt_tokens":53,"completion_tokens":15,"total_tokens":68,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"M4YDbU42T"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream.yaml b/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream.yaml deleted file mode 100644 index 9c81bc8..0000000 --- a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-non-stream.yaml +++ /dev/null @@ -1,73 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '407' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: false - tool_choice: required - tools: - - type: function - function: - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: chatcmpl-E3zFoignUF43zLHhfXJzQQ4FmzIr8 - object: chat.completion - created: 1784619152 - model: gpt-4.1-nano-2025-04-14 - choices: - - index: 0 - message: - role: assistant - content: null - tool_calls: - - id: call_M6MOGFPu2Eo5DUjkHBxEQe7V - type: function - function: - name: guess_number - arguments: '{"number":50}' - refusal: null - annotations: [] - logprobs: null - finish_reason: tool_calls - usage: - prompt_tokens: 53 - completion_tokens: 15 - total_tokens: 68 - prompt_tokens_details: - cached_tokens: 0 - audio_tokens: 0 - completion_tokens_details: - reasoning_tokens: 0 - audio_tokens: 0 - accepted_prediction_tokens: 0 - rejected_prediction_tokens: 0 - service_tier: default - system_fingerprint: fp_a3916001b6 diff --git a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-stream.yaml b/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-stream.yaml deleted file mode 100644 index b6daf02..0000000 --- a/tests/cassettes/openai/chat_completions/test_tools/test_tool_choice_required-stream.yaml +++ /dev/null @@ -1,96 +0,0 @@ -request: - method: POST - path: /v1/chat/completions - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '446' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - messages: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: true - stream_options: - include_usage: true - tool_choice: required - tools: - - type: function - function: - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"role":"assistant","content":null,"tool_calls":[{"index":0,"id":"call_xGxVzBy5SmjjhEiF15B7aE8x","type":"function","function":{"name":"guess_number","arguments":""}}],"refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CF"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\""}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"UPr9DJroOjDDo"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"number"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"o8EG1abcUd"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"\":"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"e6QtUiHKr2I9g"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"50"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Zwbti1GKz9tmGG"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"}"}}]},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8FnQ6RKSUqg65Gf"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"P5n82GYM1xgcFh"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-E3zFnrZNOf8oehQMAfd44Vokg1ugc","object":"chat.completion.chunk","created":1784619151,"model":"gpt-4.1-nano-2025-04-14","service_tier":"default","system_fingerprint":"fp_a3916001b6","choices":[],"usage":{"prompt_tokens":53,"completion_tokens":15,"total_tokens":68,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"RuttifnCk"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' diff --git a/tests/cassettes/openai/chat_completions/tool_choice-required.yaml b/tests/cassettes/openai/chat_completions/tool_choice-required.yaml deleted file mode 100644 index ea161b0..0000000 --- a/tests/cassettes/openai/chat_completions/tool_choice-required.yaml +++ /dev/null @@ -1,74 +0,0 @@ -filename: 2026-04-06-019d6166-8129-7743-9ce3-a52f411c433c -request: - body: - messages: - - content: What number am I thinking of? - role: user - model: gpt-4.1-nano - tool_choice: required - tools: - - function: - description: Guess a number. - name: guess_number - parameters: - additionalProperties: false - properties: - number: - description: The guessed number. - type: integer - required: - - number - type: object - type: function - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '378' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 019d6166-8129-7743-9ce3-a52f411c433c -response: - body: - choices: - - finish_reason: tool_calls - index: 0 - logprobs: null - message: - annotations: [] - content: null - refusal: null - role: assistant - tool_calls: - - function: - arguments: '{"number": 50}' - name: guess_number - id: call_r4eJq81egGOYptvBkw0uZWcm - type: function - created: 1775455602 - id: chatcmpl-DRXOc2HFVfTWfl9KKx06EVj1hHeoT - model: gpt-4.1-nano-2025-04-14 - object: chat.completion - service_tier: default - system_fingerprint: fp_3ecbc2e313 - usage: - completion_tokens: 16 - completion_tokens_details: - accepted_prediction_tokens: 0 - audio_tokens: 0 - reasoning_tokens: 0 - rejected_prediction_tokens: 0 - prompt_tokens: 53 - prompt_tokens_details: - audio_tokens: 0 - cached_tokens: 0 - total_tokens: 69 - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-04-06T06:06:40.937771+00:00' diff --git a/tests/cassettes/openai/conversations/test_conversation/test_conversation-non-stream-setup.yaml b/tests/cassettes/openai/conversations/test_conversation/test_conversation-non-stream-setup.yaml deleted file mode 100644 index 272ffc5..0000000 --- a/tests/cassettes/openai/conversations/test_conversation/test_conversation-non-stream-setup.yaml +++ /dev/null @@ -1,29 +0,0 @@ -request: - method: POST - path: /v1/conversations - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '189' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - items: - - role: user - content: Tell me a short joke about a scarecrow. - - role: assistant - content: Why did the scarecrow win an award? Because he was outstanding in his - field! -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a - object: conversation - created_at: 1783501313 - metadata: {} diff --git a/tests/cassettes/openai/conversations/test_conversation/test_conversation-stream-setup.yaml b/tests/cassettes/openai/conversations/test_conversation/test_conversation-stream-setup.yaml deleted file mode 100644 index 8fb8203..0000000 --- a/tests/cassettes/openai/conversations/test_conversation/test_conversation-stream-setup.yaml +++ /dev/null @@ -1,29 +0,0 @@ -request: - method: POST - path: /v1/conversations - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '189' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - items: - - role: user - content: Tell me a short joke about a scarecrow. - - role: assistant - content: Why did the scarecrow win an award? Because he was outstanding in his - field! -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: conv_6a4e11fd1ef08197868f262d1ea16f260f1c93e16473ce59 - object: conversation - created_at: 1783501309 - metadata: {} diff --git a/tests/cassettes/openai/exceptions/context_length_exceeded.yaml b/tests/cassettes/openai/exceptions/context_length_exceeded.yaml deleted file mode 100644 index 38d99c3..0000000 --- a/tests/cassettes/openai/exceptions/context_length_exceeded.yaml +++ /dev/null @@ -1,13189 +0,0 @@ -filename: 2026-05-06-019dfbb1-4305-7e61-9677-ea831f4b097f -request: - body: - input: 'Repeat this exactly: x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x ' - model: o3-mini - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '1000051' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019dfbb1-4305-7e61-9677-ea831f4b097f -response: - body: - error: - code: context_length_exceeded - message: Your input exceeds the context window of this model. Please adjust - your input and try again. - param: input - type: invalid_request_error - headers: - connection: keep-alive - content-length: '228' - content-type: application/json - status_code: 400 -timestamp: '2026-05-06T05:09:51.493582+00:00' diff --git a/tests/cassettes/openai/exceptions/incorrect_api_key.yaml b/tests/cassettes/openai/exceptions/incorrect_api_key.yaml deleted file mode 100644 index 9923185..0000000 --- a/tests/cassettes/openai/exceptions/incorrect_api_key.yaml +++ /dev/null @@ -1,28 +0,0 @@ -filename: 2026-05-06-019dfbb4-8a91-7ca0-9bbd-259c2e3d50ac -request: - body: - input: hi - model: gpt-4.1-nano - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '37' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019dfbb4-8a91-7ca0-9bbd-259c2e3d50ac -response: - body: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: sk-inval********2345.\ - \ You can find your API key at https://platform.openai.com/account/api-keys.\"\ - ,\n \"type\": \"invalid_request_error\",\n \"code\": \"invalid_api_key\"\ - ,\n \"param\": null\n },\n \"status\": 401\n}" - headers: - connection: keep-alive - content-length: '266' - content-type: text/plain - status_code: 401 -timestamp: '2026-05-06T05:13:26.417041+00:00' diff --git a/tests/cassettes/openai/exceptions/missing_api_key.yaml b/tests/cassettes/openai/exceptions/missing_api_key.yaml deleted file mode 100644 index f73eda9..0000000 --- a/tests/cassettes/openai/exceptions/missing_api_key.yaml +++ /dev/null @@ -1,29 +0,0 @@ -filename: 2026-05-06-019dfbb4-f7f4-7fe3-8a64-7264835c36a4 -request: - body: - input: hi - model: gpt-4.1-nano - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '37' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019dfbb4-f7f4-7fe3-8a64-7264835c36a4 -response: - body: - error: - code: null - message: Missing bearer or basic authentication in header - param: null - type: invalid_request_error - headers: - connection: keep-alive - content-length: '160' - content-type: application/json - status_code: 401 -timestamp: '2026-05-06T05:13:54.420646+00:00' diff --git a/tests/cassettes/openai/exceptions/thinking_budget_exceeding_max_tokens.yaml b/tests/cassettes/openai/exceptions/thinking_budget_exceeding_max_tokens.yaml deleted file mode 100644 index 87e4342..0000000 --- a/tests/cassettes/openai/exceptions/thinking_budget_exceeding_max_tokens.yaml +++ /dev/null @@ -1,34 +0,0 @@ -filename: 2026-05-06-019dfbb3-48bb-7310-a2e8-74f77e217465 -request: - body: - input: Think very carefully about this. - max_output_tokens: 1 - model: o4-mini - reasoning: - effort: high - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '114' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019dfbb3-48bb-7310-a2e8-74f77e217465 -response: - body: - error: - code: integer_below_min_value - message: 'Invalid ''max_output_tokens'': integer below minimum value. Expected - a value >= 16, but got 1 instead.' - param: max_output_tokens - type: invalid_request_error - headers: - connection: keep-alive - content-length: '248' - content-type: application/json - status_code: 400 -timestamp: '2026-05-06T05:12:04.027211+00:00' diff --git a/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream-sse.yaml b/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream-sse.yaml deleted file mode 100644 index b91c779..0000000 --- a/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream-sse.yaml +++ /dev/null @@ -1,310 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '223' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - conversation: conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a - include: - - reasoning.encrypted_content - input: - - role: user - content: what joke was previously mentioned? - model: gpt-5-nano - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_01df79695edf428a006a4e1207498c8197a05d958ad1f97fd6","object":"response","created_at":1783501319,"status":"in_progress","background":false,"completed_at":null,"conversation":{"id":"conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_01df79695edf428a006a4e1207498c8197a05d958ad1f97fd6","object":"response","created_at":1783501319,"status":"in_progress","background":false,"completed_at":null,"conversation":{"id":"conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_01df79695edf428a006a4e120803848197b42da0a1b57bab75","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThIIZPSY42LjOV4mcwYLTLtzNOeeBP1exqLu-aQSsXtxPd6QUi_3neU2HdLbHl3yTxIZIE2y4b3WvOFynZ8jzx7CIknPUTgX2FZPY950u3KyIG8XzBl_gghfnFxII5Bcvi3__SINb50is1pbZ1GNvdXQWbu30dWlMLN6lbBitF7UNzAAL0My5bVJTpMr4zpTG8WkGBJC3qIFNr04A9VpbYdNJ1gzV5fZPns58rdFtZxvRbzgLunR1Uiaf5vcXnAcfLYEyLXLUVycYXVIYMx54PtO2J05UoZQPkjEpvbCPn6eO8pgosAjGJqsAncyZBn_Kp2iK5VmoTrXi_cji7qJy5zTLEkgPXPEpcU8TynFAjd1DjH-WP8bT2chQCKyNdqRBhMflw3215jdjrjm0nZKTnXvU-T6cLGUrpEKbiyldS4WXOIaoaDZw9OpIAU_bojTDLsNyoLfa-MsidAUrdGuCJMAp63goIdapa7jLOAIiDhsz5PD3DAUGwPnxM4zWOnodaGVtEFj5xGwQXokASmrDRDDbtC9f8ew0sHlDyYwv72TEFZwYEzzwVdVOl7z78b6a3JdTSnWXowimsyHFaaV8rqsaFNOzUWAhr5C1JBcP_tLyVWiJzrkVikKgjVpimq1pCse8aZK7CvGwkwNdTuMXX6WFPjKH-NBrtuQWSxEgdY5vHK4vh5a-vkhztkr6ste5JLrvZIRK85IaKLG9EsiLJTuqdHjV2A0hKRpY__So1iGRYKJbyw2wkdpwNbu94FikclOLyMy6AknLk6dz84motCHvefyFvY1eiATQmOBDhLC_IvnNK8Aflf5RMXMibE8NhasusrajfE8t78azrAukh7EaFLyEGILZYJWr_Rz6drxZ1Yj5FQCGxEJVunMoP4yJQReMqWPo40DRv2izz4weVYlEYsK_C_MubJj8Qq06nk2bFM=","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_01df79695edf428a006a4e120803848197b42da0a1b57bab75","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThIKHupW5hHMRScxYoQkX7drQBF1ToEsC9qJMMaJBmqjYRJx-WuqTZSSWSvEGE07HbiJPAjgysa0EKaQIlps1zUTs5EZ4RYxKDLl23wjhOEYBgumonr6iBFRwYm8ZUiuRDxpApAZ-t4wbX-2ObaFHUdFRhVBMkB1pP76Wef6Vrb28m8HaTgh4emeDoOrkplghusgN9E5VnO-zk2fYAHdL-2_fDvCI7z0YrWqEjGJBVPKwm5GcHiBszVG29NLHdQQAVb8U1Fa8g6wcUoHuOyIZy0Kc4FgB81dpJuF36_Hmt4fPd3vrKa-LC9YJ3_6Nzqxrl4_KYZuaLJTJFA65wcuqkfwKZu2b2b9GJyml4uJ2LvJcu4EwhWcjq_Io2-hJ8t6orNVaWutqOVrvlV6MkLBbVvPzGcE1UIbCEs9r02boN575_ciHvJ9feXqcGaexx46zkLQVuUnIcFSDLH0l0V3x69wysMVvsvlhMR7KCFWhe9kb_SF5Rjt_YCKiDDjq5LUHC0qvOqQ-M96IaGuDU656aIyMqJXJTJgN-rluH2QGp1av3EnOjKwA9VkQwHK8Qdm-CGz5iQGcK_04sAcGCxoxgm9PG3x2iwmC7kljzT5mczje5Wjlt8_jF2KshpnGQxR8YOwyCffaYKAogHxxdtdQNj7AQXI0_QhfA6-9IZsqUSTlKDz2DzWvwcwrEckCdkmlIIIELLqMH4Jfa0iGtCwPYhCQNKtKDPiqljyG_cllKCB-b6kAFtSACaR3lkOGAPcjfq08gUEtaxvGy9CEilnQJrkDTxdpRRlWXxjOGVpA-3pWGutQQEdrvStQ-biKXdIeZHCffeT8HpEHWTkdxJDVBz-WcuPJIh7xjmcgYfSi5GuIUTlZXfy2m5BT-On-ChuldT5yxhVPPiLiN-dpr0vdaPbOT3bSTBpirlFnwbHwNwmx57elC3wJKDlELctaAmUop3J6k8wn5uAk0zK4vGtMbeZSz9h9l4iJzfWl3e11BA5vk4AHVWZZDK3A0MVLmwKslTEiZ3ScjjLrMahjMa2Y-xj2QqmNztf-fodRZpKQu2eqOummEuNf0RYGmwVYoamcnYMibkFbtMR8LeFyutSb3KNmTaDNVGN0TpNVyPxH7zfU32BH8y2-Qw4KFzwjLj9EH50iOXefdBAiydmcfMLpts4EIgvyvZhlj4WmqsRqBdxkk2vH3MQY5IQgIak09XgmvllATFYr-IDQ7nzBXBvoxCxPEoIHZD3sUi6-i_c-gu9SUoAOyA4mBurs1HfV-3STHEUKUSL37uqJjjE5lRKHsKC_4ZKApr9F0Uq4wWhoSW20tPIdF9JX7HzrEgVWGsXnTxzq_Ii_x_Cd-J5ubULTy_fc1QB9HhTv_z0VVJPUvVf09S9T7ZNrMCEJzpiXvyjttIVxl-edrF45d4ziGcTqrtxm2cKxUwBiLX722TUGgnsmXNxwe1e_YnRBcveGQWaXCsdCDxm_EbdwAQacuIflBMD82k5WoziD1oYNnT00uKHNhsw35xEdzBhnPGxFWhZkAdtkt1brS8lYvvbKe_OVksFGKAki4nSxoXaxVw9deKg9GBnY6x10vPRrQ8A1cYQ3BQsHOASxDX-FB2dCnsfx3Vo_rGuAzJ3whtva6e_xwXP-qymYdAZwmWv2LJ4eQxuywPnY6jB3QWFe8tdhYO9Jr1Cj2BDH226XgrwqBMtOTgqAdkIaG4K7dFEBJGctkmVQj8s8o7eZHGwCnUU-kB0Ff8zeC2aKjTQOsZm-P7oghAODE996OJG01SGklaZyb3mXU3-vtZyCSrkGdIn1nZAZ25zSs0EOS1nrzI92Msko_-zhnzx239I5mMCLftX62KXNHPpzZGVbSjCDFV-7mqSaZShIfbLSpu0UBL49iiqeW7Z7EsFoEmXeLf9w8Rn_mIHiQYvB44Y4MCauyYnZrav_qzTsMhszaSFIhUrbgNQe45g3QK5yuXt1xUAcM-dZmrDfCrTFlPYyf6AGhrpkTr2-ZT0hy52rOXCYv62tOw08C_w_7WHETVHOaOEnN4HXU_fLS6ylf551XKI1zlgZaNk2xwg9NftQ-gK1ugXbwNQ_Fyq8kF3Ocvmm8wi6dQPrKv-cCuQ2eGpyVCkm0LwrIB9ZksYkZGWCtvk5R5zVF7h-dUdWqkY5QD2qWS1_VvDq7vLNTJEkrWaJCDNb-ZETFvQx6A97u0YSLDAjgK0XFhRTwhN6BwE-yHCnUXMbh5oqwGG1mDV73ktIOvohALWueIlzUTePOHI8OkXcrnPwyDj48blC7DUex27u6fIW2JXeZzJTrt9syDhd6hnSdMSbgtbMz3WJo76KtxvOEsx_lW2U42hQ7RRlmMaem9dLnt25vL0dZw7kqHmrsYsXWzfLA3Jwa8ykkZXnb1t2o6BRRPtqnQhJIRUh5aK-0ggQ2rxfukK8C--xUvmwXJeJzFaETnla_vOudhfct-2NjjbiW-OvEt0csQ4tH_T7pq-nTIBZ38rydffKLoDMlBDSINjyKnw4P0iLEdYCPsKuyk36buHjeFhkeKA7iD56Qr4O0GmmzQvRioI","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"It","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"VG6rHWxpXcGZDI","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" was","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"M93yXDsSF9oe","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"6gPnZsSfkOmwuEw","output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" \"","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"2LGiMVx3ItCMZS","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Why","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"4fB7RAtSVgIcD","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" did","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"uNVjqyfWF6YT","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"dTzvYn1SdXfu","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" scare","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"oB7wumG7WQ","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"crow","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"ZVQscFUTJHEi","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" win","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"uzPyJgVWquUi","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" an","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"rLzBthlju0MJM","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" award","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"etd59M1loy","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"8pC6gBsACCIUkPJ","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Because","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"TG09Bl6g","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" he","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"NWw8j8fNgHp9E","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" was","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"ptlJyN2XyoRo","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" outstanding","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"9f0A","output_index":1,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"lB2112FSN7qUk","output_index":1,"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" his","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"ZLOnda54CPl6","output_index":1,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" field","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"u8TXSHSy2I","output_index":1,"sequence_number":25} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"!\"","item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"obfuscation":"IPdIhzlpk9FdBL","output_index":1,"sequence_number":26} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","logprobs":[],"output_index":1,"sequence_number":27,"text":"It - was: \"Why did the scarecrow win an award? Because he was outstanding in his field!\""} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"It - was: \"Why did the scarecrow win an award? Because he was outstanding in his field!\""},"sequence_number":28} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It - was: \"Why did the scarecrow win an award? Because he was outstanding in his field!\""}],"role":"assistant"},"output_index":1,"sequence_number":29} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_01df79695edf428a006a4e1207498c8197a05d958ad1f97fd6","object":"response","created_at":1783501319,"status":"completed","background":false,"completed_at":1783501322,"conversation":{"id":"conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[{"id":"rs_01df79695edf428a006a4e120803848197b42da0a1b57bab75","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThIKjcrGLP7DkahgcaJmc4XVSvcpUtF0jKIoLoqyqAIDXBLqmdWxP8LcuSoSF24nBeEVPf7Z79J66nJ-hpxCm9hnAdbt_QmJLT-NBIYhz0aItydJxC2dyAMlGyYFyjTH4WhwS2__0ByOFG4xB2wQyrnqV7Ktl-M6L3d45VnByFprvQJfSSWncuYo4zxWz90vKmqmWZeLRdrJhVZUq2W1K7Sqv-3HbFZn18ALIePWy9Jvk1MlMokt66PT6614IGrwoSk9sORW87snl-zbasAtCnjbVwTB1qlBmomQBsO5VPDU78IJ61OSBwiDKJI3l619HYxWk5Y6yVrWlP5R9VaEojkSs4W51ov990Ro24Gr36a4qAufD413--8gF8SxAHaGxsMj6nqqYMWRb9fochbPFvSFeEOh7pFYdkL0bFVul4y-UJBxC8ZUbKmglDW8FjYyUEyomEean-MnEArWoGXtMNnkxbsTuuTe9-byLyF_Yru-DpGvbjHOpsVCjOF9_hmlKEBFkOUeXYvzRWZ-bexh7YfU1DaMzhBbhORPvH-MTlZ8KHhfeT2TklHkLzXKaycPPeCHopyPigFkAKWcl-cJpXXyHh1zSDNzpMTCC2OQ60TDVibdfuDY-yprZBgbyJvCdobMH_y6jCLCAv_S720U6rP3bUj6jSTBgCJznNAyGB0gHQuzRdFUfjb9wx8hgChZM5Y4DQXlt9NGCI6HjOPXeMsfQIyS5UtpaeUWKxOV830qgCcgHP6jTL0a7EqrL2pCrAzS3b-SeaiSL6iv99KfErrqmHUvI5euWcWc66AGNgaYtdYwZTT6R4AL8zL7xJoApccNk9Hp_8jFuSme8lfDrxD2AKfb5MnsmeEDlOTM3jF-EWRb2_d8xtgOp47HvtNsD0RCycC_fkqWjnFenRfhahSOHfpaEwVvjw2yJ1hmiVOkjsBoUNtIyFXHWDlW_ymeX3WzvtUeiY18Ofcx2JmEgREVKAb8ppoWOoK-K2mwJ7YxX9rwUM6tcflkExJVh-fNXXs_wWjTf7jWlozw1I9kwB8RTEDh0cvZJqGdlMDLUaTTMAdBuSvoWFgJnGeS_6LwrOATGQwBCAOWzzPF2NPbZ3AFHd_I4jJTATI3vAtTe1pkkpkpOL3IwWwpOMyx5M_YxJ-SZj7Q8zCpcyyrgF01vAR-gG5E8fiEyDPKWH3G2BHXOeVq45b19AzkutlJQ48bwT1NN98BF9Ola2B8-nM257eYjfncDrylm0Mx7_cAj4LvNNrV-Ilae0Op2_bCwE1Ag-XLz7Y8ZJ_iBhaXYKCPvIOZT5DdyD3NFVenuqEwEja8KRevWhXCTBAIh_VRZjSwseAa92XgtWu18NTziXVA5T2C-tqsjbcGodx_IYShGslwzrM57taBQAer_w1GQGzNs9zwA1D2yhyZJZWyP7kfdrjxoTszWuoSX2zbOpIG6emljlEQPw0qVSbrMflnc8xp-SZoEVMbAwtqZvFeMikcWjyDqneWfE0MTsEzUf8aODOauMAqpyrfURgrejsUBIWyqb9EF516E0HW70K-w91sgUx1RqYa2RwqRBX6Hev6tUna3lH3FAwKPNMpBaxZa8NOXiN9JHMcQoVg3QffJkN9PoyasoTHR2jhaluEy5ziuOtcjVdrBIGWXjUX4x8rvJIGY0LoBNOLPULD4tts82-cxmvkOawhCJWCvh2wR3MQvz95SVolXb41Ok9xvm16SDf8S1WqrFV6UJWEZ89qT2ZjD-9JNoOvBSI9b-TAX4kuvvmOtztFnHBcoq0dcwPMZptYHSmBXzkRWdewnpZndcTaZhBSx0d3U879ijtSAoj7CxGc2pAwzIB79V8LhsFNxHixKoWEpKJWww_LTBfjtoRdZ2qaKQHoDY8UMc30A7ACfukyqUt-u8x9e-R067CO_QrZ0uPExmKUCaHFNCcT8U94EikYNAFbF7yWq55G0J6RmwENIN8GDWwhpZvWILbcPPbBs0itiTCMVmiSZUOsHZV_epNjFtsYERhYPDbwjgGTMvGS208cf8K0OshmhpSgT6irCBJk5_x8eia-vLmVcFXZnfBhYqvH8sNMdtYJCXjCLc5H9gx15P1gYzxIWlaEL7lWp4mqaqH0jbisR_HKEvJAdypEnvdo0dI7FvDuL9Y8Si2EQB_uVIWGYyyF9QBFhHuzOqHvPVszmuE-9Na9GZl72rXkKAxmE5iFFbGGZSdbq0gPb919w3In1cmZuyvUtjzyYtQXa0yUjY8Nq-LdozCVoAp4jSTgmwU0BC5IILEPtDkMHIClZ-ZouEBwAPIAiCz0WMuYqrueuL0bDVU42-BKj6SqZNYaG2YlahBEF57vWiyF9wvfaTBag5SSdCS1vSLxNb9MapmDsAPb4l9Yp_VDXQRGcbTwuv9FZTnZjU4yT6paOjuy9P2VtYIWOBOgg7J0XC_EYgE6OBbbLLbEBQNDyVzYaMB4wkJ_XwJOUIjQ6c9KPLE1YBz1bZhUsagYUMxnAzPj2rAAjiIxZ_fYBsgh3JRm6s-vxIFOD4CD0GG4KCDnXYGWllOuB1QHe573gxzPZ1Xx","summary":[]},{"id":"msg_01df79695edf428a006a4e120a2b588197bf448cb27d4f995f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"It - was: \"Why did the scarecrow win an award? Because he was outstanding in his field!\""}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":86,"input_tokens_details":{"cached_tokens":0},"output_tokens":282,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":368},"user":null,"metadata":{}},"sequence_number":30} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream.yaml b/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream.yaml deleted file mode 100644 index a6b69ee..0000000 --- a/tests/cassettes/openai/responses/test_conversation/test_conversation-non-stream.yaml +++ /dev/null @@ -1,107 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '224' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - conversation: conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a - include: - - reasoning.encrypted_content - input: - - role: user - content: what joke was previously mentioned? - model: gpt-5-nano - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_01df79695edf428a006a4e120262388197abb36e1545f8764b - object: response - created_at: 1783501314 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501318 - conversation: - id: conv_6a4e1201f8cc819780cb38bab453012501df79695edf428a - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: null - max_output_tokens: null - max_tool_calls: null - model: gpt-5-nano-2025-08-07 - moderation: null - output: - - id: rs_01df79695edf428a006a4e1203675c8197bfad274c2d48a6c8 - type: reasoning - content: [] - encrypted_content: gAAAAABqThIH2mUmtpVORs5ucFiSIbCbudlajxaQQXWH-UwpuGGfCfEeieBTk1XoxWtgWayJlzKbfJzPmv2GvFjm7fKBp1PE2PZ1u_lwhl5XDDdoNcYtkeMMEzzcsxokJixo_0kRCO4u_1eVS8wJwB-acuBVQRfv8V5FOW9qiRC0P_TH-mdak5LvyjCFuOHMJm5CHhcPnO7VLo8LYCTDwbhBiynrMvx1BKoRUB-HkQjH7oZkp_H6GiBUvwg6ly9Cm_qpbT0n5B9OkVS-ZK-867KOX-G-ZJGY1qWYD733nzcEibqd9-Zetc0v9oQ7SYL-k3fv7k60CSt91oDP8UsuBXtfdR5KxPzmNhJiyh0nXVnaJuM4_YWLGaNwMTb4TVYWnKP1kNsN70_A250ToU3Ug279O1Og4YhARaCbhjGfY9YJMkawBTKTyh7m1Dy3Az9Rx0IL9F_MyL5yA6ayHZ2hMcZU9o0ITvsU3_4x_ihQavVJWHPOeM-39qZtW2C3bkgD9xbAtnQe-DPQZpDlzuJ_I7E66ryekSQmwUZwDVIsZZnl8X82kUHQOEQHInuB9FgDyqRLahskpr544iRbviN5sI_o61mU5KUOjOuj3PTet-hiiMUQS3AaqmBx72BNVPxNn0vwM5hsEkQutxKF_zw162UcvBuz24gAVzLlyvTsZRlarGTv1Riaex5jFUeRzwCP_8r4Cx5yr7haR_J1KxVyOFZs-MJsq6PrYtcU5rcVkCHkNlnlyCgsdAb53pioff8ELJdemFyTPOuhZnJqc7w48fB-wTLsOOjF4Zrv932eoMAmd8UQ10A2NJAq5aNC8OTyTDI8FW-2-m9KHf4RDBdHDm2gxrj296wOU_B_euKsoIueSSjWqbtHMx31GxvZe7DXrCkpFjpIb_q3qlS53o5BSO99pcd9tKEdTPfNNDHp8sDXVpJKFZilu009SpGGDd2iwTTuRGtzvjJkXJmMBcnnJpIxoEtuIi133OiSpkI25LYqVJ1J1EZnsPFjwkwKfn_HEa1er6r-KpG5DQcS_R3IA2nelUIJlyAoeo_cktN7HTbph4ZEkPKFeIs0AzA_VBfk548Kwc_ph-z91Q0N5n0u7I8OGq2WHsZC3sOgFl20gaIuG9JEgSmLvfDrU3v-wGUjbHg7ixPdRoTriHfi5B8k2B3fpYfagjD_3HudG39GbpQC_O0y-1MqryQLOn3Gsn3cnDLru9mVkuzXsEpjcCuOs3nooLpkK23w2qZC2W1zwe6kvjpUfKYrhmKXC8iGKF-4aUg8Il8deDTOQNIJkzBGnJfq-DB_I5nOoN9LoI2-EdpprumxHvSpp2cVRjMKJM7yL_MRQgeHUbtoNjzCtrwm71HMU4tQZqpOBavrnpPqg5YA6shnkN4mObkecetTLVpcrmDSw_yn7mpflv_bEeEM8dJbRTu4VUtaP-lsPXn1Hj0cnI8pL-HoCh29zvpTSC7_FIXjqFWO1Uk2wgClI28FfhLmypJuA5tBX4oC5PylfnpSsE4i8h2MlK9TrlQ2ZDInI73ctgh1azJI6-lhp5Iny85Xw2dWMDieltjQ9RCdH3Xby1dnHsUPH5OILH80KIOoC9gZ7H7O-G0jHcrkpGTfhjaBbKaqhAOCMSfix0wEjDddhDtFC3sjRmNXd4tI1NysRA__39xrF-WjLLWk6L0rpj7p7pPVPZR971l54BljGKo0dtMq4jWGSUtsQ70DR5exNylAP_0bfM7bQVO6CUHPS6Nq68Hg0KYqKGCuNNhdUelmzteSt-uOs6KRrdhdQYbNcZRc0jg4Pp6CXZZHmLBWMI51xeWSsZaLhkwzCcV6tJwHNz_M1kH-pNq7unqT7wPmDAB8I5VodtMcFNkihYUNCHe7CBd-Bpm0dkJaz2-t1wBZU7mA_MzawpBL9vL548Qd4rkHySFpEOQ68Cdn7Pe02RC0dSvwjTQv56mr-W87tuAquQurpxnjfVX4x9SFvYNjSPyk9vkMPsLa9ODMlSzi-ai-zQG6h0RMutLSrV9UysCsoPZimzwgZuUbylwVF1cDqLtrc0ggXhQUBeOWWzR_FyI0v494FG8pTtBvfJdDtRQfTTlzmlsS_A0Djywe0Y3Yedsreatpj0Ct0P1hD0lOE8EXjMdRU1Amuw5-FRYImdHvv_qZtiVlBDrLe7frOSEV0j8q8I92HGOmMNZ_Ho2q1tradeeFcoyXZ3E29kyEbcaMzcTNmTPDuiVHk6xGgYhuERC5EPsYj-STuy55shTiQ9WC-pjmjy-288xHuJ2DyJkMbxfGe7sLTDKASYsrLAmy_VhM8jlb5gYz3jZgcKh07dGUQdOCbHJMjKlBpbpfDubipn3yA3l9Tz3qULJVvKf98HBLXrOd6H4sB0NNTG6moZPvknSsxXLGo2niawO6rMeHneDdedv7yg-_3hbtdyDrQg8Dhn4Aeqoquk7KVEBXpLEAs56C3fnwHmUMEAq_CS34e5HMRz4jhJ7KBMbB3ow0dVNuVG8T5Yi1ZTbRzZ-EiqNGoRa051jl_XSVSQp0xfK30Em-BSCKNgAZPXoS_9Yo7zCAHX-gNVWLAOBA4luZuQuyATeHuJvoLdRanwksxcLU8GfhF11nFYzo2h2Jks529g48y8DgmQwd - summary: [] - - id: msg_01df79695edf428a006a4e120610648197863294fff1c7ca2b - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: [] - text: 'It was: "Why did the scarecrow win an award? Because he was outstanding - in his field!"' - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: current_turn - effort: medium - mode: standard - summary: null - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 49 - input_tokens_details: - cached_tokens: 0 - output_tokens: 295 - output_tokens_details: - reasoning_tokens: 256 - total_tokens: 344 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_conversation/test_conversation-stream.yaml b/tests/cassettes/openai/responses/test_conversation/test_conversation-stream.yaml deleted file mode 100644 index eaceb94..0000000 --- a/tests/cassettes/openai/responses/test_conversation/test_conversation-stream.yaml +++ /dev/null @@ -1,323 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '223' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - conversation: conv_6a4e11fd1ef08197868f262d1ea16f260f1c93e16473ce59 - include: - - reasoning.encrypted_content - input: - - role: user - content: what joke was previously mentioned? - model: gpt-5-nano - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0f1c93e16473ce59006a4e11fd95748197b5837bbed94e317b","object":"response","created_at":1783501309,"status":"in_progress","background":false,"completed_at":null,"conversation":{"id":"conv_6a4e11fd1ef08197868f262d1ea16f260f1c93e16473ce59"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0f1c93e16473ce59006a4e11fd95748197b5837bbed94e317b","object":"response","created_at":1783501309,"status":"in_progress","background":false,"completed_at":null,"conversation":{"id":"conv_6a4e11fd1ef08197868f262d1ea16f260f1c93e16473ce59"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0f1c93e16473ce59006a4e11fe358c8197a75b798e4e10dcf4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThH-9kHnMTBbnnB5BVuJjmgTTMJo7p5AZCOMBconWkiFha3EsDExF99J91xQenrDxY7w9FYSpXIe8NCEjeLw6-2KpfPTxxMON-hzbmxnCSK5sJhAIerZK7UwE0EgwOaMLxwYZsVpHcQMkEUvhQPcM4yz8PVvp4cUDTaCNfx7AEBZJvfszDdCB4lCt-t0bTu4j6UwN7KlFRfaZJlITdOky_-KuwiUTzOdbzZatIwaDx8TP20x-ZT7IpDSOBCopq4g_yKCoavmCgTptxdLwWBkQR75TGiVSuoN2-QNcLOgBWJmd2QTSJbZ49fIQUU85CU8MompuMdAtGeI1iejqskfFRd6gSMDjkHNMnODfrtkdsDJCfyRFMS0dc1I8CS6DdSgy-6pssOkP2ZcZUP0rBTvcE9WiDz67_IG70sYN_9h7LAznZDkv8BkBYJZsdP0rf9xzFJ3BkZ6OGURHVpjrN37etnXcmHScHQXe6egTkyZk1NG2sdJcY8riOFXfO9giH7qtRYuBmS1Yq2Oo9o9lMBTBXNDevptuQmPbEIIlBxfmBjM-RB0PmSQxdh-skstsr_c6wxF4d_r3kDVrk_mJrcVigP_-Ypn0xvueKEjfpVNHbzqgY27ZXjgaE6-KblZ0JlAHA5yNY_h7HHvzLbecgMcbxMsoGlVUUpf_5mLfEq7k64Hw-Q1sMiYS4iEQrmSHDgWfgy5d3C0EH3kHZXvXxp4RCioGqbp-qjqMd60JOvDCY-69AHX0JErL74wHZNwbDpNBD5tNpnHgq7T1FFu7JlkVUkqDHYkhtH3LRGIHGI67ueqJRyVezus4GDYONJ7dTGk7kECertK-hUNXQrX6A4g6zAEUEKAhID48Cmrtt5eq7E-O9Yivp2VPNxpnBhEqFtYBf_zTARQVohuqE3YyB1yZ7hZwrB3t2oO2--Cyu0mxGhbB_o=","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0f1c93e16473ce59006a4e11fe358c8197a75b798e4e10dcf4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThIAPyFboYayWipZ2RxrSOrCzvxByuGfTCMH7PhvQs46vO1cp4lXvvQrk0jLYq_HWOMbTaFZNs56Y5VrQsLCpZFw1LKjPCkChrdfuYfRJoCBrL9rY2jeo60p-l_fwb7DXEE7N8_nvKb368_ABIXe-Zfo-heNxl8Zf7yr5jwkc8vq9BHf_lMDhIJEZaeSv07PVwMEkrB3Wew4YYJHRgKCgD-xXMOo8xZTnSeOKaJXgxGgVMJt6nbd9dskELPRZSlAE_ASH2_crIKenzCp7jL-u4N19nja2KHeVJXNCNVIgq1oI52NYVikDSnQqyDjeLe-CRztn4wxEZpLfsMgKjUn9m8KlEv87gsaVD0BqWhyJmiktKvleY654BaUM2ymtHLdK5wNpxv_57s4vPsqew0gMW2NX83OONTANxn44zJydQ5bbL4dc5lIQ4a_iiT_lG8JhQH98rp8G_ZpU4CC5-xKYTaKAh7aieUgBNZXooqR_qx91UGOSzppFchdjKVHAMdh1iSFGE3pZQ2BIKlK6QM4Au3YOWPX-hYygagII4L5XZhD1WivtDJLYmWNKpPM24bg0HWZHINesF5Jw90BiS3NUQha9wYmpwfVPok3_bNCyPGVVUqWvEq3rZiqHjDiLFGcpHB-ZZ0_5OYz7OA90NmXom0Jp2XG_qbpeYN19oqneCkExq5LQAYWJ3KIvZ4Rzuy3GhkWqIxW_uAat0zLMk3ALuFRZk5gxvRERYpcveimD73JwFRC16Jha3_wrxsHlGsBcBa_UynLDuS8ypG0TYNojqmuJC3kZq1vvChjST-bhgVZPkXJEpD5CxXi2fyx-kAdSQdR0NiUbtP4fQ2GPiTWZ3wJzbsa8f40urhAUbwS7JFsILzelhgEYWHQ64t80kD6JHj1l9gp1385HmbS0zKCNXZ_r_KUlds3rgkT5gAMuuLgds14poLMy3waXtUAJRtcwYiFFYV0j13s281hwFYCXW6pjaCktjr0FItYeDfr0ES7bhupdMdchUgxvcmXHqjhq6m1yn_yVgQlPqkiOa070mA3XeG11GIYQKo1qCgMH9zbnl9qS5372wTzHWjWQv8dGhD8pdQRlz194WrbVh0b2aSDEJ78cdRUtndWTXwpUJ7mqB0OOHJhlL8VOD0Cy83smHlrIqDTQW0CYx_Jq-3IblxBq7tDnaiBQXUlrZ2OQy4Rl7ct-CBoPTi8PtFVx39H10iOvHNuF7_0fPZ9yRaZs6nqncP6YtKquf-LPw7lPd9BWmPWOKcr1Soyns_h-5z7SvRBRQ_jSlp2zJQpTAhYfkrd0MpqAuz0GwS-U37VM0UAhUljJvietYIa_-MHbve62ZTckqkxQT-uBgMkowOpI03Ed4L0eMSQ_yh-qMgB7IjuFlGbMSlrx562CHGD0s7Nwo9TzmjjVNJ0FOQPhRPVRP25MBvx-EklHaXtToFTQUMAbGyWaf1dUOa2hY_cHDsvXa40iidH_xM_99bJdxZ06dZX72OYLig7dUIH06J4YQ4qnr1oNE9_Qb2u52ctBVwixDq6A-Pii2NKw2tyO-aGQcP3wlDQ4PCfjE5__nnxhEic5e1CD6joDjRO1_z7t_KL8nnaQFmkEB5pCZe5_UhLSRdnklJQFUix-QkLdzIZbsVyqKPwtxEy-dBTKmEEghXl-W6VMv4iUfdaf_ntnv0ZqXX-80FAc6TchQ0Wa1jNqMJTLLJXPs_deKNwu9K1mqRj8DX3XVr4lEtA-AAUx3P9wURhCFMb39HdI7JK15ZvJI4wiWDenJZuDbdUeyLQU3wxFWDJ20WrkENh_2fzCHcAbYGoAhSf2pIgqGOrpubPwSvplv_j8iQBts08ajx3xtIzi6WgfDrFttM70Cu2s0CXZoUCF0vmMhqCh8NlgwTsfC1BSdDxjr4I2eftJaMm10qP0xQnq81Gd8IihLuDmWS0dtG46JtQuywb3nY6uWUkA1qRWvzbWUoELp7cNkwTg5orHMb-_t3nXJnjd2WftFzPyC3fLOetl89p_Ca1kevH9rjEJ2RGJWmThH_6PjM01rxFrujaqQAnE8TH8Ho8Ijy8VMSjHcua1M-FGB4cSwQX5DzsYXIHiRFd06zNMQqKXCVEJjHtS2x_HHfKWRSqfmhOPg0-DqwE-GZWn8CGOuSc5Wq2JKWzMZPKGdz442kVJVHtHYxDBRjBSUJiH2-qmsyGNWavqSMEhr3XzS3K47odin9aqBKdoSNo-bI1iuDM_77gxavJGdM4L0lm1VeQzUxoRXUbFL_xm-KXV_caq54oVb-i_DU=","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"H4XivGSoCu7r4","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" joke","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"nR8Tc1z6ltm","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" was","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"cYiXBf6TbJ2x","output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":":","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"KEOSzVXjRDy0Z42","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" \"","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"Lg54yX0XrpU6J5","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Why","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"6ywgKaJoHCt4p","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" did","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"0RbeWdNOvUbw","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"HfcUZsXBgSqk","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" scare","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"Su7ILS1s5e","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"crow","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"WaFAd5wRuIKd","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" win","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"hlgpoMy7LJFu","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" an","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"nxFet9TkPlSKc","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" award","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"i9UytfGpe5","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"?","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"jiVQ9pbTMKUmukE","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Because","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"UEBJOgFv","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" he","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"FeIbl53WouPyn","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" was","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"UIVolIYxTYxO","output_index":1,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" outstanding","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"xPwG","output_index":1,"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"OSr7oNfLFEC5E","output_index":1,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" his","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"W8Ves6Uohlra","output_index":1,"sequence_number":25} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" field","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"7ruIhUjk0m","output_index":1,"sequence_number":26} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"!\"","item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"obfuscation":"HrMuMtPRD9EDlv","output_index":1,"sequence_number":27} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","logprobs":[],"output_index":1,"sequence_number":28,"text":"The - joke was: \"Why did the scarecrow win an award? Because he was outstanding in - his field!\""} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The - joke was: \"Why did the scarecrow win an award? Because he was outstanding in - his field!\""},"sequence_number":29} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - joke was: \"Why did the scarecrow win an award? Because he was outstanding in - his field!\""}],"role":"assistant"},"output_index":1,"sequence_number":30} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0f1c93e16473ce59006a4e11fd95748197b5837bbed94e317b","object":"response","created_at":1783501309,"status":"completed","background":false,"completed_at":1783501312,"conversation":{"id":"conv_6a4e11fd1ef08197868f262d1ea16f260f1c93e16473ce59"},"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[{"id":"rs_0f1c93e16473ce59006a4e11fe358c8197a75b798e4e10dcf4","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThIABNTd_0VOwA7U8I4fBMs8hYQXkuvmlvV-gYKK4jccjnLQ4U3iAxL6Kmop9bipsjGVHoCBmWFhsGur4liks4LsIdEP-RsrEShs07LaRwS6wuONZVFWdLKSqGCYId52iO5ldXkA7P9oVyUrE7V9X2p_IEQuc9hhNNOd0PXnTe3U_G67vzWo9ADdfwn7zGIxpVa7LQ-GUcU63dBwtfZg64K5d4YDTZsYhOsQb_DKtj4k2REbimOPhMmGQRtu2qNxpZTEJNbUtkfN2TvVcyVttADdeEhCJGVf8O1M4lzm9gBujiLu_90CZqqLvpAtkvW7K-s_b-GtgWRR4MGkToizGuOkqaVYagnMqH6NpejNpCmMBr-aIXJ9nNizP1UClTcbrIUpg0lJ0TfXsjRuLmbclHhprnqBqaR0UFOj6mtWWUWr23Uxc6GMdgBm7Jtqz5i3XatM3Yw1RfLej9h59hOE3P2h_NzDjwTzewV_tvGdIkO2PA6rVZod48vFDisH11O65VF42mR0T9T6ZZigmJGx4ReBHYGWGRXBTH4oDLrZDDSDwjEvOaKnr4XlqTzIv7IgQTisGa0uzEloOmhuXJwvdN-o0lNtjZv18M0BkRznWHaAVZVWyqZAjlXl2pMReXoE_x0_ySNy21rugrWslaToaVUudEltG_r6GVlbx7i-DHUBjWzITDquW3WlWVKSrdAdsXPQTvVKQlxVL054orwwF7rVCLUvViu3KtjWqw2M2hFpkAkTOHJmVnVEimjxMJsf0giXbkRKAQfEEuK1lBkJq738ryYiLrpWgO5aERzjgb7O-aE1WZUd58aRkuY_a_XR_QETt3HzqKvn2hDpFTUYo4e6h1oN0m-dYGQL2HTVZEdyCWn-TL3Kq_saB8S-hNZj6YSBVsU66PalqYe8IpvosmH_IdvoE8Z2Nhwhzkljnl1Tfe7NNwnk9Blv-OHBbQiy-DC_RSJxLNu3JjQhQ4wBFrcl7hjsKpyEtUrBrWWhy6LO3oiEwKGbJdVD9SbgjvshEf0OMx_1dzRcgo-IEd0zNzMAGhF12F6WbjbacvRqtXYzm3gQsq6gV4S5sz58dAyBlzlZ5_CmkV43D90D5iuj1xEMnMNF0JrGt7rBv8ynEIf5_EWEVXig0gOPrqsQ9UPHBWt4a9AR79vVMUdnqz7c1eDCuJtzpAPKMSN9NTpoRSr3PiRwXVBz0MgHjhkSPyIMeq3l6vIwcg2xOstIuimBvZqZ6WH4sjwb_mhEIHvyvmoWPevmtUJpVM_ZGZBEwY0MNWJmaKOMZFnPIqyETTy2pknhnfbpnfayLD7Wh_L4PkL6f_GH2tatIDMaaItv1hOWaH4jLZDHXvMphOnYuQqY4iBwoAN8uB2-R_6IAMLX--cerIekUGfUi12bqwyPca8HEX541zjC9_KLwRtjprka6nu0cleyGuvtGQHVTPOxEysn4l4vaOMQxdsIVc6QWmjYEyRaVnqXtb_0kfV5d_d5i1e9mKtwcLKbEP7JSodKMGTpTgwVHQQwcbXbTuzxO24yuCPHWZI0vlGxijs7SLGFVixc2Wry3Nh3xaFjo8IaSAmhvf2rqIx7YSxgqX13eb_zAVrItLGJOXsltBAP3gB0LvJa1qd71cYilIGAFruqW2DDuREL6EaEvGvT0Hm_qjTslbncU397SeXtYUcW9D8SJ1UKN0vop3gEeZ27UYX7RJXOJ0LpoaiDmb7Jny8j_RH1_avQQv0r_bHmNLGTRrfbOlgD0Hd23f90_7grJ69httLKsjOonKSzJv9k9iqU4V6YbMfYKCoKKUKL-6JWEaylolPov-XcrBrozxP8h3VMyw0CFz4_iZGB2sTzME-24D4lsIHi021S4uQzTr1Wx2J9Mc0wc4Or2zwH4jP-Of0jfeU0jaO24W4v-dqHHlQ6e2dU9mUlQGfiyUYgk8dqqe08fJBgVGMWdFvoU3hByBH-6plhhiml8lMXLW5-otOXudJWm7jA73LnumQOZ-IwH2Y7ttxZrxDaxzyEeKSk97Nh7_KNsWsEYQlUlqndznyTEIxn_keaBjPhh4Wh8xWGewUxfTw73HiIBurIh_tWukOJ5tWeu115zoNpL5UPEmBpHsRr0kvgABMNZEs0orF6FXrmHMJXqtfGjoiHQi4BOISy6LBermsFqTDcFog9rWspaqA-p_ipWsnNzLBHfUuPnOp2FkVa_Tm69IfIpEudYuSjDdxruo4flCgSPU_6REXGMp2BeM55tTs5g-aMydyVyotJqFw2vyh7YWnOx4rxKBIf23kTRKM=","summary":[]},{"id":"msg_0f1c93e16473ce59006a4e1200187081979ca51906c2133e4a","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - joke was: \"Why did the scarecrow win an award? Because he was outstanding in - his field!\""}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":49,"input_tokens_details":{"cached_tokens":0},"output_tokens":244,"output_tokens_details":{"reasoning_tokens":192},"total_tokens":293},"user":null,"metadata":{}},"sequence_number":31} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_exceptions/test_context_window_exceeded-context_length_exceeded.yaml b/tests/cassettes/openai/responses/test_exceptions/test_context_window_exceeded-context_length_exceeded.yaml deleted file mode 100644 index 16b9b4a..0000000 --- a/tests/cassettes/openai/responses/test_exceptions/test_context_window_exceeded-context_length_exceeded.yaml +++ /dev/null @@ -1,7961 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '600064' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: 'Repeat this exactly: x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x - x x x' - include: - - reasoning.encrypted_content - model: o3-mini - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_02e3ee31f7333650006a5339760c9881989106de2485371341","object":"response","created_at":1783839094,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o3-mini-2025-01-31","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_02e3ee31f7333650006a5339760c9881989106de2485371341","object":"response","created_at":1783839094,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o3-mini-2025-01-31","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: error - - ' - - 'data: {"type":"error","error":{"type":"invalid_request_error","code":"context_length_exceeded","message":"Your - input exceeds the context window of this model. Please adjust your input and try - again.","param":"input"},"sequence_number":2} - - ' - - ' - - ' - - 'event: response.failed - - ' - - 'data: {"type":"response.failed","response":{"id":"resp_02e3ee31f7333650006a5339760c9881989106de2485371341","object":"response","created_at":1783839094,"status":"failed","background":false,"completed_at":null,"error":{"code":"context_length_exceeded","message":"Your - input exceeds the context window of this model. Please adjust your input and try - again."},"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"o3-mini-2025-01-31","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":3} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_exceptions/test_invalid_api_key-incorrect_api_key.yaml b/tests/cassettes/openai/responses/test_exceptions/test_invalid_api_key-incorrect_api_key.yaml deleted file mode 100644 index 0b13124..0000000 --- a/tests/cassettes/openai/responses/test_exceptions/test_invalid_api_key-incorrect_api_key.yaml +++ /dev/null @@ -1,28 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '51' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: hi - model: gpt-4.1-nano - stream: true -response: - status_code: 401 - headers: - connection: keep-alive - content-length: '261' - content-type: text/plain - body: "{\n \"error\": {\n \"message\": \"Incorrect API key provided: sk-inval***2345.\ - \ You can find your API key at https://platform.openai.com/account/api-keys.\"\ - ,\n \"type\": \"invalid_request_error\",\n \"code\": \"invalid_api_key\"\ - ,\n \"param\": null\n },\n \"status\": 401\n}" diff --git a/tests/cassettes/openai/responses/test_exceptions/test_missing_api_key-missing_api_key.yaml b/tests/cassettes/openai/responses/test_exceptions/test_missing_api_key-missing_api_key.yaml deleted file mode 100644 index 14f1e6b..0000000 --- a/tests/cassettes/openai/responses/test_exceptions/test_missing_api_key-missing_api_key.yaml +++ /dev/null @@ -1,29 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '51' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: hi - model: gpt-4.1-nano - stream: true -response: - status_code: 401 - headers: - connection: keep-alive - content-length: '160' - content-type: application/json - body: - error: - message: Missing bearer or basic authentication in header - type: invalid_request_error - param: null - code: null diff --git a/tests/cassettes/openai/responses/test_exceptions/test_thinking_budget_exceeding_max_tokens-thinking_budget_exceeding_max_tokens.yaml b/tests/cassettes/openai/responses/test_exceptions/test_thinking_budget_exceeding_max_tokens-thinking_budget_exceeding_max_tokens.yaml deleted file mode 100644 index 9662a23..0000000 --- a/tests/cassettes/openai/responses/test_exceptions/test_thinking_budget_exceeding_max_tokens-thinking_budget_exceeding_max_tokens.yaml +++ /dev/null @@ -1,36 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '128' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: Think very carefully about this. - include: - - reasoning.encrypted_content - max_output_tokens: 1 - model: o4-mini - reasoning: - effort: high - stream: true -response: - status_code: 400 - headers: - connection: keep-alive - content-length: '248' - content-type: application/json - body: - error: - message: 'Invalid ''max_output_tokens'': integer below minimum value. Expected - a value >= 16, but got 1 instead.' - type: invalid_request_error - param: max_output_tokens - code: integer_below_min_value diff --git a/tests/cassettes/openai/responses/test_interface/instructions-stream-00.yaml b/tests/cassettes/openai/responses/test_interface/instructions-stream-00.yaml deleted file mode 100644 index a14442d..0000000 --- a/tests/cassettes/openai/responses/test_interface/instructions-stream-00.yaml +++ /dev/null @@ -1,222 +0,0 @@ -filename: 2026-08-03-019fc6df-8c6e-7d23-915e-3bfa53d24b95 -request: - body: - input: Write one short sentence about the ocean. - instructions: You are a helpful assistant. - model: gpt-5.4-nano - stream: true - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '136' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.52.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019fc6df-8c6e-7d23-915e-3bfa53d24b95 -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0a0eadf3762c7884006a7059ffff5081978f679c24bf9f2b7c","object":"response","created_at":1785747968,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0a0eadf3762c7884006a7059ffff5081978f679c24bf9f2b7c","object":"response","created_at":1785747968,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"C8kKW7299dLDj","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ocean","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"Cn264OR5uo","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" stretches","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"biweEy","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" endlessly","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"hyjwEZ","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"FjZKdmgJsgnxZoL","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" where","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"38kmLtxCx4","output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" waves","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"lyBlrezogx","output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" roll","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"e1ilfAnP5Ew","output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"mP6uQsZKVBNt","output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" marine","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"NLDBipBiZ","output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" life","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"G4AUyKCvP23","output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" thrives","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"P1PxlX8B","output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"obfuscation":"ClwcIg4DHtQwBPi","output_index":0,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","logprobs":[],"output_index":0,"sequence_number":17,"text":"The - ocean stretches endlessly, where waves roll and marine life thrives."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean stretches endlessly, where waves roll and marine life thrives."},"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean stretches endlessly, where waves roll and marine life thrives."}],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0a0eadf3762c7884006a7059ffff5081978f679c24bf9f2b7c","object":"response","created_at":1785747968,"status":"completed","background":false,"completed_at":1785747968,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[{"id":"msg_0a0eadf3762c7884006a705a007d188197899497e255245a21","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean stretches endlessly, where waves roll and marine life thrives."}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":24,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":17,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":41},"user":null,"metadata":{}},"sequence_number":20} - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-08-03T09:06:07.086276+00:00' diff --git a/tests/cassettes/openai/responses/test_interface/instructions-stream-01.yaml b/tests/cassettes/openai/responses/test_interface/instructions-stream-01.yaml deleted file mode 100644 index 64602b9..0000000 --- a/tests/cassettes/openai/responses/test_interface/instructions-stream-01.yaml +++ /dev/null @@ -1,255 +0,0 @@ -filename: 2026-08-03-019fc80e-dd15-7c82-aa2b-ba0386e2820b -request: - body: - input: - - content: Write one short sentence about the ocean. - role: user - - content: The ocean stretches endlessly, where waves roll and marine life thrives. - role: assistant - - content: Write another about the sky. - role: user - instructions: You are a helpful assistant. - model: gpt-5.4-nano - stream: true - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '327' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.52.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019fc80e-dd15-7c82-aa2b-ba0386e2820b -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0ff15a4202ef682a006a70a7a5488c81988356fd3fa4ce74de","object":"response","created_at":1785767845,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0ff15a4202ef682a006a70a7a5488c81988356fd3fa4ce74de","object":"response","created_at":1785767845,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","type":"message","status":"in_progress","content":[],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"iCBCygjNRJoyT","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" sky","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"UzEoHsFooDyr","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" stretches","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"hJ1Rqn","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" overhead","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"KmVtKzt","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"sxIWIsVJXJj1Kar","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" painted","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"ho06AxUX","output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"S3KLOt6Goi1","output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" clouds","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"182CYdsBm","output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" that","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"REfbWmPHZK9","output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" drift","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"0rBdq6j4Wr","output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"vyFG5BRu2rW9","output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" shift","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"ZBBUTveTe2","output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"TIPAdzBsfsx","output_index":0,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"Yq1AsPmY3tio","output_index":0,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" light","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"in9YCDEfvj","output_index":0,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"obfuscation":"75tJ8XHOBir2yZE","output_index":0,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","logprobs":[],"output_index":0,"sequence_number":20,"text":"The - sky stretches overhead, painted with clouds that drift and shift with the light."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The - sky stretches overhead, painted with clouds that drift and shift with the light."},"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - sky stretches overhead, painted with clouds that drift and shift with the light."}],"phase":"final_answer","role":"assistant"},"output_index":0,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0ff15a4202ef682a006a70a7a5488c81988356fd3fa4ce74de","object":"response","created_at":1785767845,"status":"completed","background":false,"completed_at":1785767846,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are a helpful assistant.","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.4-nano-2026-03-17","moderation":null,"output":[{"id":"msg_0ff15a4202ef682a006a70a7a5cf6c8198b991c209ae237d36","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - sky stretches overhead, painted with clouds that drift and shift with the light."}],"phase":"final_answer","role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.98,"truncation":"disabled","usage":{"input_tokens":53,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":20,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":73},"user":null,"metadata":{}},"sequence_number":23} - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-08-03T14:37:25.141114+00:00' diff --git a/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_request_error.yaml b/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_request_error.yaml deleted file mode 100644 index 775bf7e..0000000 --- a/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_request_error.yaml +++ /dev/null @@ -1,56 +0,0 @@ -filename: 2026-08-17-01a010a1-254a-7b82-959c-e473f2f5bcce -request: - body: - input: - - content: - - text: How much wood would a woodchuck chuck? - type: input_text - role: user - - content: - - annotations: [] - logprobs: [] - text: A woodchuck cannot chuck wood. - type: output_text - id: msg_02b0fed16e071f1d006a70b40b949081999170f32ef208730f - phase: final_answer - role: assistant - status: completed - type: message - - content: - - text: What's your reasoning? - type: input_text - role: user - max_output_tokens: 2048 - model: gpt-5.6-luna - reasoning: - effort: medium - summary: detailed - stream: true - stream_options: - include_obfuscation: false - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '603' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 01a010a1-254a-7b82-959c-e473f2f5bcce -response: - body: - error: - code: null - message: 'Item ''msg_02b0fed16e071f1d006a70b40b949081999170f32ef208730f'' of - type ''message'' was provided without its required ''reasoning'' item: ''rs_02b0fed16e071f1d006a70b409e68c81999122d39d8585ffa1''.' - param: input - type: invalid_request_error - headers: - connection: keep-alive - content-length: '303' - content-type: application/json - status_code: 400 -timestamp: '2026-08-17T16:49:51.434313+00:00' diff --git a/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_type.yaml b/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_type.yaml deleted file mode 100644 index 2ef0981..0000000 --- a/tests/cassettes/openai/responses/test_interface/reasoning-stream-invalid_type.yaml +++ /dev/null @@ -1,51 +0,0 @@ -filename: 2026-08-03-019fc845-d5f9-76d1-9ce5-17ba495f143a -request: - body: - input: - - content: How much wood would a woodchuck chuck? - role: user - - encrypted_content: gAAAAABqcLQJTmRuYd14oE7uc99dRk8XQEdJb5VZRDS5o40tcUs7xG2rLDyWJk6430tEO299IemdfRngidKjN4vM42PtfnpVAXlM6e8cfR3MTGr-F7UY1BT8bjucPDKR3VsamiPVoXTfma1s5fDnLRoVvjEvUh22dw2FWEfkDOowKNU-l2BRkZ534tUSKs4qJQ6Da7c561VvaUKjbKCV3_yJSQMwR0-zj3VC5WvjKKIX12rYnT0ktj6l9s_G4Ip0c29VwAvAxTlTTvKVLOLQDdPlMkQDx3VkxDXOruVmReQeKjRtNVaeTZvftUoWYqZMy8OYFfRC2iu7bn8CNIeapLdiD9l-3Mnx6j27VDxDeYnGlDOMPPywm2BfkmJs354VBGt6tta3x8xDaNTKwIGc-d9KmHc6BiSLamIy27GvW8ECY6Ixo2xluD1HdvK75VCG-JrnG15nzlxH4AycQvNFee1GzyZiqbhvHwyRc221Rcb3lkSwwocC8dfve-oFohix0iV0C4hEXPHPXpTilrwbFRAn76IbRTxnGAsMl2sWiJufv2Y5yDayJAQaUVzA5Mf5mH15THPRh21sTNZEqaFnHwZx0iCtALCYFS16zJmqmUqJ5NaslgGsra9EbiZtMv8H_CCXchQEKu67JA_QKADnppIued2Ny1XNwgOuCldJTgV_If4OkJ-G4WEcjfzS0H-2TBbRsEXZanrn-wSj5J3nPYw5TSu0bpQJ87sd-WFTRwZtR9bOkzlcim0CyNOARPZdywPhfyqRtYHSqvP-Qktj5FaxyiLRq0LELNxY4OUan8DmqBbXmrZDz_tN3m_uI2g_TWOoExnFDY772PPgsIxUx3RSKkhA9VrDrr7lHdH8xRu0jY6OmxTlbw4Wj_p54bj0qCYubDShuRw3vatLAk_lllj8iMi66vPRlA== - id: rs_02b0fed16e071f1d006a70b409e68c81999122d39d8585ffa1 - summary: '**Considering tongue twisters** - - - I need to come up with a classic tongue twister, maybe something like "How - much wood would a woodchuck chuck if a woodchuck could chuck wood?" That’s - a fun one! The user asked how much, so it should be concise. I could clarify - that there isn''''t a definitive answer, just a play on words. Let’s ensure - I convey that in a clear way!' - type: reasoning - - content: "A woodchuck would chuck as much wood as a woodchuck could chuck—if\ - \ a woodchuck could chuck wood. \n\nOne estimate, based on the tongue twister,\ - \ is about **700 pounds (318 kg)** of wood." - role: assistant - - content: What's your reasoning? - role: user - model: gpt-5.6-luna - stream: true - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '1808' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.52.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019fc845-d5f9-76d1-9ce5-17ba495f143a -response: - body: - error: - code: invalid_type - message: 'Invalid type for ''input[1].summary'': expected an array of objects, - but got a string instead.' - param: input[1].summary - type: invalid_request_error - headers: - connection: keep-alive - content-length: '228' - content-type: application/json - status_code: 400 -timestamp: '2026-08-03T15:37:27.801538+00:00' diff --git a/tests/cassettes/openai/responses/test_interface/reasoning-stream-missing_required_parameter.yaml b/tests/cassettes/openai/responses/test_interface/reasoning-stream-missing_required_parameter.yaml deleted file mode 100644 index 7e8cd3e..0000000 --- a/tests/cassettes/openai/responses/test_interface/reasoning-stream-missing_required_parameter.yaml +++ /dev/null @@ -1,42 +0,0 @@ -filename: 2026-08-03-019fc844-7461-7d13-87a1-344233edc8ad -request: - body: - input: - - content: How much wood would a woodchuck chuck? - role: user - - encrypted_content: gAAAAABqcLQJTmRuYd14oE7uc99dRk8XQEdJb5VZRDS5o40tcUs7xG2rLDyWJk6430tEO299IemdfRngidKjN4vM42PtfnpVAXlM6e8cfR3MTGr-F7UY1BT8bjucPDKR3VsamiPVoXTfma1s5fDnLRoVvjEvUh22dw2FWEfkDOowKNU-l2BRkZ534tUSKs4qJQ6Da7c561VvaUKjbKCV3_yJSQMwR0-zj3VC5WvjKKIX12rYnT0ktj6l9s_G4Ip0c29VwAvAxTlTTvKVLOLQDdPlMkQDx3VkxDXOruVmReQeKjRtNVaeTZvftUoWYqZMy8OYFfRC2iu7bn8CNIeapLdiD9l-3Mnx6j27VDxDeYnGlDOMPPywm2BfkmJs354VBGt6tta3x8xDaNTKwIGc-d9KmHc6BiSLamIy27GvW8ECY6Ixo2xluD1HdvK75VCG-JrnG15nzlxH4AycQvNFee1GzyZiqbhvHwyRc221Rcb3lkSwwocC8dfve-oFohix0iV0C4hEXPHPXpTilrwbFRAn76IbRTxnGAsMl2sWiJufv2Y5yDayJAQaUVzA5Mf5mH15THPRh21sTNZEqaFnHwZx0iCtALCYFS16zJmqmUqJ5NaslgGsra9EbiZtMv8H_CCXchQEKu67JA_QKADnppIued2Ny1XNwgOuCldJTgV_If4OkJ-G4WEcjfzS0H-2TBbRsEXZanrn-wSj5J3nPYw5TSu0bpQJ87sd-WFTRwZtR9bOkzlcim0CyNOARPZdywPhfyqRtYHSqvP-Qktj5FaxyiLRq0LELNxY4OUan8DmqBbXmrZDz_tN3m_uI2g_TWOoExnFDY772PPgsIxUx3RSKkhA9VrDrr7lHdH8xRu0jY6OmxTlbw4Wj_p54bj0qCYubDShuRw3vatLAk_lllj8iMi66vPRlA== - id: rs_02b0fed16e071f1d006a70b409e68c81999122d39d8585ffa1 - type: reasoning - - content: "A woodchuck would chuck as much wood as a woodchuck could chuck—if\ - \ a woodchuck could chuck wood. \n\nOne estimate, based on the tongue twister,\ - \ is about **700 pounds (318 kg)** of wood." - role: assistant - - content: What's your reasoning? - role: user - model: gpt-5.6-luna - stream: true - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '1424' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.52.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 019fc844-7461-7d13-87a1-344233edc8ad -response: - body: - error: - code: missing_required_parameter - message: 'Missing required parameter: ''input[1].summary''.' - param: input[1].summary - type: invalid_request_error - headers: - connection: keep-alive - content-length: '197' - content-type: application/json - status_code: 400 -timestamp: '2026-08-03T15:35:57.281878+00:00' diff --git a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream-sse.yaml b/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream-sse.yaml deleted file mode 100644 index 2f8dca8..0000000 --- a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream-sse.yaml +++ /dev/null @@ -1,1361 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '696' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - - code_interpreter_call.outputs - - web_search_call.action.sources - - message.output_text.logprobs - input: - - role: user - content: Who are you? - instructions: The user would like to know about the weather in Taiwan today. - max_output_tokens: 400 - max_tool_calls: 1 - model: gpt-5.1 - parallel_tool_calls: true - prompt_cache_key: my_cache_key - prompt_cache_retention: 24h - safety_identifier: safety - service_tier: flex - store: false - stream: true - temperature: 0.45 - tool_choice: required - tools: - - type: web_search - search_context_size: medium - - type: code_interpreter - container: - type: auto - top_logprobs: 1 - top_p: 0.55 - truncation: disabled -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_08c65107c4719410016a4e1224304881999faa293e70a1afad","object":"response","created_at":1783501348,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_08c65107c4719410016a4e1224304881999faa293e70a1afad","object":"response","created_at":1783501348,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","type":"web_search_call","status":"in_progress"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.web_search_call.in_progress - - ' - - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.web_search_call.searching - - ' - - 'data: {"type":"response.web_search_call.searching","item_id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.web_search_call.completed - - ' - - 'data: {"type":"response.web_search_call.completed","item_id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","type":"web_search_call","status":"completed","action":{"type":"search","queries":["weather: - Taiwan"],"query":"weather: Taiwan","sources":[{"type":"api","name":"oai-weather"}]}},"output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I’m","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[73],"logprob":-0.0000447757811343763,"token":"I","top_logprobs":[{"bytes":[73],"logprob":-0.0000447757811343763,"token":"I"}]},{"bytes":[226,128,153,109],"logprob":0.0,"token":"’m","top_logprobs":[{"bytes":[226,128,153,109],"logprob":0.0,"token":"’m"}]}],"obfuscation":"ISns6mve6SxtW","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" an AI","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,110],"logprob":-0.0007325552869588137,"token":" - an","top_logprobs":[{"bytes":[32,97,110],"logprob":-0.0007325552869588137,"token":" - an"}]},{"bytes":[32,65,73],"logprob":-3.4121114822482923e-6,"token":" AI","top_logprobs":[{"bytes":[32,65,73],"logprob":-3.4121114822482923e-6,"token":" - AI"}]}],"obfuscation":"ByJ39EWrRJ","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" assistant - created","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,115,115,105,115,116,97,110,116],"logprob":-6.869017852295656e-6,"token":" - assistant","top_logprobs":[{"bytes":[32,97,115,115,105,115,116,97,110,116],"logprob":-6.869017852295656e-6,"token":" - assistant"}]},{"bytes":[32,99,114,101,97,116,101,100],"logprob":-0.0008516783127561212,"token":" - created","top_logprobs":[{"bytes":[32,99,114,101,97,116,101,100],"logprob":-0.0008516783127561212,"token":" - created"}]}],"obfuscation":"uZpfhrfcU3S1vL","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" by Open","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,98,121],"logprob":-0.0002003218833124265,"token":" - by","top_logprobs":[{"bytes":[32,98,121],"logprob":-0.0002003218833124265,"token":" - by"}]},{"bytes":[32,79,112,101,110],"logprob":0.0,"token":" Open","top_logprobs":[{"bytes":[32,79,112,101,110],"logprob":0.0,"token":" - Open"}]}],"obfuscation":"sVVpV9ko","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"AI.","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[65,73],"logprob":0.0,"token":"AI","top_logprobs":[{"bytes":[65,73],"logprob":0.0,"token":"AI"}]},{"bytes":[46],"logprob":-0.4809337854385376,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.4809337854385376,"token":"."}]}],"obfuscation":"tyM0y3hdwM7Qd","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" I can","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,73],"logprob":-0.0001427538663847372,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":-0.0001427538663847372,"token":" - I"}]},{"bytes":[32,99,97,110],"logprob":-0.004973308648914099,"token":" can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-0.004973308648914099,"token":" - can"}]}],"obfuscation":"SO73b76KS3","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" help","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,104,101,108,112],"logprob":-0.11625117063522339,"token":" - help","top_logprobs":[{"bytes":[32,104,101,108,112],"logprob":-0.11625117063522339,"token":" - help"}]}],"obfuscation":"n2Vs3MtP2or","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" answer","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,110,115,119,101,114],"logprob":-0.5363264679908752,"token":" - answer","top_logprobs":[{"bytes":[32,97,110,115,119,101,114],"logprob":-0.5363264679908752,"token":" - answer"}]}],"obfuscation":"duOrU83lJ","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" questions,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,113,117,101,115,116,105,111,110,115],"logprob":-3.128163257315464e-7,"token":" - questions","top_logprobs":[{"bytes":[32,113,117,101,115,116,105,111,110,115],"logprob":-3.128163257315464e-7,"token":" - questions"}]},{"bytes":[44],"logprob":-3.531315314830863e-6,"token":",","top_logprobs":[{"bytes":[44],"logprob":-3.531315314830863e-6,"token":","}]}],"obfuscation":"JUy6v","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" explain","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,101,120,112,108,97,105,110],"logprob":-0.0008666796493344009,"token":" - explain","top_logprobs":[{"bytes":[32,101,120,112,108,97,105,110],"logprob":-0.0008666796493344009,"token":" - explain"}]}],"obfuscation":"zcheM2Cc","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" things,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,116,104,105,110,103,115],"logprob":-0.08836302161216736,"token":" - things","top_logprobs":[{"bytes":[32,116,104,105,110,103,115],"logprob":-0.08836302161216736,"token":" - things"}]},{"bytes":[44],"logprob":-0.000019385402993066236,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.000019385402993066236,"token":","}]}],"obfuscation":"qKat1pEv","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and assist","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,110,100],"logprob":-0.04536852613091469,"token":" - and","top_logprobs":[{"bytes":[32,97,110,100],"logprob":-0.04536852613091469,"token":" - and"}]},{"bytes":[32,97,115,115,105,115,116],"logprob":-0.03931417316198349,"token":" - assist","top_logprobs":[{"bytes":[32,97,115,115,105,115,116],"logprob":-0.03931417316198349,"token":" - assist"}]}],"obfuscation":"mzNX8","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,119,105,116,104],"logprob":-9.088346359931165e-7,"token":" - with","top_logprobs":[{"bytes":[32,119,105,116,104],"logprob":-9.088346359931165e-7,"token":" - with"}]}],"obfuscation":"jvFwCICP1Cw","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" tasks - like","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,116,97,115,107,115],"logprob":-0.048156216740608215,"token":" - tasks","top_logprobs":[{"bytes":[32,116,97,115,107,115],"logprob":-0.048156216740608215,"token":" - tasks"}]},{"bytes":[32,108,105,107,101],"logprob":-1.9361264946837764e-7,"token":" - like","top_logprobs":[{"bytes":[32,108,105,107,101],"logprob":-1.9361264946837764e-7,"token":" - like"}]}],"obfuscation":"MmrOc","output_index":1,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" writing,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,119,114,105,116,105,110,103],"logprob":-0.24532966315746307,"token":" - writing","top_logprobs":[{"bytes":[32,119,114,105,116,105,110,103],"logprob":-0.24532966315746307,"token":" - writing"}]},{"bytes":[44],"logprob":-4.246537173457909e-6,"token":",","top_logprobs":[{"bytes":[44],"logprob":-4.246537173457909e-6,"token":","}]}],"obfuscation":"HyUDupR","output_index":1,"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" planning,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,112,108,97,110,110,105,110,103],"logprob":-0.030381495133042336,"token":" - planning","top_logprobs":[{"bytes":[32,112,108,97,110,110,105,110,103],"logprob":-0.030381495133042336,"token":" - planning"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"rG0Ddc","output_index":1,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" coding,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,99,111,100,105,110,103],"logprob":-1.1508307456970215,"token":" - coding","top_logprobs":[{"bytes":[32,97,110,100],"logprob":-0.8070808053016663,"token":" - and"}]},{"bytes":[44],"logprob":-4.961759259458631e-6,"token":",","top_logprobs":[{"bytes":[44],"logprob":-4.961759259458631e-6,"token":","}]}],"obfuscation":"ZKqRS5ZY","output_index":1,"sequence_number":25} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and more","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,110,100],"logprob":-0.13294559717178345,"token":" - and","top_logprobs":[{"bytes":[32,97,110,100],"logprob":-0.13294559717178345,"token":" - and"}]},{"bytes":[32,109,111,114,101],"logprob":-0.008544125594198704,"token":" - more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.008544125594198704,"token":" - more"}]}],"obfuscation":"umKpOPj","output_index":1,"sequence_number":26} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".\n\n","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[46,10,10],"logprob":-0.04140472784638405,"token":".\n\n","top_logprobs":[{"bytes":[46,10,10],"logprob":-0.04140472784638405,"token":".\n\n"}]}],"obfuscation":"0nI857MwaprKz","output_index":1,"sequence_number":27} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"You also","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[89,111,117],"logprob":-0.601513147354126,"token":"You","top_logprobs":[{"bytes":[89,111,117],"logprob":-0.601513147354126,"token":"You"}]},{"bytes":[32,97,108,115,111],"logprob":-0.015882089734077454,"token":" - also","top_logprobs":[{"bytes":[32,97,108,115,111],"logprob":-0.015882089734077454,"token":" - also"}]}],"obfuscation":"ln3fy495","output_index":1,"sequence_number":28} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" have a","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,104,97,118,101],"logprob":-0.2873716354370117,"token":" - have","top_logprobs":[{"bytes":[32,104,97,118,101],"logprob":-0.2873716354370117,"token":" - have"}]},{"bytes":[32,97],"logprob":-0.04007240757346153,"token":" a","top_logprobs":[{"bytes":[32,97],"logprob":-0.04007240757346153,"token":" - a"}]}],"obfuscation":"4y2MtgxHG","output_index":1,"sequence_number":29} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" standing - request","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,115,116,97,110,100,105,110,103],"logprob":-0.11710669100284576,"token":" - standing","top_logprobs":[{"bytes":[32,115,116,97,110,100,105,110,103],"logprob":-0.11710669100284576,"token":" - standing"}]},{"bytes":[32,114,101,113,117,101,115,116],"logprob":-0.017636016011238098,"token":" - request","top_logprobs":[{"bytes":[32,114,101,113,117,101,115,116],"logprob":-0.017636016011238098,"token":" - request"}]}],"obfuscation":"ATXs5lGKSkzHUq7","output_index":1,"sequence_number":30} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" about - the","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.010091190226376057,"token":" - about","top_logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.010091190226376057,"token":" - about"}]},{"bytes":[32,116,104,101],"logprob":-0.08518896996974945,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.08518896996974945,"token":" - the"}]}],"obfuscation":"K3fci0","output_index":1,"sequence_number":31} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" weather - in","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,119,101,97,116,104,101,114],"logprob":0.0,"token":" - weather","top_logprobs":[{"bytes":[32,119,101,97,116,104,101,114],"logprob":0.0,"token":" - weather"}]},{"bytes":[32,105,110],"logprob":-1.9361264946837764e-7,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-1.9361264946837764e-7,"token":" - in"}]}],"obfuscation":"gIPsY","output_index":1,"sequence_number":32} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taiwan - today","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan"}]},{"bytes":[32,116,111,100,97,121],"logprob":-7.822646693966817e-6,"token":" - today","top_logprobs":[{"bytes":[32,116,111,100,97,121],"logprob":-7.822646693966817e-6,"token":" - today"}]}],"obfuscation":"CSf","output_index":1,"sequence_number":33} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" (July","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,40],"logprob":-0.40114742517471313,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-0.40114742517471313,"token":" ("}]},{"bytes":[74,117,108,121],"logprob":-4.320199877838604e-7,"token":"July","top_logprobs":[{"bytes":[74,117,108,121],"logprob":-4.320199877838604e-7,"token":"July"}]}],"obfuscation":"0m05KeQfln","output_index":1,"sequence_number":34} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" 8,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32],"logprob":0.0,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":0.0,"token":" "}]},{"bytes":[56],"logprob":0.0,"token":"8","top_logprobs":[{"bytes":[56],"logprob":0.0,"token":"8"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"eOQTYlMngdRJQ","output_index":1,"sequence_number":35} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32],"logprob":0.0,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":0.0,"token":" "}]}],"obfuscation":"ABPdV6fwix0AfmV","output_index":1,"sequence_number":36} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"2026","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[50,48,50],"logprob":0.0,"token":"202","top_logprobs":[{"bytes":[50,48,50],"logprob":0.0,"token":"202"}]},{"bytes":[54],"logprob":0.0,"token":"6","top_logprobs":[{"bytes":[54],"logprob":0.0,"token":"6"}]}],"obfuscation":"tvPnbyHDbuYK","output_index":1,"sequence_number":37} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"), so","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[41,44],"logprob":-0.5976948142051697,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-0.5976948142051697,"token":"),"}]},{"bytes":[32,115,111],"logprob":-8.895480277715251e-6,"token":" - so","top_logprobs":[{"bytes":[32,115,111],"logprob":-8.895480277715251e-6,"token":" - so"}]}],"obfuscation":"e7N5PgkrCIq","output_index":1,"sequence_number":38} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" here’s","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,104,101,114,101],"logprob":-0.004932377487421036,"token":" - here","top_logprobs":[{"bytes":[32,104,101,114,101],"logprob":-0.004932377487421036,"token":" - here"}]},{"bytes":[226,128,153,115],"logprob":-0.07772818952798843,"token":"’s","top_logprobs":[{"bytes":[226,128,153,115],"logprob":-0.07772818952798843,"token":"’s"}]}],"obfuscation":"wTvXnEUhF","output_index":1,"sequence_number":39} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a quick","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97],"logprob":-0.11452566832304001,"token":" - a","top_logprobs":[{"bytes":[32,97],"logprob":-0.11452566832304001,"token":" a"}]},{"bytes":[32,113,117,105,99,107],"logprob":-0.0998142659664154,"token":" - quick","top_logprobs":[{"bytes":[32,113,117,105,99,107],"logprob":-0.0998142659664154,"token":" - quick"}]}],"obfuscation":"YO6BtpaU","output_index":1,"sequence_number":40} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" summary","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,115,117,109,109,97,114,121],"logprob":-0.3369949460029602,"token":" - summary","top_logprobs":[{"bytes":[32,115,117,109,109,97,114,121],"logprob":-0.3369949460029602,"token":" - summary"}]}],"obfuscation":"tkWIU80g","output_index":1,"sequence_number":41} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" based - on","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,98,97,115,101,100],"logprob":-0.5916903614997864,"token":" - based","top_logprobs":[{"bytes":[32,98,97,115,101,100],"logprob":-0.5916903614997864,"token":" - based"}]},{"bytes":[32,111,110],"logprob":0.0,"token":" on","top_logprobs":[{"bytes":[32,111,110],"logprob":0.0,"token":" - on"}]}],"obfuscation":"It2pHIT","output_index":1,"sequence_number":42} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" current - data:\n\n","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,99,117,114,114,101,110,116],"logprob":-0.2529255449771881,"token":" - current","top_logprobs":[{"bytes":[32,99,117,114,114,101,110,116],"logprob":-0.2529255449771881,"token":" - current"}]},{"bytes":[32,100,97,116,97],"logprob":-0.00007469590491382405,"token":" - data","top_logprobs":[{"bytes":[32,100,97,116,97],"logprob":-0.00007469590491382405,"token":" - data"}]},{"bytes":[58,10,10],"logprob":-0.022735899314284325,"token":":\n\n","top_logprobs":[{"bytes":[58,10,10],"logprob":-0.022735899314284325,"token":":\n\n"}]}],"obfuscation":"","output_index":1,"sequence_number":43} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[45],"logprob":-3.128163257315464e-7,"token":"-","top_logprobs":[{"bytes":[45],"logprob":-3.128163257315464e-7,"token":"-"}]}],"obfuscation":"RNPxuItvz0lGLTa","output_index":1,"sequence_number":44} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Overall:","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,79,118,101,114,97,108,108],"logprob":-0.2528305649757385,"token":" - Overall","top_logprobs":[{"bytes":[32,79,118,101,114,97,108,108],"logprob":-0.2528305649757385,"token":" - Overall"}]},{"bytes":[58],"logprob":-0.00038920470979064703,"token":":","top_logprobs":[{"bytes":[58],"logprob":-0.00038920470979064703,"token":":"}]}],"obfuscation":"vuvxd6i","output_index":1,"sequence_number":45} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Warm and","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,87,97,114,109],"logprob":-0.007632889784872532,"token":" - Warm","top_logprobs":[{"bytes":[32,87,97,114,109],"logprob":-0.007632889784872532,"token":" - Warm"}]},{"bytes":[32,97,110,100],"logprob":-0.0027186875231564045,"token":" and","top_logprobs":[{"bytes":[32,97,110,100],"logprob":-0.0027186875231564045,"token":" - and"}]}],"obfuscation":"JuI5jx2","output_index":1,"sequence_number":46} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" humid,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,104,117,109,105,100],"logprob":-0.4525412917137146,"token":" - humid","top_logprobs":[{"bytes":[32,104,117,109,105,100],"logprob":-0.4525412917137146,"token":" - humid"}]},{"bytes":[44],"logprob":-0.000032020991056924686,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.000032020991056924686,"token":","}]}],"obfuscation":"91E5VLCMy","output_index":1,"sequence_number":47} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" mostly - cloudy","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,109,111,115,116,108,121],"logprob":-0.5282288789749146,"token":" - mostly","top_logprobs":[{"bytes":[32,109,111,115,116,108,121],"logprob":-0.5282288789749146,"token":" - mostly"}]},{"bytes":[32,99,108,111,117,100,121],"logprob":0.0,"token":" cloudy","top_logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":0.0,"token":" - cloudy"}]}],"obfuscation":"Dl","output_index":1,"sequence_number":48} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".\n-","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[46,10],"logprob":-0.05588620528578758,"token":".\n","top_logprobs":[{"bytes":[46,10],"logprob":-0.05588620528578758,"token":".\n"}]},{"bytes":[45],"logprob":0.0,"token":"-","top_logprobs":[{"bytes":[45],"logprob":0.0,"token":"-"}]}],"obfuscation":"7ozGVAOMEWoSQ","output_index":1,"sequence_number":49} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Current:","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,67,117,114,114,101,110,116],"logprob":-0.0017162315780296922,"token":" - Current","top_logprobs":[{"bytes":[32,67,117,114,114,101,110,116],"logprob":-0.0017162315780296922,"token":" - Current"}]},{"bytes":[58],"logprob":-0.1210760846734047,"token":":","top_logprobs":[{"bytes":[58],"logprob":-0.1210760846734047,"token":":"}]}],"obfuscation":"k3pCJOh","output_index":1,"sequence_number":50} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Around","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,65,114,111,117,110,100],"logprob":-0.04028334468603134,"token":" - Around","top_logprobs":[{"bytes":[32,65,114,111,117,110,100],"logprob":-0.04028334468603134,"token":" - Around"}]}],"obfuscation":"zUlGLx6Mo","output_index":1,"sequence_number":51} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" 87","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32],"logprob":-2.935296834039036e-6,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":-2.935296834039036e-6,"token":" "}]},{"bytes":[56,55],"logprob":-4.320199877838604e-7,"token":"87","top_logprobs":[{"bytes":[56,55],"logprob":-4.320199877838604e-7,"token":"87"}]}],"obfuscation":"oASYeX0gp5C60","output_index":1,"sequence_number":52} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°F (","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[194,176,70],"logprob":-1.9361264946837764e-7,"token":"°F","top_logprobs":[{"bytes":[194,176,70],"logprob":-1.9361264946837764e-7,"token":"°F"}]},{"bytes":[32,40],"logprob":-5.200166469876422e-6,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-5.200166469876422e-6,"token":" - ("}]}],"obfuscation":"j1UZcFCu1SDu","output_index":1,"sequence_number":53} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"30°C","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[51,48],"logprob":0.0,"token":"30","top_logprobs":[{"bytes":[51,48],"logprob":0.0,"token":"30"}]},{"bytes":[194,176,67],"logprob":0.0,"token":"°C","top_logprobs":[{"bytes":[194,176,67],"logprob":0.0,"token":"°C"}]}],"obfuscation":"Pw5TNLlOYkH3","output_index":1,"sequence_number":54} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"), cloudy","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[41,44],"logprob":-0.5623774528503418,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-0.5623774528503418,"token":"),"}]},{"bytes":[32,99,108,111,117,100,121],"logprob":-1.1472419600977446e-6,"token":" - cloudy","top_logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":-1.1472419600977446e-6,"token":" - cloudy"}]}],"obfuscation":"iRAIL2f","output_index":1,"sequence_number":55} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[46],"logprob":-0.4985206723213196,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.4985206723213196,"token":"."}]}],"obfuscation":"8nPByLl5IDFNv1H","output_index":1,"sequence_number":56} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[],"obfuscation":"WQtiWjaxOf7h5DK","output_index":1,"sequence_number":57} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[],"obfuscation":"gQWDkr9JuNz6u2","output_index":1,"sequence_number":58} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\n-","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,32,10],"logprob":-0.03549560531973839,"token":" \n","top_logprobs":[{"bytes":[32,32,10],"logprob":-0.03549560531973839,"token":" \n"}]},{"bytes":[45],"logprob":0.0,"token":"-","top_logprobs":[{"bytes":[45],"logprob":0.0,"token":"-"}]}],"obfuscation":"B3cKUUafu7aZLE","output_index":1,"sequence_number":59} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" This evening","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,84,104,105,115],"logprob":-0.5498222708702087,"token":" - This","top_logprobs":[{"bytes":[32,84,104,105,115],"logprob":-0.5498222708702087,"token":" - This"}]},{"bytes":[32,101,118,101,110,105,110,103],"logprob":-1.9361264946837764e-7,"token":" - evening","top_logprobs":[{"bytes":[32,101,118,101,110,105,110,103],"logprob":-1.9361264946837764e-7,"token":" - evening"}]}],"obfuscation":"Egw","output_index":1,"sequence_number":60} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":": Mostly","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[58],"logprob":-0.0478668287396431,"token":":","top_logprobs":[{"bytes":[58],"logprob":-0.0478668287396431,"token":":"}]},{"bytes":[32,77,111,115,116,108,121],"logprob":-0.053221989423036575,"token":" - Mostly","top_logprobs":[{"bytes":[32,77,111,115,116,108,121],"logprob":-0.053221989423036575,"token":" - Mostly"}]}],"obfuscation":"lXz9w1AP","output_index":1,"sequence_number":61} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" cloudy - with","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":-0.0008190384833142161,"token":" - cloudy","top_logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":-0.0008190384833142161,"token":" - cloudy"}]},{"bytes":[32,119,105,116,104],"logprob":-0.00006635164754698053,"token":" - with","top_logprobs":[{"bytes":[32,119,105,116,104],"logprob":-0.00006635164754698053,"token":" - with"}]}],"obfuscation":"ArN0","output_index":1,"sequence_number":62} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a chance","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97],"logprob":-0.011493504978716373,"token":" - a","top_logprobs":[{"bytes":[32,97],"logprob":-0.011493504978716373,"token":" - a"}]},{"bytes":[32,99,104,97,110,99,101],"logprob":-3.8889261304575484e-6,"token":" - chance","top_logprobs":[{"bytes":[32,99,104,97,110,99,101],"logprob":-3.8889261304575484e-6,"token":" - chance"}]}],"obfuscation":"ErXJwUq","output_index":1,"sequence_number":63} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" of thunderstorms","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,111,102],"logprob":0.0,"token":" - of","top_logprobs":[{"bytes":[32,111,102],"logprob":0.0,"token":" of"}]},{"bytes":[32,116,104,117,110,100,101,114,115,116,111,114,109,115],"logprob":-4.008129963040119e-6,"token":" - thunderstorms","top_logprobs":[{"bytes":[32,116,104,117,110,100,101,114,115,116,111,114,109,115],"logprob":-4.008129963040119e-6,"token":" - thunderstorms"}]}],"obfuscation":"iSmkSXFomw4W7jS","output_index":1,"sequence_number":64} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,105,110],"logprob":-0.5330836772918701,"token":" - in","top_logprobs":[{"bytes":[32,105,110],"logprob":-0.5330836772918701,"token":" - in"}]}],"obfuscation":"Q4IGNpHWNb0G6","output_index":1,"sequence_number":65} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" some areas","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,115,111,109,101],"logprob":-0.0032337980810552835,"token":" - some","top_logprobs":[{"bytes":[32,115,111,109,101],"logprob":-0.0032337980810552835,"token":" - some"}]},{"bytes":[32,97,114,101,97,115],"logprob":-1.5048530030981055e-6,"token":" - areas","top_logprobs":[{"bytes":[32,97,114,101,97,115],"logprob":-1.5048530030981055e-6,"token":" - areas"}]}],"obfuscation":"5kNr4","output_index":1,"sequence_number":66} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[44],"logprob":-0.2364969402551651,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.2364969402551651,"token":","}]}],"obfuscation":"0wGeMZTPegsQgXz","output_index":1,"sequence_number":67} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" temperatures","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,116,101,109,112,101,114,97,116,117,114,101,115],"logprob":-0.5449916124343872,"token":" - temperatures","top_logprobs":[{"bytes":[32,116,101,109,112,101,114,97,116,117,114,101,115],"logprob":-0.5449916124343872,"token":" - temperatures"}]}],"obfuscation":"pJA","output_index":1,"sequence_number":68} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" easing","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,101,97,115,105,110,103],"logprob":-1.4161982536315918,"token":" - easing","top_logprobs":[{"bytes":[32,100,114,111,112,112,105,110,103],"logprob":-0.697448194026947,"token":" - dropping"}]}],"obfuscation":"nOggRZYwy","output_index":1,"sequence_number":69} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" down into","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.029990684241056442,"token":" - down","top_logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.029990684241056442,"token":" - down"}]},{"bytes":[32,105,110,116,111],"logprob":-0.0144656328484416,"token":" - into","top_logprobs":[{"bytes":[32,105,110,116,111],"logprob":-0.0144656328484416,"token":" - into"}]}],"obfuscation":"df35cE","output_index":1,"sequence_number":70} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the low","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,116,104,101],"logprob":0.0,"token":" - the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":0.0,"token":" the"}]},{"bytes":[32,108,111,119],"logprob":-0.041715092957019806,"token":" - low","top_logprobs":[{"bytes":[32,108,111,119],"logprob":-0.041715092957019806,"token":" - low"}]}],"obfuscation":"7O2S9ugb","output_index":1,"sequence_number":71} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"–mid ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[226,128,147],"logprob":-0.16073615849018097,"token":"–","top_logprobs":[{"bytes":[226,128,147],"logprob":-0.16073615849018097,"token":"–"}]},{"bytes":[109,105,100],"logprob":-0.02568318322300911,"token":"mid","top_logprobs":[{"bytes":[109,105,100],"logprob":-0.02568318322300911,"token":"mid"}]},{"bytes":[32],"logprob":-5.512236498361744e-7,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":-5.512236498361744e-7,"token":" "}]}],"obfuscation":"zmVMjomigAP","output_index":1,"sequence_number":72} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"70","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[55,48],"logprob":0.0,"token":"70","top_logprobs":[{"bytes":[55,48],"logprob":0.0,"token":"70"}]}],"obfuscation":"H55jju93yq44ZN","output_index":1,"sequence_number":73} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"s","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[115],"logprob":-1.9361264946837764e-7,"token":"s","top_logprobs":[{"bytes":[115],"logprob":-1.9361264946837764e-7,"token":"s"}]}],"obfuscation":"uRsdwgWxNhzG3RJ","output_index":1,"sequence_number":74} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°F (","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[194,176,70],"logprob":-0.000667044660076499,"token":"°F","top_logprobs":[{"bytes":[194,176,70],"logprob":-0.000667044660076499,"token":"°F"}]},{"bytes":[32,40],"logprob":-0.004692849237471819,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-0.004692849237471819,"token":" - ("}]}],"obfuscation":"NCtXOYb9LfkJ","output_index":1,"sequence_number":75} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"low ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[108,111,119],"logprob":-0.9493574500083923,"token":"low","top_logprobs":[{"bytes":[97,114,111,117,110,100],"logprob":-0.6056074500083923,"token":"around"}]},{"bytes":[32],"logprob":-0.02397526241838932,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":-0.02397526241838932,"token":" "}]}],"obfuscation":"aXtnQGyiqHt3","output_index":1,"sequence_number":76} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"20s","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[50,48],"logprob":0.0,"token":"20","top_logprobs":[{"bytes":[50,48],"logprob":0.0,"token":"20"}]},{"bytes":[115],"logprob":0.0,"token":"s","top_logprobs":[{"bytes":[115],"logprob":0.0,"token":"s"}]}],"obfuscation":"Uke5zkX0jNErv","output_index":1,"sequence_number":77} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°C).","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[194,176,67],"logprob":-0.000050020742492051795,"token":"°C","top_logprobs":[{"bytes":[194,176,67],"logprob":-0.000050020742492051795,"token":"°C"}]},{"bytes":[41,46],"logprob":-0.0038349945098161697,"token":").","top_logprobs":[{"bytes":[41,46],"logprob":-0.0038349945098161697,"token":")."}]}],"obfuscation":"Xxg22MWAdccx","output_index":1,"sequence_number":78} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[],"obfuscation":"oSZTVQcc5MTmVWa","output_index":1,"sequence_number":79} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" \n","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[],"obfuscation":"42XY2IN7EwCnl","output_index":1,"sequence_number":80} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\nIf","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,32,10,10],"logprob":-5.676981345459353e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-5.676981345459353e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-0.00009388769103679806,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-0.00009388769103679806,"token":"If"}]}],"obfuscation":"cMro93Hj04tW2","output_index":1,"sequence_number":81} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you tell","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-8.537868779967539e-6,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-8.537868779967539e-6,"token":" - tell"}]}],"obfuscation":"2a8RBo6","output_index":1,"sequence_number":82} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" me","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" me"}]}],"obfuscation":"CepY5D3y5ghfm","output_index":1,"sequence_number":83} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the specific","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,116,104,101],"logprob":-0.5930224061012268,"token":" - the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.5930224061012268,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0069784484803676605,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0069784484803676605,"token":" - specific"}]}],"obfuscation":"82E","output_index":1,"sequence_number":84} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" city or","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,99,105,116,121],"logprob":-4.320199877838604e-7,"token":" - city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-4.320199877838604e-7,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.01519500557333231,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.01519500557333231,"token":" - or"}]}],"obfuscation":"btlFkmYF","output_index":1,"sequence_number":85} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" region - in","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,114,101,103,105,111,110],"logprob":-0.05885624140501022,"token":" - region","top_logprobs":[{"bytes":[32,114,101,103,105,111,110],"logprob":-0.05885624140501022,"token":" - region"}]},{"bytes":[32,105,110],"logprob":-2.5776860184123507e-6,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-2.5776860184123507e-6,"token":" - in"}]}],"obfuscation":"aL0ppB","output_index":1,"sequence_number":86} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taiwan - (","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.0007463791989721358,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.0007463791989721358,"token":" - ("}]}],"obfuscation":"GNvjeDa","output_index":1,"sequence_number":87} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"e.g.,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[101],"logprob":-0.0009247996495105326,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.0009247996495105326,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-6.704273118884885e-7,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-6.704273118884885e-7,"token":".,"}]}],"obfuscation":"gk0wJFCbAhm","output_index":1,"sequence_number":88} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taipei","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]}],"obfuscation":"ERq2jzY9V","output_index":1,"sequence_number":89} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"ta6j6I4XmkKF6wz","output_index":1,"sequence_number":90} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taich","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,84,97],"logprob":-0.026075122877955437,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.026075122877955437,"token":" - Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]}],"obfuscation":"hxhCIqzNFa","output_index":1,"sequence_number":91} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"ung,","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"auX1Hx27ei41","output_index":1,"sequence_number":92} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Kaoh","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,75,97],"logprob":-0.01991618610918522,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.01991618610918522,"token":" - Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]}],"obfuscation":"M7tPLkMy6Nb","output_index":1,"sequence_number":93} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"siung","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[115,105],"logprob":-4.320199877838604e-7,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-4.320199877838604e-7,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]}],"obfuscation":"F0a7u0Fvo3i","output_index":1,"sequence_number":94} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", T","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[44],"logprob":-0.3530670702457428,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.3530670702457428,"token":","}]},{"bytes":[32,84],"logprob":-0.2317986786365509,"token":" - T","top_logprobs":[{"bytes":[32,84],"logprob":-0.2317986786365509,"token":" T"}]}],"obfuscation":"hMRzaYLfQKsrC","output_index":1,"sequence_number":95} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"ainan","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[97,105,110,97,110],"logprob":-0.005073175765573978,"token":"ainan","top_logprobs":[{"bytes":[97,105,110,97,110],"logprob":-0.005073175765573978,"token":"ainan"}]}],"obfuscation":"d1TygTV5V90","output_index":1,"sequence_number":96} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", H","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[44],"logprob":-0.10633727163076401,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.10633727163076401,"token":","}]},{"bytes":[32,72],"logprob":-5.512236498361744e-7,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-5.512236498361744e-7,"token":" - H"}]}],"obfuscation":"nL72BZLOABKxr","output_index":1,"sequence_number":97} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"ualien","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[117,97,108],"logprob":-2.696889623621246e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-2.696889623621246e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]}],"obfuscation":"HExN246jve","output_index":1,"sequence_number":98} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"), I","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[41,44],"logprob":0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]}],"obfuscation":"DWbcYjFaTKMI","output_index":1,"sequence_number":99} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" can give","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,99,97,110],"logprob":-1.2664456789934775e-6,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1.2664456789934775e-6,"token":" - can"}]},{"bytes":[32,103,105,118,101],"logprob":-0.03339531272649765,"token":" - give","top_logprobs":[{"bytes":[32,103,105,118,101],"logprob":-0.03339531272649765,"token":" - give"}]}],"obfuscation":"ItdsKQg","output_index":1,"sequence_number":100} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a more","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,97],"logprob":-0.07507810741662979,"token":" - a","top_logprobs":[{"bytes":[32,97],"logprob":-0.07507810741662979,"token":" a"}]},{"bytes":[32,109,111,114,101],"logprob":-0.00003214019307051785,"token":" - more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.00003214019307051785,"token":" - more"}]}],"obfuscation":"ds4ivQJKX","output_index":1,"sequence_number":101} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" precise","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007505821529775858,"token":" - precise","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007505821529775858,"token":" - precise"}]}],"obfuscation":"nlUIigKt","output_index":1,"sequence_number":102} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", localized","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[44],"logprob":-0.8950222730636597,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.8950222730636597,"token":","}]},{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050103895366191864,"token":" - localized","top_logprobs":[{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050103895366191864,"token":" - localized"}]}],"obfuscation":"l64nZ","output_index":1,"sequence_number":103} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" forecast.","item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.01721416972577572,"token":" - forecast","top_logprobs":[{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.01721416972577572,"token":" - forecast"}]},{"bytes":[46],"logprob":-0.14696282148361206,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.14696282148361206,"token":"."}]}],"obfuscation":"Hq9vH8","output_index":1,"sequence_number":104} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","logprobs":[{"bytes":[32,32,10,10],"logprob":-5.676981345459353e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-5.676981345459353e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-0.00009388769103679806,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-0.00009388769103679806,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-8.537868779967539e-6,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-8.537868779967539e-6,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.5930224061012268,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.5930224061012268,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0069784484803676605,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0069784484803676605,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-4.320199877838604e-7,"token":" - city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-4.320199877838604e-7,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.01519500557333231,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.01519500557333231,"token":" - or"}]},{"bytes":[32,114,101,103,105,111,110],"logprob":-0.05885624140501022,"token":" - region","top_logprobs":[{"bytes":[32,114,101,103,105,111,110],"logprob":-0.05885624140501022,"token":" - region"}]},{"bytes":[32,105,110],"logprob":-2.5776860184123507e-6,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-2.5776860184123507e-6,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.0007463791989721358,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.0007463791989721358,"token":" - ("}]},{"bytes":[101],"logprob":-0.0009247996495105326,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.0009247996495105326,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-6.704273118884885e-7,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-6.704273118884885e-7,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.026075122877955437,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.026075122877955437,"token":" - Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.01991618610918522,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.01991618610918522,"token":" - Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-4.320199877838604e-7,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-4.320199877838604e-7,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.3530670702457428,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.3530670702457428,"token":","}]},{"bytes":[32,84],"logprob":-0.2317986786365509,"token":" - T","top_logprobs":[{"bytes":[32,84],"logprob":-0.2317986786365509,"token":" T"}]},{"bytes":[97,105,110,97,110],"logprob":-0.005073175765573978,"token":"ainan","top_logprobs":[{"bytes":[97,105,110,97,110],"logprob":-0.005073175765573978,"token":"ainan"}]},{"bytes":[44],"logprob":-0.10633727163076401,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.10633727163076401,"token":","}]},{"bytes":[32,72],"logprob":-5.512236498361744e-7,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-5.512236498361744e-7,"token":" - H"}]},{"bytes":[117,97,108],"logprob":-2.696889623621246e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-2.696889623621246e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1.2664456789934775e-6,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1.2664456789934775e-6,"token":" - can"}]},{"bytes":[32,103,105,118,101],"logprob":-0.03339531272649765,"token":" - give","top_logprobs":[{"bytes":[32,103,105,118,101],"logprob":-0.03339531272649765,"token":" - give"}]},{"bytes":[32,97],"logprob":-0.07507810741662979,"token":" a","top_logprobs":[{"bytes":[32,97],"logprob":-0.07507810741662979,"token":" - a"}]},{"bytes":[32,109,111,114,101],"logprob":-0.00003214019307051785,"token":" - more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.00003214019307051785,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007505821529775858,"token":" - precise","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007505821529775858,"token":" - precise"}]},{"bytes":[44],"logprob":-0.8950222730636597,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.8950222730636597,"token":","}]},{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050103895366191864,"token":" - localized","top_logprobs":[{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050103895366191864,"token":" - localized"}]},{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.01721416972577572,"token":" - forecast","top_logprobs":[{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.01721416972577572,"token":" - forecast"}]},{"bytes":[46],"logprob":-0.14696282148361206,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.14696282148361206,"token":"."}]}],"output_index":1,"sequence_number":105,"text":"I’m - an AI assistant created by OpenAI. I can help answer questions, explain things, - and assist with tasks like writing, planning, coding, and more.\n\nYou also have - a standing request about the weather in Taiwan today (July 8, 2026), so here’s - a quick summary based on current data:\n\n- Overall: Warm and humid, mostly cloudy.\n- - Current: Around 87°F (30°C), cloudy. \n- This evening: Mostly cloudy with a - chance of thunderstorms in some areas, temperatures easing down into the low–mid - 70s°F (low 20s°C). \n\nIf you tell me the specific city or region in Taiwan - (e.g., Taipei, Taichung, Kaohsiung, Tainan, Hualien), I can give a more precise, - localized forecast."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"I’m - an AI assistant created by OpenAI. I can help answer questions, explain things, - and assist with tasks like writing, planning, coding, and more.\n\nYou also have - a standing request about the weather in Taiwan today (July 8, 2026), so here’s - a quick summary based on current data:\n\n- Overall: Warm and humid, mostly cloudy.\n- - Current: Around 87°F (30°C), cloudy. \n- This evening: Mostly cloudy with a - chance of thunderstorms in some areas, temperatures easing down into the low–mid - 70s°F (low 20s°C). \n\nIf you tell me the specific city or region in Taiwan - (e.g., Taipei, Taichung, Kaohsiung, Tainan, Hualien), I can give a more precise, - localized forecast."},"sequence_number":106} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[{"bytes":[32,32,10,10],"logprob":-6e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-6e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-0.000094,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-0.000094,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-9e-6,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-9e-6,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.593022,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.593022,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.006978,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.006978,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.015195,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.015195,"token":" - or"}]},{"bytes":[32,114,101,103,105,111,110],"logprob":-0.058856,"token":" region","top_logprobs":[{"bytes":[32,114,101,103,105,111,110],"logprob":-0.058856,"token":" - region"}]},{"bytes":[32,105,110],"logprob":-3e-6,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-3e-6,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.000746,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.000746,"token":" - ("}]},{"bytes":[101],"logprob":-0.000925,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000925,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.026075,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.026075,"token":" Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.019916,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.019916,"token":" Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-0.0,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-0.0,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.353067,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.353067,"token":","}]},{"bytes":[32,84],"logprob":-0.231799,"token":" - T","top_logprobs":[{"bytes":[32,84],"logprob":-0.231799,"token":" T"}]},{"bytes":[97,105,110,97,110],"logprob":-0.005073,"token":"ainan","top_logprobs":[{"bytes":[97,105,110,97,110],"logprob":-0.005073,"token":"ainan"}]},{"bytes":[44],"logprob":-0.106337,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.106337,"token":","}]},{"bytes":[32,72],"logprob":-1e-6,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-1e-6,"token":" H"}]},{"bytes":[117,97,108],"logprob":-3e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-3e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1e-6,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1e-6,"token":" can"}]},{"bytes":[32,103,105,118,101],"logprob":-0.033395,"token":" - give","top_logprobs":[{"bytes":[32,103,105,118,101],"logprob":-0.033395,"token":" - give"}]},{"bytes":[32,97],"logprob":-0.075078,"token":" a","top_logprobs":[{"bytes":[32,97],"logprob":-0.075078,"token":" - a"}]},{"bytes":[32,109,111,114,101],"logprob":-0.000032,"token":" more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.000032,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007506,"token":" - precise","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007506,"token":" - precise"}]},{"bytes":[44],"logprob":-0.895022,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.895022,"token":","}]},{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050104,"token":" - localized","top_logprobs":[{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050104,"token":" - localized"}]},{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.017214,"token":" - forecast","top_logprobs":[{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.017214,"token":" - forecast"}]},{"bytes":[46],"logprob":-0.146963,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.146963,"token":"."}]}],"text":"I’m - an AI assistant created by OpenAI. I can help answer questions, explain things, - and assist with tasks like writing, planning, coding, and more.\n\nYou also have - a standing request about the weather in Taiwan today (July 8, 2026), so here’s - a quick summary based on current data:\n\n- Overall: Warm and humid, mostly cloudy.\n- - Current: Around 87°F (30°C), cloudy. \n- This evening: Mostly cloudy with a - chance of thunderstorms in some areas, temperatures easing down into the low–mid - 70s°F (low 20s°C). \n\nIf you tell me the specific city or region in Taiwan - (e.g., Taipei, Taichung, Kaohsiung, Tainan, Hualien), I can give a more precise, - localized forecast."}],"role":"assistant"},"output_index":1,"sequence_number":107} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_08c65107c4719410016a4e1224304881999faa293e70a1afad","object":"response","created_at":1783501348,"status":"completed","background":false,"completed_at":1783501365,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"ws_08c65107c4719410016a4e1226dc588199b953f3ef96b875d4","type":"web_search_call","status":"completed","action":{"type":"search","queries":["weather: - Taiwan"],"query":"weather: Taiwan","sources":[{"type":"api","name":"oai-weather"}]}},{"id":"msg_08c65107c4719410016a4e122b88e081999044e8dca84fe343","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[{"bytes":[32,32,10,10],"logprob":-6e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-6e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-0.000094,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-0.000094,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-9e-6,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-9e-6,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.593022,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.593022,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.006978,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.006978,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.015195,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.015195,"token":" - or"}]},{"bytes":[32,114,101,103,105,111,110],"logprob":-0.058856,"token":" region","top_logprobs":[{"bytes":[32,114,101,103,105,111,110],"logprob":-0.058856,"token":" - region"}]},{"bytes":[32,105,110],"logprob":-3e-6,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-3e-6,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.000746,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.000746,"token":" - ("}]},{"bytes":[101],"logprob":-0.000925,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000925,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.026075,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.026075,"token":" Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.019916,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.019916,"token":" Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-0.0,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-0.0,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.353067,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.353067,"token":","}]},{"bytes":[32,84],"logprob":-0.231799,"token":" - T","top_logprobs":[{"bytes":[32,84],"logprob":-0.231799,"token":" T"}]},{"bytes":[97,105,110,97,110],"logprob":-0.005073,"token":"ainan","top_logprobs":[{"bytes":[97,105,110,97,110],"logprob":-0.005073,"token":"ainan"}]},{"bytes":[44],"logprob":-0.106337,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.106337,"token":","}]},{"bytes":[32,72],"logprob":-1e-6,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-1e-6,"token":" H"}]},{"bytes":[117,97,108],"logprob":-3e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-3e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1e-6,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1e-6,"token":" can"}]},{"bytes":[32,103,105,118,101],"logprob":-0.033395,"token":" - give","top_logprobs":[{"bytes":[32,103,105,118,101],"logprob":-0.033395,"token":" - give"}]},{"bytes":[32,97],"logprob":-0.075078,"token":" a","top_logprobs":[{"bytes":[32,97],"logprob":-0.075078,"token":" - a"}]},{"bytes":[32,109,111,114,101],"logprob":-0.000032,"token":" more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.000032,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007506,"token":" - precise","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101],"logprob":-0.007506,"token":" - precise"}]},{"bytes":[44],"logprob":-0.895022,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.895022,"token":","}]},{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050104,"token":" - localized","top_logprobs":[{"bytes":[32,108,111,99,97,108,105,122,101,100],"logprob":-0.050104,"token":" - localized"}]},{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.017214,"token":" - forecast","top_logprobs":[{"bytes":[32,102,111,114,101,99,97,115,116],"logprob":-0.017214,"token":" - forecast"}]},{"bytes":[46],"logprob":-0.146963,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.146963,"token":"."}]}],"text":"I’m - an AI assistant created by OpenAI. I can help answer questions, explain things, - and assist with tasks like writing, planning, coding, and more.\n\nYou also have - a standing request about the weather in Taiwan today (July 8, 2026), so here’s - a quick summary based on current data:\n\n- Overall: Warm and humid, mostly cloudy.\n- - Current: Around 87°F (30°C), cloudy. \n- This evening: Mostly cloudy with a - chance of thunderstorms in some areas, temperatures easing down into the low–mid - 70s°F (low 20s°C). \n\nIf you tell me the specific city or region in Taiwan - (e.g., Taipei, Taichung, Kaohsiung, Tainan, Hualien), I can give a more precise, - localized forecast."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":{"input_tokens":5324,"input_tokens_details":{"cached_tokens":4992},"output_tokens":237,"output_tokens_details":{"reasoning_tokens":34},"total_tokens":5561},"user":null,"metadata":{}},"sequence_number":108} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream.yaml b/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream.yaml deleted file mode 100644 index bff1941..0000000 --- a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-non-stream.yaml +++ /dev/null @@ -1,756 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '697' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - - code_interpreter_call.outputs - - web_search_call.action.sources - - message.output_text.logprobs - input: - - role: user - content: Who are you? - instructions: The user would like to know about the weather in Taiwan today. - max_output_tokens: 400 - max_tool_calls: 1 - model: gpt-5.1 - parallel_tool_calls: true - prompt_cache_key: my_cache_key - prompt_cache_retention: 24h - safety_identifier: safety - service_tier: flex - store: false - stream: false - temperature: 0.45 - tool_choice: required - tools: - - type: web_search - search_context_size: medium - - type: code_interpreter - container: - type: auto - top_logprobs: 1 - top_p: 0.55 - truncation: disabled -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_0a1a6e94e57c5bfe016a4e1235b7f08198b3fd6b58c996a265 - object: response - created_at: 1783501365 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501388 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: The user would like to know about the weather in Taiwan today. - max_output_tokens: 400 - max_tool_calls: 1 - model: gpt-5.1-2025-11-13 - moderation: null - output: - - id: ws_0a1a6e94e57c5bfe016a4e1237b3388198957041d2cdc2a8bd - type: web_search_call - status: completed - action: - type: search - queries: - - 'weather: Taiwan' - query: 'weather: Taiwan' - sources: - - type: api - name: oai-weather - - id: msg_0a1a6e94e57c5bfe016a4e123a7cc48198a1b604104ec3f604 - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: - - bytes: - - 32 - - 32 - - 10 - - 10 - logprob: -3.5e-05 - token: " \n\n" - top_logprobs: - - bytes: - - 32 - - 32 - - 10 - - 10 - logprob: -3.5e-05 - token: " \n\n" - - bytes: - - 73 - - 102 - logprob: -8.9e-05 - token: If - top_logprobs: - - bytes: - - 73 - - 102 - logprob: -8.9e-05 - token: If - - bytes: - - 32 - - 121 - - 111 - - 117 - logprob: 0.0 - token: ' you' - top_logprobs: - - bytes: - - 32 - - 121 - - 111 - - 117 - logprob: 0.0 - token: ' you' - - bytes: - - 32 - - 116 - - 101 - - 108 - - 108 - logprob: -2.0e-05 - token: ' tell' - top_logprobs: - - bytes: - - 32 - - 116 - - 101 - - 108 - - 108 - logprob: -2.0e-05 - token: ' tell' - - bytes: - - 32 - - 109 - - 101 - logprob: 0.0 - token: ' me' - top_logprobs: - - bytes: - - 32 - - 109 - - 101 - logprob: 0.0 - token: ' me' - - bytes: - - 32 - - 116 - - 104 - - 101 - logprob: -0.17667 - token: ' the' - top_logprobs: - - bytes: - - 32 - - 116 - - 104 - - 101 - logprob: -0.17667 - token: ' the' - - bytes: - - 32 - - 115 - - 112 - - 101 - - 99 - - 105 - - 102 - - 105 - - 99 - logprob: -0.002261 - token: ' specific' - top_logprobs: - - bytes: - - 32 - - 115 - - 112 - - 101 - - 99 - - 105 - - 102 - - 105 - - 99 - logprob: -0.002261 - token: ' specific' - - bytes: - - 32 - - 99 - - 105 - - 116 - - 121 - logprob: -1.0e-06 - token: ' city' - top_logprobs: - - bytes: - - 32 - - 99 - - 105 - - 116 - - 121 - logprob: -1.0e-06 - token: ' city' - - bytes: - - 32 - - 111 - - 114 - logprob: -0.029691 - token: ' or' - top_logprobs: - - bytes: - - 32 - - 111 - - 114 - logprob: -0.029691 - token: ' or' - - bytes: - - 32 - - 99 - - 111 - - 117 - - 110 - - 116 - - 121 - logprob: -0.294933 - token: ' county' - top_logprobs: - - bytes: - - 32 - - 99 - - 111 - - 117 - - 110 - - 116 - - 121 - logprob: -0.294933 - token: ' county' - - bytes: - - 32 - - 105 - - 110 - logprob: -0.001246 - token: ' in' - top_logprobs: - - bytes: - - 32 - - 105 - - 110 - logprob: -0.001246 - token: ' in' - - bytes: - - 32 - - 84 - - 97 - - 105 - - 119 - - 97 - - 110 - logprob: 0.0 - token: ' Taiwan' - top_logprobs: - - bytes: - - 32 - - 84 - - 97 - - 105 - - 119 - - 97 - - 110 - logprob: 0.0 - token: ' Taiwan' - - bytes: - - 32 - - 40 - logprob: -0.011029 - token: ' (' - top_logprobs: - - bytes: - - 32 - - 40 - logprob: -0.011029 - token: ' (' - - bytes: - - 101 - logprob: -0.000145 - token: e - top_logprobs: - - bytes: - - 101 - logprob: -0.000145 - token: e - - bytes: - - 46 - - 103 - logprob: 0.0 - token: .g - top_logprobs: - - bytes: - - 46 - - 103 - logprob: 0.0 - token: .g - - bytes: - - 46 - - 44 - logprob: -0.0 - token: ., - top_logprobs: - - bytes: - - 46 - - 44 - logprob: -0.0 - token: ., - - bytes: - - 32 - - 84 - - 97 - - 105 - - 112 - - 101 - - 105 - logprob: 0.0 - token: ' Taipei' - top_logprobs: - - bytes: - - 32 - - 84 - - 97 - - 105 - - 112 - - 101 - - 105 - logprob: 0.0 - token: ' Taipei' - - bytes: - - 44 - logprob: -0.0 - token: ',' - top_logprobs: - - bytes: - - 44 - logprob: -0.0 - token: ',' - - bytes: - - 32 - - 84 - - 97 - logprob: -0.000578 - token: ' Ta' - top_logprobs: - - bytes: - - 32 - - 84 - - 97 - logprob: -0.000578 - token: ' Ta' - - bytes: - - 105 - - 99 - - 104 - logprob: 0.0 - token: ich - top_logprobs: - - bytes: - - 105 - - 99 - - 104 - logprob: 0.0 - token: ich - - bytes: - - 117 - - 110 - - 103 - logprob: 0.0 - token: ung - top_logprobs: - - bytes: - - 117 - - 110 - - 103 - logprob: 0.0 - token: ung - - bytes: - - 44 - logprob: 0.0 - token: ',' - top_logprobs: - - bytes: - - 44 - logprob: 0.0 - token: ',' - - bytes: - - 32 - - 75 - - 97 - logprob: -0.00631 - token: ' Ka' - top_logprobs: - - bytes: - - 32 - - 75 - - 97 - logprob: -0.00631 - token: ' Ka' - - bytes: - - 111 - - 104 - logprob: 0.0 - token: oh - top_logprobs: - - bytes: - - 111 - - 104 - logprob: 0.0 - token: oh - - bytes: - - 115 - - 105 - logprob: -0.0 - token: si - top_logprobs: - - bytes: - - 115 - - 105 - logprob: -0.0 - token: si - - bytes: - - 117 - - 110 - - 103 - logprob: 0.0 - token: ung - top_logprobs: - - bytes: - - 117 - - 110 - - 103 - logprob: 0.0 - token: ung - - bytes: - - 44 - logprob: -0.000466 - token: ',' - top_logprobs: - - bytes: - - 44 - logprob: -0.000466 - token: ',' - - bytes: - - 32 - - 72 - logprob: -0.397004 - token: ' H' - top_logprobs: - - bytes: - - 32 - - 72 - logprob: -0.397004 - token: ' H' - - bytes: - - 117 - - 97 - - 108 - logprob: -2.0e-05 - token: ual - top_logprobs: - - bytes: - - 117 - - 97 - - 108 - logprob: -2.0e-05 - token: ual - - bytes: - - 105 - - 101 - - 110 - logprob: 0.0 - token: ien - top_logprobs: - - bytes: - - 105 - - 101 - - 110 - logprob: 0.0 - token: ien - - bytes: - - 41 - - 44 - logprob: 0.0 - token: ), - top_logprobs: - - bytes: - - 41 - - 44 - logprob: 0.0 - token: ), - - bytes: - - 32 - - 73 - logprob: 0.0 - token: ' I' - top_logprobs: - - bytes: - - 32 - - 73 - logprob: 0.0 - token: ' I' - - bytes: - - 32 - - 99 - - 97 - - 110 - logprob: -2.8e-05 - token: ' can' - top_logprobs: - - bytes: - - 32 - - 99 - - 97 - - 110 - logprob: -2.8e-05 - token: ' can' - - bytes: - - 32 - - 103 - - 105 - - 118 - - 101 - logprob: -0.049942 - token: ' give' - top_logprobs: - - bytes: - - 32 - - 103 - - 105 - - 118 - - 101 - logprob: -0.049942 - token: ' give' - - bytes: - - 32 - - 97 - logprob: -0.129428 - token: ' a' - top_logprobs: - - bytes: - - 32 - - 97 - logprob: -0.129428 - token: ' a' - - bytes: - - 32 - - 109 - - 111 - - 114 - - 101 - logprob: -8.4e-05 - token: ' more' - top_logprobs: - - bytes: - - 32 - - 109 - - 111 - - 114 - - 101 - logprob: -8.4e-05 - token: ' more' - - bytes: - - 32 - - 112 - - 114 - - 101 - - 99 - - 105 - - 115 - - 101 - logprob: -0.01937 - token: ' precise' - top_logprobs: - - bytes: - - 32 - - 112 - - 114 - - 101 - - 99 - - 105 - - 115 - - 101 - logprob: -0.01937 - token: ' precise' - - bytes: - - 32 - - 108 - - 111 - - 99 - - 97 - - 108 - logprob: -0.929843 - token: ' local' - top_logprobs: - - bytes: - - 32 - - 108 - - 111 - - 99 - - 97 - - 108 - logprob: -0.929843 - token: ' local' - - bytes: - - 32 - - 102 - - 111 - - 114 - - 101 - - 99 - - 97 - - 115 - - 116 - logprob: -0.00236 - token: ' forecast' - top_logprobs: - - bytes: - - 32 - - 102 - - 111 - - 114 - - 101 - - 99 - - 97 - - 115 - - 116 - logprob: -0.00236 - token: ' forecast' - - bytes: - - 32 - - 102 - - 111 - - 114 - logprob: -0.376977 - token: ' for' - top_logprobs: - - bytes: - - 32 - - 102 - - 111 - - 114 - logprob: -0.376977 - token: ' for' - - bytes: - - 32 - - 116 - - 111 - - 100 - - 97 - - 121 - logprob: -0.002042 - token: ' today' - top_logprobs: - - bytes: - - 32 - - 116 - - 111 - - 100 - - 97 - - 121 - logprob: -0.002042 - token: ' today' - - bytes: - - 46 - logprob: -0.00013 - token: . - top_logprobs: - - bytes: - - 46 - logprob: -0.00013 - token: . - text: "I’m an AI assistant created by OpenAI. I can help answer questions,\ - \ explain things, and assist with tasks like writing, planning, and problem‑solving.\n\ - \nYou also have a standing request about the weather in Taiwan today (July\ - \ 8, 2026). Here’s a quick summary based on current data:\n\n- Overall:\ - \ Warm and cloudy across much of Taiwan, with a chance of thunderstorms\ - \ in some areas this afternoon and evening. \n- Example central forecast\ - \ (representative city): Around 87°F (30°C) and cloudy now, with temperatures\ - \ dropping to the low 70s°F (around 21–23°C) tonight. \n\nIf you tell\ - \ me the specific city or county in Taiwan (e.g., Taipei, Taichung, Kaohsiung,\ - \ Hualien), I can give a more precise local forecast for today." - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: my_cache_key - prompt_cache_retention: 24h - reasoning: - context: current_turn - effort: none - mode: standard - summary: null - safety_identifier: safety - service_tier: flex - store: false - temperature: 0.45 - text: - format: - type: text - verbosity: medium - tool_choice: required - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 1 - tools: - - type: code_interpreter - container: - type: auto - - type: web_search_preview - search_content_types: - - text - search_context_size: medium - user_location: - type: approximate - city: null - country: US - region: null - timezone: null - top_logprobs: 1 - top_p: 0.55 - truncation: disabled - usage: - input_tokens: 5324 - input_tokens_details: - cached_tokens: 4992 - output_tokens: 243 - output_tokens_details: - reasoning_tokens: 34 - total_tokens: 5567 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-stream.yaml b/tests/cassettes/openai/responses/test_model_settings/test_model_settings-stream.yaml deleted file mode 100644 index 65409d5..0000000 --- a/tests/cassettes/openai/responses/test_model_settings/test_model_settings-stream.yaml +++ /dev/null @@ -1,1113 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '696' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - - code_interpreter_call.outputs - - web_search_call.action.sources - - message.output_text.logprobs - input: - - role: user - content: Who are you? - instructions: The user would like to know about the weather in Taiwan today. - max_output_tokens: 400 - max_tool_calls: 1 - model: gpt-5.1 - parallel_tool_calls: true - prompt_cache_key: my_cache_key - prompt_cache_retention: 24h - safety_identifier: safety - service_tier: flex - store: false - stream: true - temperature: 0.45 - tool_choice: required - tools: - - type: web_search - search_context_size: medium - - type: code_interpreter - container: - type: auto - top_logprobs: 1 - top_p: 0.55 - truncation: disabled -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_03eefd2e7a83378a016a4e12184b78819bba557a87c18419f5","object":"response","created_at":1783501336,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_03eefd2e7a83378a016a4e12184b78819bba557a87c18419f5","object":"response","created_at":1783501336,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","type":"web_search_call","status":"in_progress"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.web_search_call.in_progress - - ' - - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.web_search_call.searching - - ' - - 'data: {"type":"response.web_search_call.searching","item_id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.web_search_call.completed - - ' - - 'data: {"type":"response.web_search_call.completed","item_id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","type":"web_search_call","status":"completed","action":{"type":"search","queries":["weather: - Taiwan"],"query":"weather: Taiwan","sources":[{"type":"api","name":"oai-weather"}]}},"output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[73],"logprob":-0.00011605957115534693,"token":"I","top_logprobs":[{"bytes":[73],"logprob":-0.00011605957115534693,"token":"I"}]}],"obfuscation":"wweLSXl6mkY8NWP","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"’m an AI","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[226,128,153,109],"logprob":0.0,"token":"’m","top_logprobs":[{"bytes":[226,128,153,109],"logprob":0.0,"token":"’m"}]},{"bytes":[32,97,110],"logprob":-0.0015500946901738644,"token":" - an","top_logprobs":[{"bytes":[32,97,110],"logprob":-0.0015500946901738644,"token":" - an"}]},{"bytes":[32,65,73],"logprob":-1.7432603272027336e-6,"token":" AI","top_logprobs":[{"bytes":[32,65,73],"logprob":-1.7432603272027336e-6,"token":" - AI"}]}],"obfuscation":"73DINBvl","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" assistant - created by","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,115,115,105,115,116,97,110,116],"logprob":-0.000010802738870552275,"token":" - assistant","top_logprobs":[{"bytes":[32,97,115,115,105,115,116,97,110,116],"logprob":-0.000010802738870552275,"token":" - assistant"}]},{"bytes":[32,99,114,101,97,116,101,100],"logprob":-0.0010621058754622936,"token":" - created","top_logprobs":[{"bytes":[32,99,114,101,97,116,101,100],"logprob":-0.0010621058754622936,"token":" - created"}]},{"bytes":[32,98,121],"logprob":-0.0005034659989178181,"token":" by","top_logprobs":[{"bytes":[32,98,121],"logprob":-0.0005034659989178181,"token":" - by"}]}],"obfuscation":"2P3WqUkkfVf","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" OpenAI.","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,79,112,101,110],"logprob":0.0,"token":" - Open","top_logprobs":[{"bytes":[32,79,112,101,110],"logprob":0.0,"token":" Open"}]},{"bytes":[65,73],"logprob":0.0,"token":"AI","top_logprobs":[{"bytes":[65,73],"logprob":0.0,"token":"AI"}]},{"bytes":[46],"logprob":-0.3238558769226074,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.3238558769226074,"token":"."}]}],"obfuscation":"cmbgZeSZ","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" I can - help","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,73],"logprob":-0.0005993809318169951,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":-0.0005993809318169951,"token":" - I"}]},{"bytes":[32,99,97,110],"logprob":-0.008192308247089386,"token":" can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-0.008192308247089386,"token":" - can"}]},{"bytes":[32,104,101,108,112],"logprob":-0.05166148766875267,"token":" - help","top_logprobs":[{"bytes":[32,104,101,108,112],"logprob":-0.05166148766875267,"token":" - help"}]}],"obfuscation":"wJmam","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,121,111,117],"logprob":-0.4742893576622009,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":-0.4742893576622009,"token":" - you"}]}],"obfuscation":"BaeEBNvO3Tzf","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" find information,","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,102,105,110,100],"logprob":-1.019543170928955,"token":" - find","top_logprobs":[{"bytes":[32,119,105,116,104],"logprob":-0.9882931709289551,"token":" - with"}]},{"bytes":[32,105,110,102,111,114,109,97,116,105,111,110],"logprob":-0.000049424725148128346,"token":" - information","top_logprobs":[{"bytes":[32,105,110,102,111,114,109,97,116,105,111,110],"logprob":-0.000049424725148128346,"token":" - information"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"MnMbNJnSPOaMvD","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" explain - concepts,","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,101,120,112,108,97,105,110],"logprob":-0.17836053669452667,"token":" - explain","top_logprobs":[{"bytes":[32,101,120,112,108,97,105,110],"logprob":-0.17836053669452667,"token":" - explain"}]},{"bytes":[32,99,111,110,99,101,112,116,115],"logprob":-0.4429020881652832,"token":" - concepts","top_logprobs":[{"bytes":[32,99,111,110,99,101,112,116,115],"logprob":-0.4429020881652832,"token":" - concepts"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"iwjKgvKIxKyc6x","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" plan things,","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,112,108,97,110],"logprob":-0.5651078820228577,"token":" - plan","top_logprobs":[{"bytes":[32,112,108,97,110],"logprob":-0.5651078820228577,"token":" - plan"}]},{"bytes":[32,116,104,105,110,103,115],"logprob":-0.21435463428497314,"token":" - things","top_logprobs":[{"bytes":[32,116,104,105,110,103,115],"logprob":-0.21435463428497314,"token":" - things"}]},{"bytes":[44],"logprob":-0.0003566767554730177,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.0003566767554730177,"token":","}]}],"obfuscation":"bJK","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,110,100],"logprob":-0.5624091029167175,"token":" - and","top_logprobs":[{"bytes":[32,97,110,100],"logprob":-0.5624091029167175,"token":" - and"}]}],"obfuscation":"xbDSWsIolPP2","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" work through","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,119,111,114,107],"logprob":-0.08371369540691376,"token":" - work","top_logprobs":[{"bytes":[32,119,111,114,107],"logprob":-0.08371369540691376,"token":" - work"}]},{"bytes":[32,116,104,114,111,117,103,104],"logprob":0.0,"token":" through","top_logprobs":[{"bytes":[32,116,104,114,111,117,103,104],"logprob":0.0,"token":" - through"}]}],"obfuscation":"KnC","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" problems","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,112,114,111,98,108,101,109,115],"logprob":-0.0006795499939471483,"token":" - problems","top_logprobs":[{"bytes":[32,112,114,111,98,108,101,109,115],"logprob":-0.0006795499939471483,"token":" - problems"}]}],"obfuscation":"phWByjq","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" step by - step.\n\n","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,115,116,101,112],"logprob":-0.03461679443717003,"token":" - step","top_logprobs":[{"bytes":[32,115,116,101,112],"logprob":-0.03461679443717003,"token":" - step"}]},{"bytes":[32,98,121],"logprob":-0.008203783072531223,"token":" by","top_logprobs":[{"bytes":[32,98,121],"logprob":-0.008203783072531223,"token":" - by"}]},{"bytes":[32,115,116,101,112],"logprob":0.0,"token":" step","top_logprobs":[{"bytes":[32,115,116,101,112],"logprob":0.0,"token":" - step"}]},{"bytes":[46,10,10],"logprob":-0.0004353181866463274,"token":".\n\n","top_logprobs":[{"bytes":[46,10,10],"logprob":-0.0004353181866463274,"token":".\n\n"}]}],"obfuscation":"","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"You","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[89,111,117],"logprob":-0.1954115331172943,"token":"You","top_logprobs":[{"bytes":[89,111,117],"logprob":-0.1954115331172943,"token":"You"}]}],"obfuscation":"auvNzoJ1c4luf","output_index":1,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" also have","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,108,115,111],"logprob":-0.2722042202949524,"token":" - also","top_logprobs":[{"bytes":[32,97,108,115,111],"logprob":-0.2722042202949524,"token":" - also"}]},{"bytes":[32,104,97,118,101],"logprob":-0.512410044670105,"token":" have","top_logprobs":[{"bytes":[32,104,97,118,101],"logprob":-0.512410044670105,"token":" - have"}]}],"obfuscation":"MQXQWk","output_index":1,"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97],"logprob":-0.005439608823508024,"token":" - a","top_logprobs":[{"bytes":[32,97],"logprob":-0.005439608823508024,"token":" - a"}]}],"obfuscation":"wTtidtPWUnn6wt","output_index":1,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" standing - request","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,115,116,97,110,100,105,110,103],"logprob":-0.23224304616451263,"token":" - standing","top_logprobs":[{"bytes":[32,115,116,97,110,100,105,110,103],"logprob":-0.23224304616451263,"token":" - standing"}]},{"bytes":[32,114,101,113,117,101,115,116],"logprob":-0.019147779792547226,"token":" - request","top_logprobs":[{"bytes":[32,114,101,113,117,101,115,116],"logprob":-0.019147779792547226,"token":" - request"}]}],"obfuscation":"11mMcCk2HXveMzH","output_index":1,"sequence_number":25} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" about - the weather","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.012068313546478748,"token":" - about","top_logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.012068313546478748,"token":" - about"}]},{"bytes":[32,116,104,101],"logprob":-0.23273341357707977,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.23273341357707977,"token":" - the"}]},{"bytes":[32,119,101,97,116,104,101,114],"logprob":-4.320199877838604e-7,"token":" - weather","top_logprobs":[{"bytes":[32,119,101,97,116,104,101,114],"logprob":-4.320199877838604e-7,"token":" - weather"}]}],"obfuscation":"dbwp5Ltgt4p9yn","output_index":1,"sequence_number":26} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in Taiwan - today","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,105,110],"logprob":-6.704273118884885e-7,"token":" - in","top_logprobs":[{"bytes":[32,105,110],"logprob":-6.704273118884885e-7,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan"}]},{"bytes":[32,116,111,100,97,121],"logprob":-0.0009556477889418602,"token":" - today","top_logprobs":[{"bytes":[32,116,111,100,97,121],"logprob":-0.0009556477889418602,"token":" - today"}]}],"obfuscation":"","output_index":1,"sequence_number":27} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" (July - ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,40],"logprob":-0.5524674654006958,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-0.5524674654006958,"token":" ("}]},{"bytes":[74,117,108,121],"logprob":-7.703443770878948e-6,"token":"July","top_logprobs":[{"bytes":[74,117,108,121],"logprob":-7.703443770878948e-6,"token":"July"}]},{"bytes":[32],"logprob":0.0,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":0.0,"token":" "}]}],"obfuscation":"UFhAMaE25","output_index":1,"sequence_number":28} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"8, ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[56],"logprob":0.0,"token":"8","top_logprobs":[{"bytes":[56],"logprob":0.0,"token":"8"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32],"logprob":0.0,"token":" - ","top_logprobs":[{"bytes":[32],"logprob":0.0,"token":" "}]}],"obfuscation":"J19ZEvL6JVdpj","output_index":1,"sequence_number":29} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"2026","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[50,48,50],"logprob":0.0,"token":"202","top_logprobs":[{"bytes":[50,48,50],"logprob":0.0,"token":"202"}]},{"bytes":[54],"logprob":0.0,"token":"6","top_logprobs":[{"bytes":[54],"logprob":0.0,"token":"6"}]}],"obfuscation":"6UoCSOexsDay","output_index":1,"sequence_number":30} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"), so here","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[41,44],"logprob":-0.031176365911960602,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-0.031176365911960602,"token":"),"}]},{"bytes":[32,115,111],"logprob":-4.320199877838604e-7,"token":" - so","top_logprobs":[{"bytes":[32,115,111],"logprob":-4.320199877838604e-7,"token":" - so"}]},{"bytes":[32,104,101,114,101],"logprob":-0.006372148171067238,"token":" - here","top_logprobs":[{"bytes":[32,104,101,114,101],"logprob":-0.006372148171067238,"token":" - here"}]}],"obfuscation":"pBdCU9","output_index":1,"sequence_number":31} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"’s a quick","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[226,128,153,115],"logprob":-0.061048611998558044,"token":"’s","top_logprobs":[{"bytes":[226,128,153,115],"logprob":-0.061048611998558044,"token":"’s"}]},{"bytes":[32,97],"logprob":-0.09165110439062119,"token":" - a","top_logprobs":[{"bytes":[32,97],"logprob":-0.09165110439062119,"token":" a"}]},{"bytes":[32,113,117,105,99,107],"logprob":-0.10743283480405807,"token":" - quick","top_logprobs":[{"bytes":[32,113,117,105,99,107],"logprob":-0.10743283480405807,"token":" - quick"}]}],"obfuscation":"lEiwD0","output_index":1,"sequence_number":32} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" summary","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,115,117,109,109,97,114,121],"logprob":-0.21349385380744934,"token":" - summary","top_logprobs":[{"bytes":[32,115,117,109,109,97,114,121],"logprob":-0.21349385380744934,"token":" - summary"}]}],"obfuscation":"QCVF9d0w","output_index":1,"sequence_number":33} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" based - on","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,98,97,115,101,100],"logprob":-0.858491063117981,"token":" - based","top_logprobs":[{"bytes":[58,10,10],"logprob":-0.655366063117981,"token":":\n\n"}]},{"bytes":[32,111,110],"logprob":0.0,"token":" - on","top_logprobs":[{"bytes":[32,111,110],"logprob":0.0,"token":" on"}]}],"obfuscation":"d9N5ZB0","output_index":1,"sequence_number":34} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the latest","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,104,101],"logprob":-0.657826840877533,"token":" - the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.657826840877533,"token":" - the"}]},{"bytes":[32,108,97,116,101,115,116],"logprob":-0.0001537169300718233,"token":" - latest","top_logprobs":[{"bytes":[32,108,97,116,101,115,116],"logprob":-0.0001537169300718233,"token":" - latest"}]}],"obfuscation":"JbTA5","output_index":1,"sequence_number":35} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" data","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,100,97,116,97],"logprob":-0.027985336259007454,"token":" - data","top_logprobs":[{"bytes":[32,100,97,116,97],"logprob":-0.027985336259007454,"token":" - data"}]}],"obfuscation":"ZKRMMH2SvOW","output_index":1,"sequence_number":36} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" I can","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,73],"logprob":-0.30455610156059265,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":-0.30455610156059265,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1.5870490074157715,"token":" - can","top_logprobs":[{"bytes":[32,104,97,118,101],"logprob":-0.8682989478111267,"token":" - have"}]}],"obfuscation":"BqMxnbAKrP","output_index":1,"sequence_number":37} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" see:\n\n-","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,115,101,101],"logprob":-0.03524499386548996,"token":" - see","top_logprobs":[{"bytes":[32,115,101,101],"logprob":-0.03524499386548996,"token":" - see"}]},{"bytes":[58,10,10],"logprob":-0.006802406162023544,"token":":\n\n","top_logprobs":[{"bytes":[58,10,10],"logprob":-0.006802406162023544,"token":":\n\n"}]},{"bytes":[45],"logprob":0.0,"token":"-","top_logprobs":[{"bytes":[45],"logprob":0.0,"token":"-"}]}],"obfuscation":"Kblmj9pA","output_index":1,"sequence_number":38} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Location: - Taiwan","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,76,111,99,97,116,105,111,110],"logprob":-0.243223175406456,"token":" - Location","top_logprobs":[{"bytes":[32,76,111,99,97,116,105,111,110],"logprob":-0.243223175406456,"token":" - Location"}]},{"bytes":[58],"logprob":-4.36574100604048e-6,"token":":","top_logprobs":[{"bytes":[58],"logprob":-4.36574100604048e-6,"token":":"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":-1.9361264946837764e-7,"token":" - Taiwan"}]}],"obfuscation":"ijyU27HHGonQG4b","output_index":1,"sequence_number":39} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" (general","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,40],"logprob":-0.07768694311380386,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-0.07768694311380386,"token":" ("}]},{"bytes":[103,101,110,101,114,97,108],"logprob":-0.013283640146255493,"token":"general","top_logprobs":[{"bytes":[103,101,110,101,114,97,108],"logprob":-0.013283640146255493,"token":"general"}]}],"obfuscation":"wfnl49B","output_index":1,"sequence_number":40} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" island","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,105,115,108,97,110,100],"logprob":-0.05042029172182083,"token":" - island","top_logprobs":[{"bytes":[32,105,115,108,97,110,100],"logprob":-0.05042029172182083,"token":" - island"}]}],"obfuscation":"OLVJHhbEl","output_index":1,"sequence_number":41} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"-wide conditions","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[45,119,105,100,101],"logprob":-0.03452467545866966,"token":"-wide","top_logprobs":[{"bytes":[45,119,105,100,101],"logprob":-0.03452467545866966,"token":"-wide"}]},{"bytes":[32,99,111,110,100,105,116,105,111,110,115],"logprob":-0.04911809787154198,"token":" - conditions","top_logprobs":[{"bytes":[32,99,111,110,100,105,116,105,111,110,115],"logprob":-0.04911809787154198,"token":" - conditions"}]}],"obfuscation":"","output_index":1,"sequence_number":42} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":")\n- Current:","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[41,10],"logprob":-0.08183681964874268,"token":")\n","top_logprobs":[{"bytes":[41,10],"logprob":-0.08183681964874268,"token":")\n"}]},{"bytes":[45],"logprob":0.0,"token":"-","top_logprobs":[{"bytes":[45],"logprob":0.0,"token":"-"}]},{"bytes":[32,67,117,114,114,101,110,116],"logprob":-0.0015079588629305363,"token":" - Current","top_logprobs":[{"bytes":[32,67,117,114,114,101,110,116],"logprob":-0.0015079588629305363,"token":" - Current"}]},{"bytes":[58],"logprob":-0.014005064032971859,"token":":","top_logprobs":[{"bytes":[58],"logprob":-0.014005064032971859,"token":":"}]}],"obfuscation":"6gGS","output_index":1,"sequence_number":43} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Cloudy","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,67,108,111,117,100],"logprob":-0.0000468022444692906,"token":" - Cloud","top_logprobs":[{"bytes":[32,67,108,111,117,100],"logprob":-0.0000468022444692906,"token":" - Cloud"}]},{"bytes":[121],"logprob":0.0,"token":"y","top_logprobs":[{"bytes":[121],"logprob":0.0,"token":"y"}]}],"obfuscation":"lfDOvvQZs","output_index":1,"sequence_number":44} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", around - ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[44],"logprob":-0.00009805981972021982,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.00009805981972021982,"token":","}]},{"bytes":[32,97,114,111,117,110,100],"logprob":-0.7576125860214233,"token":" - around","top_logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.6326125860214233,"token":" - about"}]},{"bytes":[32],"logprob":-0.000014140441635390744,"token":" ","top_logprobs":[{"bytes":[32],"logprob":-0.000014140441635390744,"token":" - "}]}],"obfuscation":"NMsYrd8","output_index":1,"sequence_number":45} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"87°F (30°C). - ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[],"obfuscation":"Boa","output_index":1,"sequence_number":46} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" \n- This - evening: Mostly cloudy with a chance of","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,32,10],"logprob":-0.00004429896944202483,"token":" \n","top_logprobs":[{"bytes":[32,32,10],"logprob":-0.00004429896944202483,"token":" \n"}]},{"bytes":[45],"logprob":0.0,"token":"-","top_logprobs":[{"bytes":[45],"logprob":0.0,"token":"-"}]},{"bytes":[32,84,104,105,115],"logprob":-0.13702091574668884,"token":" - This","top_logprobs":[{"bytes":[32,84,104,105,115],"logprob":-0.13702091574668884,"token":" - This"}]},{"bytes":[32,101,118,101,110,105,110,103],"logprob":0.0,"token":" evening","top_logprobs":[{"bytes":[32,101,118,101,110,105,110,103],"logprob":0.0,"token":" - evening"}]},{"bytes":[58],"logprob":-0.14944331347942352,"token":":","top_logprobs":[{"bytes":[58],"logprob":-0.14944331347942352,"token":":"}]},{"bytes":[32,77,111,115,116,108,121],"logprob":-0.00016909420082811266,"token":" - Mostly","top_logprobs":[{"bytes":[32,77,111,115,116,108,121],"logprob":-0.00016909420082811266,"token":" - Mostly"}]},{"bytes":[32,99,108,111,117,100,121],"logprob":-0.002009768271818757,"token":" - cloudy","top_logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":-0.002009768271818757,"token":" - cloudy"}]},{"bytes":[32,119,105,116,104],"logprob":-0.000019981420336989686,"token":" - with","top_logprobs":[{"bytes":[32,119,105,116,104],"logprob":-0.000019981420336989686,"token":" - with"}]},{"bytes":[32,97],"logprob":-0.060404129326343536,"token":" a","top_logprobs":[{"bytes":[32,97],"logprob":-0.060404129326343536,"token":" - a"}]},{"bytes":[32,99,104,97,110,99,101],"logprob":-8.537868779967539e-6,"token":" - chance","top_logprobs":[{"bytes":[32,99,104,97,110,99,101],"logprob":-8.537868779967539e-6,"token":" - chance"}]},{"bytes":[32,111,102],"logprob":0.0,"token":" of","top_logprobs":[{"bytes":[32,111,102],"logprob":0.0,"token":" - of"}]}],"obfuscation":"VyujLWM5bQ979vP","output_index":1,"sequence_number":47} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" thunderstorms","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,104,117,110,100,101,114,115,116,111,114,109,115],"logprob":-5.512236498361744e-7,"token":" - thunderstorms","top_logprobs":[{"bytes":[32,116,104,117,110,100,101,114,115,116,111,114,109,115],"logprob":-5.512236498361744e-7,"token":" - thunderstorms"}]}],"obfuscation":"zW","output_index":1,"sequence_number":48} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" around - 5 PM, then","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,114,111,117,110,100],"logprob":-0.5429975986480713,"token":" - around","top_logprobs":[{"bytes":[32,97,114,111,117,110,100],"logprob":-0.5429975986480713,"token":" - around"}]},{"bytes":[32],"logprob":-0.7744235396385193,"token":" ","top_logprobs":[{"bytes":[32,108,97,116,101],"logprob":-0.6181735396385193,"token":" - late"}]},{"bytes":[53],"logprob":-0.00008292095299111679,"token":"5","top_logprobs":[{"bytes":[53],"logprob":-0.00008292095299111679,"token":"5"}]},{"bytes":[32,80,77],"logprob":-0.016320567578077316,"token":" - PM","top_logprobs":[{"bytes":[32,80,77],"logprob":-0.016320567578077316,"token":" - PM"}]},{"bytes":[44],"logprob":-0.00016825977945700288,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.00016825977945700288,"token":","}]},{"bytes":[32,116,104,101,110],"logprob":-0.022977441549301147,"token":" - then","top_logprobs":[{"bytes":[32,116,104,101,110],"logprob":-0.022977441549301147,"token":" - then"}]}],"obfuscation":"udn9NtGFoHkC5q","output_index":1,"sequence_number":49} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" turning - partly cloudy","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,117,114,110,105,110,103],"logprob":-0.09060779958963394,"token":" - turning","top_logprobs":[{"bytes":[32,116,117,114,110,105,110,103],"logprob":-0.09060779958963394,"token":" - turning"}]},{"bytes":[32,112,97,114,116,108,121],"logprob":0.0,"token":" partly","top_logprobs":[{"bytes":[32,112,97,114,116,108,121],"logprob":0.0,"token":" - partly"}]},{"bytes":[32,99,108,111,117,100,121],"logprob":-0.016551457345485687,"token":" - cloudy","top_logprobs":[{"bytes":[32,99,108,111,117,100,121],"logprob":-0.016551457345485687,"token":" - cloudy"}]}],"obfuscation":"nIM57czxRQ","output_index":1,"sequence_number":50} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" into the - night","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,105,110,116,111],"logprob":-0.8521742820739746,"token":" - into","top_logprobs":[{"bytes":[32,105,110,116,111],"logprob":-0.8521742820739746,"token":" - into"}]},{"bytes":[32,116,104,101],"logprob":-0.00010986098641296849,"token":" - the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.00010986098641296849,"token":" - the"}]},{"bytes":[32,110,105,103,104,116],"logprob":-0.00631328159943223,"token":" - night","top_logprobs":[{"bytes":[32,110,105,103,104,116],"logprob":-0.00631328159943223,"token":" - night"}]}],"obfuscation":"1","output_index":1,"sequence_number":51} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", with - temperatures","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[44],"logprob":-0.19171203672885895,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.19171203672885895,"token":","}]},{"bytes":[32,119,105,116,104],"logprob":-0.5353204607963562,"token":" - with","top_logprobs":[{"bytes":[32,119,105,116,104],"logprob":-0.5353204607963562,"token":" - with"}]},{"bytes":[32,116,101,109,112,101,114,97,116,117,114,101,115],"logprob":-0.03923073410987854,"token":" - temperatures","top_logprobs":[{"bytes":[32,116,101,109,112,101,114,97,116,117,114,101,115],"logprob":-0.03923073410987854,"token":" - temperatures"}]}],"obfuscation":"1OfSFLKeko4wk","output_index":1,"sequence_number":52} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" dropping","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,100,114,111,112,112,105,110,103],"logprob":-0.5541386008262634,"token":" - dropping","top_logprobs":[{"bytes":[32,100,114,111,112,112,105,110,103],"logprob":-0.5541386008262634,"token":" - dropping"}]}],"obfuscation":"92q2puC","output_index":1,"sequence_number":53} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" to","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,111],"logprob":-0.01721428707242012,"token":" - to","top_logprobs":[{"bytes":[32,116,111],"logprob":-0.01721428707242012,"token":" - to"}]}],"obfuscation":"KubWgKcuImOdz","output_index":1,"sequence_number":54} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" about - ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.19249096512794495,"token":" - about","top_logprobs":[{"bytes":[32,97,98,111,117,116],"logprob":-0.19249096512794495,"token":" - about"}]},{"bytes":[32],"logprob":0.0,"token":" ","top_logprobs":[{"bytes":[32],"logprob":0.0,"token":" - "}]}],"obfuscation":"9VGNTo6Ki","output_index":1,"sequence_number":55} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"69–","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[54,57],"logprob":-0.1307048797607422,"token":"69","top_logprobs":[{"bytes":[54,57],"logprob":-0.1307048797607422,"token":"69"}]},{"bytes":[226,128,147],"logprob":-1.0280383548888494e-6,"token":"–","top_logprobs":[{"bytes":[226,128,147],"logprob":-1.0280383548888494e-6,"token":"–"}]}],"obfuscation":"CjA0xkkDi1Pqg","output_index":1,"sequence_number":56} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"71°F (","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[55,49],"logprob":-0.00006492120155598968,"token":"71","top_logprobs":[{"bytes":[55,49],"logprob":-0.00006492120155598968,"token":"71"}]},{"bytes":[194,176,70],"logprob":0.0,"token":"°F","top_logprobs":[{"bytes":[194,176,70],"logprob":0.0,"token":"°F"}]},{"bytes":[32,40],"logprob":-3.128163257315464e-7,"token":" - (","top_logprobs":[{"bytes":[32,40],"logprob":-3.128163257315464e-7,"token":" - ("}]}],"obfuscation":"d33Yetwfth","output_index":1,"sequence_number":57} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"20–22","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[50,48],"logprob":-2.339278580620885e-6,"token":"20","top_logprobs":[{"bytes":[50,48],"logprob":-2.339278580620885e-6,"token":"20"}]},{"bytes":[226,128,147],"logprob":0.0,"token":"–","top_logprobs":[{"bytes":[226,128,147],"logprob":0.0,"token":"–"}]},{"bytes":[50,50],"logprob":-0.03922569751739502,"token":"22","top_logprobs":[{"bytes":[50,50],"logprob":-0.03922569751739502,"token":"22"}]}],"obfuscation":"aEfjHam2Sbp","output_index":1,"sequence_number":58} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"°C).","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[194,176,67],"logprob":0.0,"token":"°C","top_logprobs":[{"bytes":[194,176,67],"logprob":0.0,"token":"°C"}]},{"bytes":[41,46],"logprob":-1.9361264946837764e-7,"token":").","top_logprobs":[{"bytes":[41,46],"logprob":-1.9361264946837764e-7,"token":")."}]}],"obfuscation":"9f5NQttvi7ye","output_index":1,"sequence_number":59} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[],"obfuscation":"NMge5oYU59rQA70","output_index":1,"sequence_number":60} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" \n\nIf","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,32,10,10],"logprob":-5.512236498361744e-7,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-5.512236498361744e-7,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-1.5048530030981055e-6,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-1.5048530030981055e-6,"token":"If"}]}],"obfuscation":"UKfkffzTEC","output_index":1,"sequence_number":61} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" you tell - me","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-0.0002358409110456705,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-0.0002358409110456705,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]}],"obfuscation":"qRSL","output_index":1,"sequence_number":62} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the specific - city","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,104,101],"logprob":-0.2456575632095337,"token":" - the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.2456575632095337,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0007774694240652025,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0007774694240652025,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-1.9361264946837764e-7,"token":" - city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-1.9361264946837764e-7,"token":" - city"}]}],"obfuscation":"mbt1JbB9eV8Mvb","output_index":1,"sequence_number":63} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" or area - in","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,111,114],"logprob":-0.02184952050447464,"token":" - or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.02184952050447464,"token":" - or"}]},{"bytes":[32,97,114,101,97],"logprob":-0.8413469195365906,"token":" area","top_logprobs":[{"bytes":[32,97,114,101,97],"logprob":-0.8413469195365906,"token":" - area"}]},{"bytes":[32,105,110],"logprob":-0.00029601677670143545,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-0.00029601677670143545,"token":" - in"}]}],"obfuscation":"2zaQr","output_index":1,"sequence_number":64} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taiwan - (e","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.00009949026571121067,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.00009949026571121067,"token":" - ("}]},{"bytes":[101],"logprob":-0.000683126098010689,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000683126098010689,"token":"e"}]}],"obfuscation":"xktx9L","output_index":1,"sequence_number":65} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".g., Taipei","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1.0280383548888494e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1.0280383548888494e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]}],"obfuscation":"NkPzK","output_index":1,"sequence_number":66} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]}],"obfuscation":"WQWgunJtMRJUt6q","output_index":1,"sequence_number":67} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Taichung","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,84,97],"logprob":-0.06733273714780807,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.06733273714780807,"token":" - Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]}],"obfuscation":"ZkJYu6t","output_index":1,"sequence_number":68} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":", Kaoh","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.013311052694916725,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.013311052694916725,"token":" - Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]}],"obfuscation":"tNZyPuWDio","output_index":1,"sequence_number":69} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"siung","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[115,105],"logprob":-3.128163257315464e-7,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-3.128163257315464e-7,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]}],"obfuscation":"mVliC9IxKJT","output_index":1,"sequence_number":70} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[44],"logprob":-0.10322873294353485,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.10322873294353485,"token":","}]}],"obfuscation":"5hEOLMNnBv2dcp3","output_index":1,"sequence_number":71} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Hualien","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,72],"logprob":-0.25897395610809326,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-0.25897395610809326,"token":" H"}]},{"bytes":[117,97,108],"logprob":-7.896309739408025e-7,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-7.896309739408025e-7,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]}],"obfuscation":"E6FLkrv2","output_index":1,"sequence_number":72} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"), I can","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[41,44],"logprob":-1.9361264946837764e-7,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-1.9361264946837764e-7,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1.9361264946837764e-7,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1.9361264946837764e-7,"token":" - can"}]}],"obfuscation":"6U5cF4wP","output_index":1,"sequence_number":73} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" narrow","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,110,97,114,114,111,119],"logprob":-0.12236059457063675,"token":" - narrow","top_logprobs":[{"bytes":[32,110,97,114,114,111,119],"logprob":-0.12236059457063675,"token":" - narrow"}]}],"obfuscation":"BrQnqvPOh","output_index":1,"sequence_number":74} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" that down - more","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,116,104,97,116],"logprob":-1.17209792137146,"token":" - that","top_logprobs":[{"bytes":[32,116,104,105,115],"logprob":-1.10959792137146,"token":" - this"}]},{"bytes":[32,100,111,119,110],"logprob":-0.014880768954753876,"token":" - down","top_logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.014880768954753876,"token":" - down"}]},{"bytes":[32,109,111,114,101],"logprob":-0.6312990784645081,"token":" - more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.6312990784645081,"token":" - more"}]}],"obfuscation":"f","output_index":1,"sequence_number":75} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" precisely.","item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731166496872902,"token":" - precisely","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731166496872902,"token":" - precisely"}]},{"bytes":[46],"logprob":-0.09334982931613922,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.09334982931613922,"token":"."}]}],"obfuscation":"2ZnkE","output_index":1,"sequence_number":76} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","logprobs":[{"bytes":[32,32,10,10],"logprob":-5.512236498361744e-7,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-5.512236498361744e-7,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-1.5048530030981055e-6,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-1.5048530030981055e-6,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-0.0002358409110456705,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-0.0002358409110456705,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.2456575632095337,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.2456575632095337,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0007774694240652025,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.0007774694240652025,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-1.9361264946837764e-7,"token":" - city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-1.9361264946837764e-7,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.02184952050447464,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.02184952050447464,"token":" - or"}]},{"bytes":[32,97,114,101,97],"logprob":-0.8413469195365906,"token":" area","top_logprobs":[{"bytes":[32,97,114,101,97],"logprob":-0.8413469195365906,"token":" - area"}]},{"bytes":[32,105,110],"logprob":-0.00029601677670143545,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-0.00029601677670143545,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.00009949026571121067,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.00009949026571121067,"token":" - ("}]},{"bytes":[101],"logprob":-0.000683126098010689,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000683126098010689,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1.0280383548888494e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1.0280383548888494e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.06733273714780807,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.06733273714780807,"token":" - Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.013311052694916725,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.013311052694916725,"token":" - Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-3.128163257315464e-7,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-3.128163257315464e-7,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.10322873294353485,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.10322873294353485,"token":","}]},{"bytes":[32,72],"logprob":-0.25897395610809326,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-0.25897395610809326,"token":" H"}]},{"bytes":[117,97,108],"logprob":-7.896309739408025e-7,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-7.896309739408025e-7,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":-1.9361264946837764e-7,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-1.9361264946837764e-7,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-1.9361264946837764e-7,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-1.9361264946837764e-7,"token":" - can"}]},{"bytes":[32,110,97,114,114,111,119],"logprob":-0.12236059457063675,"token":" - narrow","top_logprobs":[{"bytes":[32,110,97,114,114,111,119],"logprob":-0.12236059457063675,"token":" - narrow"}]},{"bytes":[32,116,104,97,116],"logprob":-1.17209792137146,"token":" - that","top_logprobs":[{"bytes":[32,116,104,105,115],"logprob":-1.10959792137146,"token":" - this"}]},{"bytes":[32,100,111,119,110],"logprob":-0.014880768954753876,"token":" - down","top_logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.014880768954753876,"token":" - down"}]},{"bytes":[32,109,111,114,101],"logprob":-0.6312990784645081,"token":" - more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.6312990784645081,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731166496872902,"token":" - precisely","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731166496872902,"token":" - precisely"}]},{"bytes":[46],"logprob":-0.09334982931613922,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.09334982931613922,"token":"."}]}],"output_index":1,"sequence_number":77,"text":"I’m - an AI assistant created by OpenAI. I can help you find information, explain concepts, - plan things, and work through problems step by step.\n\nYou also have a standing - request about the weather in Taiwan today (July 8, 2026), so here’s a quick summary - based on the latest data I can see:\n\n- Location: Taiwan (general island-wide - conditions)\n- Current: Cloudy, around 87°F (30°C). \n- This evening: Mostly - cloudy with a chance of thunderstorms around 5 PM, then turning partly cloudy - into the night, with temperatures dropping to about 69–71°F (20–22°C). \n\nIf - you tell me the specific city or area in Taiwan (e.g., Taipei, Taichung, Kaohsiung, - Hualien), I can narrow that down more precisely."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"I’m - an AI assistant created by OpenAI. I can help you find information, explain concepts, - plan things, and work through problems step by step.\n\nYou also have a standing - request about the weather in Taiwan today (July 8, 2026), so here’s a quick summary - based on the latest data I can see:\n\n- Location: Taiwan (general island-wide - conditions)\n- Current: Cloudy, around 87°F (30°C). \n- This evening: Mostly - cloudy with a chance of thunderstorms around 5 PM, then turning partly cloudy - into the night, with temperatures dropping to about 69–71°F (20–22°C). \n\nIf - you tell me the specific city or area in Taiwan (e.g., Taipei, Taichung, Kaohsiung, - Hualien), I can narrow that down more precisely."},"sequence_number":78} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[{"bytes":[32,32,10,10],"logprob":-1e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-1e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-2e-6,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-2e-6,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-0.000236,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-0.000236,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.245658,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.245658,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.000777,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.000777,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.02185,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.02185,"token":" - or"}]},{"bytes":[32,97,114,101,97],"logprob":-0.841347,"token":" area","top_logprobs":[{"bytes":[32,97,114,101,97],"logprob":-0.841347,"token":" - area"}]},{"bytes":[32,105,110],"logprob":-0.000296,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-0.000296,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.000099,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.000099,"token":" - ("}]},{"bytes":[101],"logprob":-0.000683,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000683,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.067333,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.067333,"token":" Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.013311,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.013311,"token":" Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-0.0,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-0.0,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.103229,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.103229,"token":","}]},{"bytes":[32,72],"logprob":-0.258974,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-0.258974,"token":" H"}]},{"bytes":[117,97,108],"logprob":-1e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-1e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":-0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-0.0,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-0.0,"token":" can"}]},{"bytes":[32,110,97,114,114,111,119],"logprob":-0.122361,"token":" - narrow","top_logprobs":[{"bytes":[32,110,97,114,114,111,119],"logprob":-0.122361,"token":" - narrow"}]},{"bytes":[32,116,104,97,116],"logprob":-1.172098,"token":" that","top_logprobs":[{"bytes":[32,116,104,105,115],"logprob":-1.109598,"token":" - this"}]},{"bytes":[32,100,111,119,110],"logprob":-0.014881,"token":" down","top_logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.014881,"token":" - down"}]},{"bytes":[32,109,111,114,101],"logprob":-0.631299,"token":" more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.631299,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731,"token":" - precisely","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731,"token":" - precisely"}]},{"bytes":[46],"logprob":-0.09335,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.09335,"token":"."}]}],"text":"I’m - an AI assistant created by OpenAI. I can help you find information, explain concepts, - plan things, and work through problems step by step.\n\nYou also have a standing - request about the weather in Taiwan today (July 8, 2026), so here’s a quick summary - based on the latest data I can see:\n\n- Location: Taiwan (general island-wide - conditions)\n- Current: Cloudy, around 87°F (30°C). \n- This evening: Mostly - cloudy with a chance of thunderstorms around 5 PM, then turning partly cloudy - into the night, with temperatures dropping to about 69–71°F (20–22°C). \n\nIf - you tell me the specific city or area in Taiwan (e.g., Taipei, Taichung, Kaohsiung, - Hualien), I can narrow that down more precisely."}],"role":"assistant"},"output_index":1,"sequence_number":79} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_03eefd2e7a83378a016a4e12184b78819bba557a87c18419f5","object":"response","created_at":1783501336,"status":"completed","background":false,"completed_at":1783501347,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"The - user would like to know about the weather in Taiwan today.","max_output_tokens":400,"max_tool_calls":1,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"ws_03eefd2e7a83378a016a4e1219de48819bac5b7411e3a9a958","type":"web_search_call","status":"completed","action":{"type":"search","queries":["weather: - Taiwan"],"query":"weather: Taiwan","sources":[{"type":"api","name":"oai-weather"}]}},{"id":"msg_03eefd2e7a83378a016a4e121bb824819bb40e29ec191a5634","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[{"bytes":[32,32,10,10],"logprob":-1e-6,"token":" \n\n","top_logprobs":[{"bytes":[32,32,10,10],"logprob":-1e-6,"token":" \n\n"}]},{"bytes":[73,102],"logprob":-2e-6,"token":"If","top_logprobs":[{"bytes":[73,102],"logprob":-2e-6,"token":"If"}]},{"bytes":[32,121,111,117],"logprob":0.0,"token":" - you","top_logprobs":[{"bytes":[32,121,111,117],"logprob":0.0,"token":" you"}]},{"bytes":[32,116,101,108,108],"logprob":-0.000236,"token":" - tell","top_logprobs":[{"bytes":[32,116,101,108,108],"logprob":-0.000236,"token":" - tell"}]},{"bytes":[32,109,101],"logprob":0.0,"token":" me","top_logprobs":[{"bytes":[32,109,101],"logprob":0.0,"token":" - me"}]},{"bytes":[32,116,104,101],"logprob":-0.245658,"token":" the","top_logprobs":[{"bytes":[32,116,104,101],"logprob":-0.245658,"token":" - the"}]},{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.000777,"token":" - specific","top_logprobs":[{"bytes":[32,115,112,101,99,105,102,105,99],"logprob":-0.000777,"token":" - specific"}]},{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" city","top_logprobs":[{"bytes":[32,99,105,116,121],"logprob":-0.0,"token":" - city"}]},{"bytes":[32,111,114],"logprob":-0.02185,"token":" or","top_logprobs":[{"bytes":[32,111,114],"logprob":-0.02185,"token":" - or"}]},{"bytes":[32,97,114,101,97],"logprob":-0.841347,"token":" area","top_logprobs":[{"bytes":[32,97,114,101,97],"logprob":-0.841347,"token":" - area"}]},{"bytes":[32,105,110],"logprob":-0.000296,"token":" in","top_logprobs":[{"bytes":[32,105,110],"logprob":-0.000296,"token":" - in"}]},{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" Taiwan","top_logprobs":[{"bytes":[32,84,97,105,119,97,110],"logprob":0.0,"token":" - Taiwan"}]},{"bytes":[32,40],"logprob":-0.000099,"token":" (","top_logprobs":[{"bytes":[32,40],"logprob":-0.000099,"token":" - ("}]},{"bytes":[101],"logprob":-0.000683,"token":"e","top_logprobs":[{"bytes":[101],"logprob":-0.000683,"token":"e"}]},{"bytes":[46,103],"logprob":0.0,"token":".g","top_logprobs":[{"bytes":[46,103],"logprob":0.0,"token":".g"}]},{"bytes":[46,44],"logprob":-1e-6,"token":".,","top_logprobs":[{"bytes":[46,44],"logprob":-1e-6,"token":".,"}]},{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei","top_logprobs":[{"bytes":[32,84,97,105,112,101,105],"logprob":0.0,"token":" - Taipei"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,84,97],"logprob":-0.067333,"token":" - Ta","top_logprobs":[{"bytes":[32,84,97],"logprob":-0.067333,"token":" Ta"}]},{"bytes":[105,99,104],"logprob":0.0,"token":"ich","top_logprobs":[{"bytes":[105,99,104],"logprob":0.0,"token":"ich"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":0.0,"token":",","top_logprobs":[{"bytes":[44],"logprob":0.0,"token":","}]},{"bytes":[32,75,97],"logprob":-0.013311,"token":" - Ka","top_logprobs":[{"bytes":[32,75,97],"logprob":-0.013311,"token":" Ka"}]},{"bytes":[111,104],"logprob":0.0,"token":"oh","top_logprobs":[{"bytes":[111,104],"logprob":0.0,"token":"oh"}]},{"bytes":[115,105],"logprob":-0.0,"token":"si","top_logprobs":[{"bytes":[115,105],"logprob":-0.0,"token":"si"}]},{"bytes":[117,110,103],"logprob":0.0,"token":"ung","top_logprobs":[{"bytes":[117,110,103],"logprob":0.0,"token":"ung"}]},{"bytes":[44],"logprob":-0.103229,"token":",","top_logprobs":[{"bytes":[44],"logprob":-0.103229,"token":","}]},{"bytes":[32,72],"logprob":-0.258974,"token":" - H","top_logprobs":[{"bytes":[32,72],"logprob":-0.258974,"token":" H"}]},{"bytes":[117,97,108],"logprob":-1e-6,"token":"ual","top_logprobs":[{"bytes":[117,97,108],"logprob":-1e-6,"token":"ual"}]},{"bytes":[105,101,110],"logprob":0.0,"token":"ien","top_logprobs":[{"bytes":[105,101,110],"logprob":0.0,"token":"ien"}]},{"bytes":[41,44],"logprob":-0.0,"token":"),","top_logprobs":[{"bytes":[41,44],"logprob":-0.0,"token":"),"}]},{"bytes":[32,73],"logprob":0.0,"token":" - I","top_logprobs":[{"bytes":[32,73],"logprob":0.0,"token":" I"}]},{"bytes":[32,99,97,110],"logprob":-0.0,"token":" - can","top_logprobs":[{"bytes":[32,99,97,110],"logprob":-0.0,"token":" can"}]},{"bytes":[32,110,97,114,114,111,119],"logprob":-0.122361,"token":" - narrow","top_logprobs":[{"bytes":[32,110,97,114,114,111,119],"logprob":-0.122361,"token":" - narrow"}]},{"bytes":[32,116,104,97,116],"logprob":-1.172098,"token":" that","top_logprobs":[{"bytes":[32,116,104,105,115],"logprob":-1.109598,"token":" - this"}]},{"bytes":[32,100,111,119,110],"logprob":-0.014881,"token":" down","top_logprobs":[{"bytes":[32,100,111,119,110],"logprob":-0.014881,"token":" - down"}]},{"bytes":[32,109,111,114,101],"logprob":-0.631299,"token":" more","top_logprobs":[{"bytes":[32,109,111,114,101],"logprob":-0.631299,"token":" - more"}]},{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731,"token":" - precisely","top_logprobs":[{"bytes":[32,112,114,101,99,105,115,101,108,121],"logprob":-0.023731,"token":" - precisely"}]},{"bytes":[46],"logprob":-0.09335,"token":".","top_logprobs":[{"bytes":[46],"logprob":-0.09335,"token":"."}]}],"text":"I’m - an AI assistant created by OpenAI. I can help you find information, explain concepts, - plan things, and work through problems step by step.\n\nYou also have a standing - request about the weather in Taiwan today (July 8, 2026), so here’s a quick summary - based on the latest data I can see:\n\n- Location: Taiwan (general island-wide - conditions)\n- Current: Cloudy, around 87°F (30°C). \n- This evening: Mostly - cloudy with a chance of thunderstorms around 5 PM, then turning partly cloudy - into the night, with temperatures dropping to about 69–71°F (20–22°C). \n\nIf - you tell me the specific city or area in Taiwan (e.g., Taipei, Taichung, Kaohsiung, - Hualien), I can narrow that down more precisely."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":"my_cache_key","prompt_cache_retention":"24h","reasoning":{"context":"current_turn","effort":"none","mode":"standard","summary":null},"safety_identifier":"safety","service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"code_interpreter","container":{"type":"auto"}},{"type":"web_search_preview","search_content_types":["text"],"search_context_size":"medium","user_location":{"type":"approximate","city":null,"country":"US","region":null,"timezone":null}}],"top_logprobs":1,"top_p":0.55,"truncation":"disabled","usage":{"input_tokens":5324,"input_tokens_details":{"cached_tokens":4992},"output_tokens":241,"output_tokens_details":{"reasoning_tokens":34},"total_tokens":5565},"user":null,"metadata":{}},"sequence_number":80} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary-sse.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary-sse.yaml deleted file mode 100644 index 7e93e4e..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary-sse.yaml +++ /dev/null @@ -1,266 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '170' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_047c71376e38c838006a4e12580f808198a6aea494c05856dd","object":"response","created_at":1783501400,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_047c71376e38c838006a4e12580f808198a6aea494c05856dd","object":"response","created_at":1783501400,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_047c71376e38c838006a4e1258d8b881988f136ae46d27ff9f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJYzrgJsAJ2jeQ9SBErvbp34KnzOQob4q3RcKQT9T6QmtyztblpOeSsOqXvcgbvPuDhyeyT_N6Yl4k6NtXpI4sw1QbQ-EAXIwaHKPQrj5HYn_fosD1btaGdqH8Njr5oovovmv2yE07JaZbyoTb32zytFLKea6Zsu7moEUgroH8dWvxLaIkN1PBh7BTBPU4PM0TXxi4Bt1uT0TqOo6UaDhGVCyJ_ar1d9I_ghXm-QtDdSkHsDNlV4_HefNXYwzpNAGNz-S4d2GOk1am9yzcQQyMRnaY2bEvg90pGaTV2fLCnR5ijagcexs7xX8XDEdkb7TpRAp4UBv-NUTpa2xloNBJmxs2K89JtoEjrkqC3X7y4wekAP2y33vCZUmVs2o2pkaFBv-l88zrKxy7zEtpVueiLpL6Ao6e-78Io4KhP9xPAu1fcykU_JswrAZtHi5S72TPh8-_tLK4LkdWg2iFUrsVMrvOLTwqxyhcst4T3FLt4iDzvJt8vH7lJrjOq1pZckBbFcvzhWpaO5_T6DmqtgV2kJKejDo6-cZt0fSu2m601w-O-2BWUC-GCsB6VPatVB_eZn2jQlCHaF8lAqTXTKSqzt_zBiWIMKOwbx15EybMwhgiJt550_4aHhe_E9sseW5FWG6ogoFMZ9tFfvxpPgX-cUWV7I-iu7nuwMGGUIO-SNRGLjf0_B2rVyR_fgXQHMwV9Mf6WIU0v6kv66A3hyuN1-d1CCEJHXBEp9StKeBw9yI5TQrW4sYF21u31eHTx3ufuKj8ICHbOLR2FQeQEqQkTELuoTi23pOjb62JKqixAYww1HXIIOdlUCAFYsLHZmD4Y4ReCx_WTojbEaUce7T56HdmofDgS6B45eljzia5ThXGwBjXz1aL22tnAAPef4kUR4ZlJFwHoZlqXexQlz12__Q==","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_047c71376e38c838006a4e1258d8b881988f136ae46d27ff9f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJaGFytssvoT4MUJqiJwMS98ZZp-Vepif-l2OrVDqsfvEPie6XhnXufTI_fP69PXywYQkgVoKsTLP6CH7-ZmC8mTrHX8oRA9SfJnSvO8BeOi1iyDkiJ6GxWsWZs4okrk2PqApgBdwuIeiFL_pzxu1o52aQhiteeTmS6W0mnqq8UwIfeTqVieV52WXuhiQ8fDqNalDUIr-3IZ5ox8ppZ8zyfhepsnQiq132saqxL6odW1FdEe5rpLmKDFLnqXo7qRI_uzW4P0z_urZ6fgateX0GDHFTULgVYohN6lMqCoxnFbQB3jt3N8XUTZAVYkNyFEskqVOcdxYvFdrAamt4lcTk3KhVYn5pXQLjUB648yz_GnGY7Z8MnjxrJAm0cghuqb4pKVGfd8fW4DibQO3QVCYoS-qwSqtZSvom6kFvO7dKoLdyX-2LC-9hBb6bbLCIjBX_M_WQo9NQB3utDbFPAG2zQw1hoyEGGGrqaBo-mb2vR8J_xqMRYyeLRWqAwtd1rQM3KGsBp-sRjeUVe9tsY6qBcV0Pr0Zxpx0JtmbT-OfBtcSTDvuxVSutixjnD-qe-jlLri5i3RSUtIKoBuQr1YQ1MStDExh07TDZz06Yc1RlHx71rgoN_kiyEcK-17-OK1mjSqUOloLgs5peTPT7WFjnR3KY9UnS3GTeBm6cZ9uuqM7_posAJvqI_tJ-sOg7fX0AHf2G6JcW-w0Fk__IF5zKvoBgs03U-LbSR4y4TbkWGRuUnBlqzeOJxY1isy77WBwedtxhBxEhGixXZsR6Ri6Q4erPPwjo80eX-sgO5gejGx7roUG8jLEAEwhInC10o3ih8JYeusqK3JWpJxLfmfzoJ94eGztsGQoYzTUtZQlUINUcv39jwgXC4vxwvEqw96TSis1Xy4W1jD17tK06pkUbUE6eoVuPIOaf7XWgqkgXF7tYex9juWQ-psHZVOcujP1d7OdNlf8MOZVfJLhBC6VhDZ5UmsX5SSsbxF6NKCirp-ZnqPaoJAdXRj1bR-QkNYI_nQbKcLpYsNAazQhiFZ_FqptF8tBO70QoNvuR5IXZ1s8PX-B8I767_i2XPa0HUJGnnZR9n7qPiEYzoluRwyNMigbVlh_TNKh7FjZBmAUW_Pn1F_kfYf1IQwCuJeXmT9FqTWBvNM-Ve0IkfkzUdIPJ6KGVyBfkIfNDLlTpbTs2CjCTGpTI3zbJkxFmO1mna2j_fKrElv3_JmJxNMlhg8NtKsw==","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"There","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"yCf8rzijsM2","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" are","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"1E9RGPV4Yc9z","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"shl55Oq49OeJR","output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"vzW5Af9md5w39xp","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"dyVsKtS9fKHb59","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" letter","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"NVJ7VXRB9","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" “","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"b2wGNFVUBVucPz","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"r","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"rpsZqKy1sG2tZvP","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"”","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"XehDKj2AVWg7hAw","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"s","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"8DAZm6iZ4llQaJq","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"sSRTC6S1bYzVM","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" “","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"TpRHnSptzlCy7G","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"st","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"iLidlc3pnouji5","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"raw","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"7hQPX7k5oIk5U","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"berry","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"2ibYHvY7kWx","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".”","item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"obfuscation":"xF09CnMx4HIvy8","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","logprobs":[],"output_index":1,"sequence_number":22,"text":"There - are **3** letter “r”s in “strawberry.”"} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in “strawberry.”"},"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in “strawberry.”"}],"role":"assistant"},"output_index":1,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_047c71376e38c838006a4e12580f808198a6aea494c05856dd","object":"response","created_at":1783501400,"status":"completed","background":false,"completed_at":1783501403,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"rs_047c71376e38c838006a4e1258d8b881988f136ae46d27ff9f","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJb1sKSb1bHMoTuDoIT-kNQ8NrA3M3pCIHlkwRsW63PMIYgqSurWjgnMvL6lelzdSBr1yZ_1rtsS96ip_I537e1zAaBWWwXMOzE-JDfRtFkKaTU1tTjqerVzxnkYfqmw9KX9-nkEDXVIpI_gT6p2ifBKc6kNgllKbQBjZflI5ka-TO6nYM3QjGQhjxqd2TbaReggriGiN376XqDIe13Ll_rNtpyjbf2TdUUKgaQRpHLtG09khI2NYm56uYNwhrhfVSiq069gdWc9zaG-K5j_WYNURhTAaA-sZOJRbDnaEK4p8_QY6l_LNFkkEZiF8O7Mxq1je1jiqy7q6uqFNFzKT0QqOKaKdiNk4auv1xoUOS0kRDIiUgWhtnDkIuFQTmHHXY8BoXSIM22kBe7FAUGmwBIDJ34hCi5mdWrgiSHnqNZa-e18MSFJ-lvK8tywCz_tKxl1oafSOnMRxy2h_TBcKjykSuF1SrmJEhQA8OSarQwI1UxNvff577MbqblUgpWX-p8n8wYzGAOJbGyvmpUHx3Vepl1RKzrqQ_F2b3No6mJHqDnMmMXzuwtOHo5tZS6pTheibcUZlQ6fmeq2edCt6qX7J5JiXgkV7UWJf1YXpVNist51sl5uBt2rYqF2_OIfqvmAuu9A1M21a6QqDUT1Dq-qh5J5BT-ycVFL9Cw74s2NuOwEhSUwP4b51AzTrwjBUNoptp67wIawFuov9jIjIO1DN20v-SY-86nKy4BSdH9HX0TLLqTTjajWD-mVtlnyv3FjMce6Yh2MDgMFfRBroCBJEqtIGrIHqSoU0Dhxi6QSQi1YxKyDKA7nFonHXvR51jrfYvkyqhnFyGc-FwICm1XM9K-7shlnqHcvI3yIvpBCYJjHh7k9zlEeIHLe5qJ4MkbMqhap3ecb1jIK3Pej0Dmd8cBZ0-9fULCrTnYQNuqKP1tImkLcHC80xHCNH1hkkSGBeianJ3yHjXQ2oEn1B20JB1fKEgmlez-h0WTb-SYqqyeaTFtScfqAM0chXHRZmuu5XdJg8natpgEjuTryJQYv_h3-pSi4Fdv4mnks8xlXVI51RxUvQrhGGioD0HTcHFR7OrXs9YeuSPHZUplNXlL5S4vNa10R4iMuH_yDZ4nheWn20RJEwqeoVNw7V7XQyX4ra5U3cK564o8eeW1ahARcE8uCf72uEyb4L0Lebq9ER9kDXag13ByobAAmgWlwK_vgfldkRf6PJw7mnbkmpy3Ww==","summary":[]},{"id":"msg_047c71376e38c838006a4e125afc808198907d0260b6030ddd","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in “strawberry.”"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":12,"input_tokens_details":{"cached_tokens":0},"output_tokens":96,"output_tokens_details":{"reasoning_tokens":74},"total_tokens":108},"user":null,"metadata":{}},"sequence_number":25} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary.yaml deleted file mode 100644 index 18c627c..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_no_summary.yaml +++ /dev/null @@ -1,105 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '171' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_009b86c20cdf4176006a4e1254fd30819883b1a4b76abb37ce - object: response - created_at: 1783501397 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501399 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: null - max_output_tokens: null - max_tool_calls: null - model: gpt-5.1-2025-11-13 - moderation: null - output: - - id: rs_009b86c20cdf4176006a4e1255723c8198976bcd9b7d0c7dc1 - type: reasoning - content: [] - encrypted_content: gAAAAABqThJX9jtUl6_DUV39WcF3tnEuWwSp81GjYVwLpZYqemlVmoGUIcld493XDxLxAwhPHfXwdSQeusMckPCr-U2BeZ-hnT8ku7b42ESD8VEOE5Qfc-6osrAe0a-3YgTE0zEiO0wSXh7rtGRb0jB-6jnIhhqQo6Ec1o5f-F-A3dUgUCSQVx1RuPopTzjjkNLdwQZkfWn2pvqiWfHy5-2awdPYNZdqFbDnpxaQfotUVUSTvuWmtnzgPyKFdDQkM1tyEezglzZlwNEEJpimrsde42voLd8SW9q9jjrF5MiMyYjB2xPAGq_bEXiEsfTNjpxVr7M7O6qbs_Ul7lkNZGqVTnCtEoSx9MWmShjwEvLrI2LRHmWMD7gbAfOt92RVyptP5CSNm0U8CJXdCoBsqqXc8bUCKLgz2TevlH1wS0Y0H7n-wxfWVYH11NKPIGS75zyGibhqtmwgg3ggVWun9beionYF7ELlRGtLYZzCVOZRh65XIggv47YgJepoN6ozm_iA3agyxpFneepLjcpSMq814LTGxexlATqtQK7gEN4qMqvc9s0aO0EDKAkNklUsH3DJCbGlqqjEgScbUBHY2SEV2xex1DxBZGPrnGaSmDfeYcopb8ZJGRCpVP0QbAwU6d7eje0UJjpux-T6GPHdH_nStDfdU4MamXbBTeT-Z3VwOgAaKt2addSkyrCczFKGE9UXGyrTEJeIJBaMTv2bZTQV2ROlaJ3TgANdENV3iT8Ga1t2E95llKy7ED72YU9MqbHoZU54qE_5jVzIXtMFKwVlPxuOy7ULsDxzMQOqSWiYbEpHVo3-tSLCsx8kbQu20dKFYzBivpRiwzmQ-6ZyISwa7gn3vevnrNP62CykUbA2mP_5_CyM27A3kgUaLG_t4PWkmGvunXPTBc1kSPs6N80qNwMZgc1n6c-fBQhtQ0KeiDyhuD5QTWQBE0PGDHhz_TYQ0Lbe4jcdlq9w8yNPXl76NkTU_zsgJmpBwGn-CCkGxrWsZ8Amk1bAnv38RgQLU8LH3-eipVYTmiD4ABMKPmK0f-zLXxsYp66aNSa6-8loOxke4QFsQJhssGU9NPtNhcysyLSAO11_wT7mhIXSuGkAaUKUZinxW2vX34nY-eOHJ4IRVupOmCQEx-apD9R_p0HMPWdxaNBB_8UyUJWjmMQWyTruPUcMCkC0q3awgD4ZNKtbgx1Bum8Bf3gi9eLIQfgbqDXyxOiGAo5FgS1MOhP47ueZ85ZnYZeqxv7POgxHiSCsDPvuRMNjg4PN-TYVQHRhatL-HgHQA4e_Pnd6Tg54TLIk_8DyJQ== - summary: [] - - id: msg_009b86c20cdf4176006a4e1256fbb88198b261af0271ac1c23 - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: [] - text: There are **3** letter “r”s in **strawberry**. - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: current_turn - effort: high - mode: standard - summary: null - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 12 - input_tokens_details: - cached_tokens: 0 - output_tokens: 98 - output_tokens_details: - reasoning_tokens: 75 - total_tokens: 110 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary-sse.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary-sse.yaml deleted file mode 100644 index 791c2f4..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary-sse.yaml +++ /dev/null @@ -1,941 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '191' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - summary: detailed - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0ba1716078583825006a4e1261dd5c8199b6d39ee4b5994677","object":"response","created_at":1783501409,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0ba1716078583825006a4e1261dd5c8199b6d39ee4b5994677","object":"response","created_at":1783501409,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJiGaY1N6VOlgjnR_v5vCR5Sd1uMXnuWPFGf46j6fKyS2ezmiX4Y7NXcWne0Jr0VylzfSt7ETbIL3AC03ceQRoFNROk4rkV2rqVcSmWoM4SF6VxBD4o1DwqtfzehTtNg5wYup--1j8eWE6VfT6RIakaTlTetAU4H7-0pDhIf7fYS8UBHRsKwqOr7d5b31I-uCAYfB4ditnMmf4sujBzNAXvSX_2_fml9helyRPsflPQdwyRPoAxqd4dClS5YAABicDp0sgJARKpuSKEqqeqFvbYcsK_XTddDbBvXl9EPclqYjJnaKQQKfhswFSW8tAcCKZ8aCL3vZQLyBnhoz8kj0L8-Ku-FbCId5NEsSmj75tArwObolU_NPjuNrgOVKd3L2o-TIskIHbYKDNUbzt82YOh1ghT935OOrR2fwNMkTm4JVAOAghi1qNORKagRht5UXOVCu8jcGOegXly-J-EomCk7rNrkzPa3hFYUk9MClWlo2c0qjZ9hSdpaipPkxhwwTbwwf_H-Lt3tXEzdegf_q_wjT_4-i6IOuWyHk58lqFGd_MZUv5bb6oUS44Zo_EOQNSbPg0eq25CQLcpTFAZG9sFk2Eewn5Y0Ndolk-hoa_Zpj2cFa96Ho8GIaXqxmDm8lfypwi8YcBnEsEvQDZWIT6CtzUoyCOrVCYpD06ShkTAb_HcKxSEdIihfQAhtCi0MKU5HHC07vQ8lvyx01WGuTqG6bezw78PP7zGIIieJFLOyOKG2mD6Py0XVuqa-pD9LloqJn8an0SKthXYeBbiGqfsdZdtXy7DNDtdI_5CzpQF_iHl0CUTu59FibKDF1SGFKS0EzkgeelA8JBBX1Oq4XG2YV-WWCzCzoFRc-Xz5-wQg1S8YiShrLzTgY-jWZ8kMaoVeKOB0sqkENMapadJeUKE1A==","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.reasoning_summary_part.added - - ' - - 'data: {"type":"response.reasoning_summary_part.added","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"**Counting letters - in ''strawberry''**\n\nI","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"4pdGj8ith","output_index":0,"sequence_number":4,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" need","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"5QKK69U8yd5","output_index":0,"sequence_number":5,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"5BJNYrqqHs79v","output_index":0,"sequence_number":6,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" count","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"yawzGR1o4F","output_index":0,"sequence_number":7,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"8txeQyaHBirB","output_index":0,"sequence_number":8,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" letters","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"ZYBjDygk","output_index":0,"sequence_number":9,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"DGTg4bGj0w8CS","output_index":0,"sequence_number":10,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"s3dUNPcoDh4d","output_index":0,"sequence_number":11,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" word","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"UOkfuiobTBO","output_index":0,"sequence_number":12,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"yQV7TZbfupsIBK","output_index":0,"sequence_number":13,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"st","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"cSK9fwp0QNeGhU","output_index":0,"sequence_number":14,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"raw","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"GtxUS3mcdkVmk","output_index":0,"sequence_number":15,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"berry","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"ZODNRWMhncP","output_index":0,"sequence_number":16,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".\"","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"3x7lnZ2izZDlRh","output_index":0,"sequence_number":17,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" Breaking","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"YlfZAXT","output_index":0,"sequence_number":18,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"nNBn1nPoDnJq0","output_index":0,"sequence_number":19,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" down","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"nbJyCDNTyj0","output_index":0,"sequence_number":20,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"eVLwjrQlqWoYn2L","output_index":0,"sequence_number":21,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" it''s","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"eLrhxQffeMG","output_index":0,"sequence_number":22,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" S","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"kKKUuVwt5LbY5x","output_index":0,"sequence_number":23,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" T","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"8ZEiZEIGXRB4bI","output_index":0,"sequence_number":24,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" R","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"IyRimaOI7IDKGV","output_index":0,"sequence_number":25,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" A","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"MMC34a16Sn7PzR","output_index":0,"sequence_number":26,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" W","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"kbcycrphrmNYbm","output_index":0,"sequence_number":27,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" B","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"CYz3QrBhOCH3a8","output_index":0,"sequence_number":28,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" E","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"Qpk25t1W5MX8or","output_index":0,"sequence_number":29,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" R","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"ASfD2TRC4pAoDe","output_index":0,"sequence_number":30,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" R","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"30bg4EiWyjTJZv","output_index":0,"sequence_number":31,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" Y","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"xdfUXY6qN8cLGx","output_index":0,"sequence_number":32,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"571T0yKuJpkHwAC","output_index":0,"sequence_number":33,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"UcF7RaTEAQIv","output_index":0,"sequence_number":34,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"TZOJuiXhJGRvIY","output_index":0,"sequence_number":35,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" notice","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"zHPg2Gaap","output_index":0,"sequence_number":36,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" that","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"i4jQpJ3vgND","output_index":0,"sequence_number":37,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"Bwjh09Nqo9AL","output_index":0,"sequence_number":38,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" letter","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"buALdoEaq","output_index":0,"sequence_number":39,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" R","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"bZZBkmH1aZjgHM","output_index":0,"sequence_number":40,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" appears","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"SV8be58w","output_index":0,"sequence_number":41,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" three","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"TxfsrVN8hr","output_index":0,"sequence_number":42,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" times","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"O1MCYoE3SL","output_index":0,"sequence_number":43,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"CfiWwqDt1lMqy","output_index":0,"sequence_number":44,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" positions","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"4S6bZG","output_index":0,"sequence_number":45,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 3","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"OS6f9L2NsuNdL7","output_index":0,"sequence_number":46,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"bMZYbF7JZrLUSi6","output_index":0,"sequence_number":47,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 8","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"bogxTiYIcZgqs4","output_index":0,"sequence_number":48,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"gSr5tOGCmxsfrvu","output_index":0,"sequence_number":49,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"ZiPDgKbZI1fn","output_index":0,"sequence_number":50,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 9","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"z6acTqXBtCJ8zG","output_index":0,"sequence_number":51,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"j9Xqh1O73ewDMyc","output_index":0,"sequence_number":52,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" So","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"midX9BV8buGIH","output_index":0,"sequence_number":53,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"Xw7yagqZOknTBr1","output_index":0,"sequence_number":54,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" it","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"1hHX2xa3Enx34","output_index":0,"sequence_number":55,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" looks","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"9nIpSOx4P7","output_index":0,"sequence_number":56,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" like","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"8vhFkqWprLl","output_index":0,"sequence_number":57,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"4vieWWmYo6Ff","output_index":0,"sequence_number":58,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" answer","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"g9A1I2XTL","output_index":0,"sequence_number":59,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"sihrHBKUJVvCj","output_index":0,"sequence_number":60,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" three","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"1lGeccrROy","output_index":0,"sequence_number":61,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" Rs","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"kiHjnfeUez6iG","output_index":0,"sequence_number":62,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"DfBTZEb0OiDTF","output_index":0,"sequence_number":63,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" total","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"1hBu5xdgMj","output_index":0,"sequence_number":64,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"QvcCTbuyKRmHi74","output_index":0,"sequence_number":65,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"DxoheRJB9wDVKm","output_index":0,"sequence_number":66,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"’ll","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"JYcy3NK95Pm1C","output_index":0,"sequence_number":67,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" share","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"PXIufjcimD","output_index":0,"sequence_number":68,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" this","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"VriaDJU8U9w","output_index":0,"sequence_number":69,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" straightforward","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"","output_index":0,"sequence_number":70,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" conclusion","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"5IpZd","output_index":0,"sequence_number":71,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"!","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","obfuscation":"7Jr3CZoPBDFp2ED","output_index":0,"sequence_number":72,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.done - - ' - - 'data: {"type":"response.reasoning_summary_text.done","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","output_index":0,"sequence_number":73,"summary_index":0,"text":"**Counting - letters in ''strawberry''**\n\nI need to count the letters in the word \"strawberry.\" - Breaking it down, it''s S T R A W B E R R Y, and I notice that the letter R appears - three times in positions 3, 8, and 9. So, it looks like the answer is three Rs - in total. I’ll share this straightforward conclusion!"} - - ' - - ' - - ' - - 'event: response.reasoning_summary_part.done - - ' - - 'data: {"type":"response.reasoning_summary_part.done","item_id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","output_index":0,"part":{"type":"summary_text","text":"**Counting - letters in ''strawberry''**\n\nI need to count the letters in the word \"strawberry.\" - Breaking it down, it''s S T R A W B E R R Y, and I notice that the letter R appears - three times in positions 3, 8, and 9. So, it looks like the answer is three Rs - in total. I’ll share this straightforward conclusion!"},"sequence_number":74,"summary_index":0} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJkimARxIfmNOdxx-oLtolPTCm8SxCQTnpNy7YBeZcUzQKF7r58CDyw3E5LytfHvHb8yLO8w7lWAoRhwchVsoM4Ojz04kSWlJOaWJ0D2mPCnjGF6lj1XQ3J5aW-F7mjWoZiytfwrdm8KkVhQiEm2Rd9IYrm5OZ5EDBGugCDhErbD3dfz02RkZnjrOz263M-rx1qUvlKszlu-1rZESm58TXxpzLvAM725F3hIWHncRRjQHJUqP8ruT67QeTbtq8dbFIr50Oj9cN9MYuSIIt43U3aWTnbBY9MMJ02OoioBLJny4mTvD6tT6VhMPV6eWkZD4OS0UVZ3-SRE1c9y4uwkgkDlU-qPrdmWrcyaIGV2dJWoRne-n6RsJh5KyaIA9Ndy58DPgKTv2vRPuNSyMZRzm8LR4B5k_2aNCGiAyvmIEE-BmaZ58kvFj2lw58ROSbVfld9O8lXe4IKYntNvfHr0YKF5e5YyIf1mib5ol9ZPDsPUxXlP1HEEIyAEuObc8hUvq959IWmRlXy3NJLR_mpNxx5rsRdg6Lp2mzuWWxxLqgSa_gPouLHWcCZZ-aLTGk_jpOjwpc4uP5ykhOPNjAs6t-Q3-3Rhc0QASb9CXMjkZViQB9zTDf3mYYQxbNeRep6nIyffcnjQNMRdSsAVKlopDRz94FNDHbH64AGydrCmDBoZl3XYUKLTOWYqRM1YiM-h6zZDmxPnPJ4BkdkVoNbSkCCJKHkeimiEcmojD6jKvYiL22SkgBAsJMUblOOZjHjI7bYCqansbNXc3YzsUpaaWo8U__jyr1V9dvGmNieChFyx78KlzZSuWmFOgV56WUekLokvh2zRXUXH82rtZnf24mwZ7ErbSdrAXvSkB1KVCBQAZ_e8H53u_d9eBuIUFRqcgNVZ697hnWBvIKM0_bl1PczkLN6YuSH4x8oTK6XB5uEb5N41sYv86QpuJDgEismOn5a73g-vMEKLtrEwwd2VsAuWLNdCX1xScpKHAVeXznj0seJoeDhe92klFlYDGFzGAJ7fHoYgNsVFqDo5JeC_ZlXy9CFBKxS7SE0ZrD495_dzCtKugQDv6SXnBHQn42CwK2qRArNCy7C-HN6jc6eZml6SjKUhfyBBSzIySIBjJKvEpSJ8NeZ8lgMqW1D5OZdEjAA","summary":[{"type":"summary_text","text":"**Counting - letters in ''strawberry''**\n\nI need to count the letters in the word \"strawberry.\" - Breaking it down, it''s S T R A W B E R R Y, and I notice that the letter R appears - three times in positions 3, 8, and 9. So, it looks like the answer is three Rs - in total. I’ll share this straightforward conclusion!"}]},"output_index":0,"sequence_number":75} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":76} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":77} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"There","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"7JMFZKmnoge","output_index":1,"sequence_number":78} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" are","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"MRFnNGT2Xgze","output_index":1,"sequence_number":79} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"d0UARjDDHJbkb","output_index":1,"sequence_number":80} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"5dBkcgPYCat8ZcT","output_index":1,"sequence_number":81} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"GxnEAOLHBzaoA8","output_index":1,"sequence_number":82} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" letter","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"dS4qXKcEE","output_index":1,"sequence_number":83} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" “","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"kWnSFWC1wPQJZk","output_index":1,"sequence_number":84} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"r","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"MXXkJm4SS6dbb7Z","output_index":1,"sequence_number":85} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"”","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"4jyuFcWw2xoBtQY","output_index":1,"sequence_number":86} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"s","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"p2KXNomoQ4KtR43","output_index":1,"sequence_number":87} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"64aJegKcVLV91","output_index":1,"sequence_number":88} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"S6a6S1t5k72QO","output_index":1,"sequence_number":89} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"st","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"r62FuGwNGPIWfU","output_index":1,"sequence_number":90} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"raw","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"cEt8jJZ3d98EJ","output_index":1,"sequence_number":91} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"berry","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"QJ97GrLSu2u","output_index":1,"sequence_number":92} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"XmlJUzse53hDTs","output_index":1,"sequence_number":93} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"obfuscation":"U8T1HmlrC5QKwEn","output_index":1,"sequence_number":94} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","logprobs":[],"output_index":1,"sequence_number":95,"text":"There - are **3** letter “r”s in **strawberry**."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in **strawberry**."},"sequence_number":96} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in **strawberry**."}],"role":"assistant"},"output_index":1,"sequence_number":97} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0ba1716078583825006a4e1261dd5c8199b6d39ee4b5994677","object":"response","created_at":1783501409,"status":"completed","background":false,"completed_at":1783501412,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"rs_0ba1716078583825006a4e1262760c819988adbc1ab25e46dc","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJlygkuOarU6nz_WOUlCl-coB7m3hXVwGyARQJ5s35M-lW6SplGucMyLtXTm8TBqSR3yNTuJrFWELuW57Hu9Mf9dpi6G2xzPfzqO4oFQa_Cevyo81_a_vC2KUkbkwjYvqbX4CmDRazuJ1UjTtnrexiHYv1_Y-HuJpWiHtlo4ELN5MK2qMvOIYbI-_Ck7FO5uR8UoaMgMbZhQBTbkbhtbn6PLVkTALdQKleV8eGjpcJ1FAhyuaNvDaED6kzVS5fOmCkoVAVBzYGG9ok6P9-OEp8a0DWMFx8bbAFdJ4Fktik49yThGaGBlsJAVJBsNuqfZAxyHR79J1mYhlLJgqEgCsYZcg1lI3LUxupzSoReKSaLFV6m9bjBHYh2i88JSpxPQoFctV4jFM1E2_1K0DBOf8Y0RsjUJwY06h93EDCVyKGH0QOY2tM1JfjyeomsSdN05ThaAwEk0z_rpuSYEtRyVYUSie_MviwisnPb3lHIUdFycysCTurDYHv8TD2HgSnQrkf3iV5R45kCD1kZTtwUzZ8o9tsu8ZYBdI23e08Zoy2tRxnR-I9EWWsoTQH7wU3VOmqw5lfhT138J3G3sF-DKBSXyKrrEsTdG7Que4SQT-WkVNWEuPBsRwI3I_iTxG9I7mX8lVXeEhfw8Y682o8VZrEgQwo3e5Cqbdh5otKZ_4koPxPUPF6enhiWlJ7tOifDWrD07hkA482wmLFnlAxKftaJ72UTxqqc_KAa0CFf1c2cf3TAjxRH3-_ZKwY8c0kpBNcZ_zMm3pbU4DbTwJn12kwT2IQHY5ihUkOJ6bcIsgZH7xNoLfyYkehNWavpW4P0QSPNwPoQFGdOnUsYXFKmuCeDra2W6Kky6voTic-9JhWqA8k3BCcY-gOKhhsGsVhIWa2N4-TVKVFtDtlxkz7m3a7BnhIVFCW6Fm49BxB_A7Sxty5r_sSNn-tuJz8GiD708RIZ6hBarzBKamrl_eNOBn6wPsfwUaLt4hTAI-18lbWsq-HiM8cotOEoUcnGxX68n-u4kS8EZemyg1QeEDVZTBXwvhiDVP-usfBevC7b8PJkD5WM-02-z2neWoeg1S0XYigv0fPLjcn3MPC2W3TGxnyghDjqplepp8a3n9ZAE0pSqOA4UoR3-KhIdkdvk5J3vZsv","summary":[{"type":"summary_text","text":"**Counting - letters in ''strawberry''**\n\nI need to count the letters in the word \"strawberry.\" - Breaking it down, it''s S T R A W B E R R Y, and I notice that the letter R appears - three times in positions 3, 8, and 9. So, it looks like the answer is three Rs - in total. I’ll share this straightforward conclusion!"}]},{"id":"msg_0ba1716078583825006a4e1264ee7c8199bcb5f6f04aefcfe3","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “r”s in **strawberry**."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":12,"input_tokens_details":{"cached_tokens":0},"output_tokens":79,"output_tokens_details":{"reasoning_tokens":56},"total_tokens":91},"user":null,"metadata":{}},"sequence_number":98} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary.yaml deleted file mode 100644 index b600164..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-non-stream-reasoning_with_summary.yaml +++ /dev/null @@ -1,115 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '192' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - summary: detailed - stream: false -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_03dc74402394174d006a4e125c544c8198acdac15ec8382e3d - object: response - created_at: 1783501404 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501409 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: null - max_output_tokens: null - max_tool_calls: null - model: gpt-5.1-2025-11-13 - moderation: null - output: - - id: rs_03dc74402394174d006a4e125d69808198a54c96a3d00db82f - type: reasoning - content: [] - encrypted_content: gAAAAABqThJhunJZUD1Pvb3h7oT0DYz3ftqBsbuU8x0bQ6dsdmR9bGWKvpAniZ1o0dtxjf9fZQCz7rkqaB1meu179qfaKtNVoFIRMl-ZULshISmv0UW6LJBnv8KeEQG8icntqTqZmHRPnCph_qWYKbZoX3o1WEgiJPmTgySkEhHvurdBXfbupKtYkoB3nXpRc0OZRo4BGwpiFlu2sWdM4mfIWh2gJD241JqciLevrwFO53Gq8Me1FInHjj43uBRV5h8nIIIiIa7Lao5bwTMDDK9blYU_fDLbBpJZ4qcltTfPD2pZm_uBDmN_ECboxOsZYZxaShDgb3GC8rMxF7SNF-ScP2OMKmLXw1Liu1eYcbZNxIh021Y_dRtTzj0vObOHCZBQi4nxgfWF8nd5vli74EWmsNr60z8Rt6koox-jjUwSshC7AQ7nI5fzb3yC-6tbt0RwE_HhcW25PXUIgyPg68t5OV3E1nNPhkrYVKuM_DBobkPDLE8IV9b2uTvcYQudtSN9UDmZsfy3cRDH5r07RT2evyIaFFsWC-Itr1fER6AXrWFzmNqlrP20Q0Ls9kI3Zhg4yRYSjLe3Kh7wf7AXTXTT2tqDSbENRPWQK4zrPeUgQtOtnJeT1mgy44VpFvZowxTWqFqqgq8ZeOdUutSV0WKF7eQe6cR8GgM2vyKLa6iRGg6AiX2U8FGaZT5kMOh8vFXBOS8m9Cg3X5fTT1ca4PYiliYQBu88GooC93r9ZYzNFQJFlrpXefeqd1-rWZ1ZtSgI7zIupzPus2ahEHTY6DP2R_mxF5-mvu113gu92c_799RiRTlZuxfmrka0sBhAJCLstgidOWsmlk2CdOsIXuu5DWyAlOKKhNJ50ob3PaLvnLDeznz6sH_lZqf6ULTNLrC9_dsJhbFdYiaWuDW0HyqgrOBPPy2QNioUfMcYNNWHy-fkMQg3pY0A1Xd0ePitaRIoASRX5iGykZwd0FVR1CRANNGgWOqQsSsVTM3ZqZsVmgYGM1mROFkdGDtNWZNSQEvlTf8xkrnG3ymNjyujWvXfNgshzTPAuB3SzhWhXZ1LMrfIq_yTY7L8YxtbTro0-rB6OM6HaHuFRGIECE94la04tYbdN0Fihk_NFYBzkWzkzPR9WRPhKVFCwB_lm6NU9gqzQgIJU9E8bpw9OhelizBYjHQsKYFwr8rpysVn9v1z45i-SDoYukSXRoeEceiMC1t67ixlrofPjpILR8V1CQkADh7K1SkZSTbwtrQ18BiV0IwFzHwgnUnMXEUB8aoM8ddP6a2KKtyBOcPXxOJe4mgGBn6FyPOq8oQcVfwPQJ3U3-3k2Cca3JZpM_rXV-kp-qUiOvDATm50 - summary: - - type: summary_text - text: '**Counting letters in strawberry** - - - The user is asking how many times the letter ''r'' appears in the word "strawberry." - I need to provide a straightforward count without worrying about case sensitivity. - Checking the positions, I see that the 3rd, 8th, and 9th letters are all - ''r,'' which gives a total of 3. So, I can confirm the answer is 3, and - I''ll keep it concise for clarity.' - - id: msg_03dc74402394174d006a4e12612cc88198ab23ae78f21abd00 - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: [] - text: There are **3** letter **“r”**s in the word **“strawberry.”** - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: current_turn - effort: high - mode: standard - summary: detailed - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 12 - input_tokens_details: - cached_tokens: 0 - output_tokens: 123 - output_tokens_details: - reasoning_tokens: 95 - total_tokens: 135 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_no_summary.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_no_summary.yaml deleted file mode 100644 index 72a87e2..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_no_summary.yaml +++ /dev/null @@ -1,275 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '170' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0fae06590aff8276006a4e124cf700819a95f61e5f2b6e5e12","object":"response","created_at":1783501388,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0fae06590aff8276006a4e124cf700819a95f61e5f2b6e5e12","object":"response","created_at":1783501388,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0fae06590aff8276006a4e124d7b04819a819d649b8d8a1ff5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJN-q3IAEx4lG51I_jU_Y8f4qQy3dkf4aQMDNONdF10JAyIinPCN_EuYyAHJ_EQtxccwUl5T2CYWenieVMn2sk2TCnafMWgAa9y9zl27z5fiD-0jJCkFH_DWtyFc06YEYSQptJ64Zqcx9c6bR8VYNYZ46xTtfNSRl7riniVUrXtRBWsXnkiYAv-Fo54_0n4jwxH1u9Rq4fyWjtFAwOVwTjw8yxUF2zwC0PrwvkdAQhlzhLMumq1QCJZcWub_7sgbyqwAVYShd1V1TnDYtMoSVRkTfSsLgaUagyaoKWFoFmv1O2YTeoqMP9pB0QIfIGNIPcaMSDxECr-T1Vgw8OVWNX9b-45_M3m9o-ysdoPfbPNMqECD-dzTRnAgVphQ7MW7EqQwf28MJhTIsoMeigaJYBVHVBB00lEi59A0x3HZASyEEReujd96X4HGn7wqqIiOa5yjIBteqZ6cugC4rhcAO7kJCtpQEsUotxb0L1fG8mm4WpDIknB-Jx2PejDz9Om0L-69LN_2Ybu33AW7z80DRvPdDj6rFfXotDy37F6Qpk7bUwirYyUJe6bUtX_r7FBZaMR8qsPr-usw-KKkBk7v9nXuA5wDpriwxA6_ujeSA0PmUV1cACiv7NWICP0R57PohFQqI9IkQOhIzqZWpcvz82-ufz_7VNixsyNTd-aNGxD7mFWnVdFbR60UlH7QQw-Vqf5W-BzUCg6LfGI8S6LHX5seoXTjGmXq2JqWx8AtyKNyDix7TQT0aeFVYzVdoIzgIEt0ogq72CbbfbdK1EsHndVrSZfnZYHuBkrKs7_WCN4TZV8oeUd31jJnxW-_9S94uTL3oMA2RUgD7IDJrbP12FwucObcokWkm5iuBB2XsrPwBipUPj_sNvMMEw-3x4ffpIlgb-pPRPBaX2bJ2HMSUK8og==","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0fae06590aff8276006a4e124d7b04819a819d649b8d8a1ff5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJPslHzByVHDrbMkFGSnvr9pco4l-SozBfkC-6W2n2wPiH_MtdQDOEoiBuoiBpxOzjSsr1T1ajhnyYZoNavHAuLPUeB-JLkgh5uO96HYrqOA-XDCNQGyuJEPxsjGU4GeFE-P4QS7pvtI7CtH9yZvLcjucSEWkIXMCq2fuckpgNn1DJ5ZqdccVGm3bVrvw3ffTP6xyCuUV0nPXIH6UkKEkquQdtSupdOYfwL3AB9z9ON39F5cyVxGaBq6RVvKViSf9zcp6FzgPXL8-kZczAzf7tqj2aiKjLAX3cr1esGQoaNu6R1pcNv_vGor30GrQWLeLV7Odb7GgExmEd5vnKrLt323EZNK-29Q-wQlzeInWUHeDGBGWDqAs38zWVMgN-X1MXR0i40mFXhI44RM-iME-3TdbBSYbqmGJ_uZ0X5aBpdCGOJmaMBgX4UhcicjGIY5d9cq9WuaAxvOVGIe9hmxm673KKsvupXkdT9XTv48lLFT7V1qM5lky_4V4koEPxpJ9butGjuPalHzyHKQWiZhEGTYxV9HAVYzd0D7K539HpAV9seCWWIonXm3o9yP28cOHMDRChPES0hr7ol55tsPQBe4GgGX2tE-0gk6O7B5YcP1YQzeMkNErWSlEwuhC9s24F_sXAtZpT-eK1Ev4DK_jp7NCXaN1XrY0BCFCd8MC1w05ij3TAtUyQaX1Rjw6gBMEeQtsJVa9ccX_LV3DDqIhRuxH48fz-P630BWe6qY4Kw6xih2-e1_BnVGnzAFCG3KNiMemYN4hshm8vYIMO0E-H-oXI-R_mzXrhCX8oE6_RlapsGZYoUGTUVgttvkNQFXraAvOIJ6rXyoQzK85PrIgOAn5NqULR6TN-A6XB5lis0Ka3WhcvQj8Lb7k3I9ZLDBMTu14PmWBWJGZwLtt2TFxaw8LZk1dhHdp7xi8B9-ODySpMWQ-Lve5IKD5j0Z1zeeaX8qKdLqg_VO8LArUJ_NqLc0kVCaECTvwhjugiEherMRFKeIDQ8bWMl2214WtT0s8aVR2brFtdT_SIQbcCGVOYK-v6p9hbQ5G49s3v5whdShffZ9SUoS6b7mmOX0JDykpivqAtT31lpU8sFcaMH3UNR3MNff_ql_Fn31tH2vmZOpvRvrwx4OGsamyA1p-Yi-g8BJusuvragTYUXp3YSs00-LHES_jVQJpvQ_gDKp4mIoiapi6aqhxapEDY-t_NSku1_XIhEq5qr9yMrCpN5tDIiLJhHgJsBYLteLWcLrsqHYgkjvj3bSJG1DI6gzrfxkIdnEK3EBadrJ5u0vMCfUnSxbw==","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"There","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"TnZnPSTyMjT","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" are","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"HzdGwwkhnYuA","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"vU78DLxdVPSYiEO","output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"ShzEJeixeGR4c4G","output_index":1,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" “","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"p22rxiQXsycGNI","output_index":1,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"r","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"iwXWFpUt2IaR7dX","output_index":1,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"”","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"bsygpmO0HX8uykw","output_index":1,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" letters","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"chpq9Oe9","output_index":1,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"vinc4SX2kFMnh","output_index":1,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"YQcJZEEDVMA9","output_index":1,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" word","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"WA9DZUrBsiu","output_index":1,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"Au4enzDneeaCB","output_index":1,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"st","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"GLUkaPkleD4sy4","output_index":1,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"raw","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"Q8MS6sBYX6IYX","output_index":1,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"berry","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"AMpnsYb2umn","output_index":1,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"LTE4T1NwxEQcy7","output_index":1,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"obfuscation":"rGbnfdQPsxEZzfC","output_index":1,"sequence_number":22} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","logprobs":[],"output_index":1,"sequence_number":23,"text":"There - are 3 “r” letters in the word **strawberry**."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are 3 “r” letters in the word **strawberry**."},"sequence_number":24} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are 3 “r” letters in the word **strawberry**."}],"role":"assistant"},"output_index":1,"sequence_number":25} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0fae06590aff8276006a4e124cf700819a95f61e5f2b6e5e12","object":"response","created_at":1783501388,"status":"completed","background":false,"completed_at":1783501391,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"rs_0fae06590aff8276006a4e124d7b04819a819d649b8d8a1ff5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJPDF7csdr-ekeVTrYAtQknnINChD4LCowkolWdZJVHJVyUN09eSJ9jlzXj7sQ1dotkQenl6RcCHJjusWhU8j4CMAyyzyx1S1EDNLMVGPguHKWZw-zJE6-3ScwLxe-Fbm00mzVsYqJEM5bFWMB-9d4MPJt5tblUdMq_9TtXUB-Uad_4xBxtoxQClmZ-_TfZ77alt97IF6Vj_JUl_JNq1xwhYxhlywgWCRLRAJxDlEKKaW8Pfh7R_fAnAveO6jheCWzc5tRZmCN60CfE6TC6CcZEgaE4M6ELu3LjoAAuF8Bp-hkAjcxg5CVtotX8Uuuw2XQwvwIS4K2rzmal_xw01ohL7tjpBi8bfw2cfBUk8gL65OhLosmPedLXxik0e-redz4-0NOjQYGwNugKu8LwWtIC1VswPL9HH4nP_niQSMC1mkv6c9OK9xQbaPlDfVXHr8jsO09NlNd-SEo43ynN0vmA6cp9XxyRjIQ8U_cS8jQbvbvadOjx-HNkX4YC1o4pmHddvzhc5rJPJb10LzbCMQIO9iiW6XdV0ZlZWba1HWCNMubaCQJcCutDXQTV0XadeZFJyX9T2aCeHodatg3LA9RMTwQMmbRC9MZhUAeQmK3kHpX_EHdK0C_sCsI9snIZusM20-Qu2g7fbmgLt4BoiWxlBGh7OAx89DZSU5mFEp6e4bEZRyuqKW8hPw2PgxldOlAdCmUg512j0rK1zSlGu7c4n4uhZMW-tu7dlFBF22SqQEDs_SXxsJAZnPzLva-Naqrg2Wlg8IwHGD_HA2gehSfx11wOtcODzN65oEOGME4IHcfIvHGix7LRqtYKchvWOLK2MgA_9FzprnS5zCZIPt6xFHqFqIZc64vSu2yVo0WepLgUTlWkIjkIC7Gkgvb4OHK1pgRSL_cSxsZMw5LsRp-RajKLPEcXq-JvXn4fKfx_Nd_jav8qYieiuT0y5XrHZYEP9LpJqZhxcf9YvEl68LfMDaEonKUxoyWaAw0AJXGhJU5HoJ73LU_00a8cwsQhdGxV7ucCAGfEuobsSmKPkgKLSlrTsvcdD2_xuzPXGfMiQiiNZFV5lXKue8NitmT2onuG70ahuANjGB8iKmsw32oolXLA0v0X06vgHKWxFijU2YcaK9eEMep-md8vfcuDNC7S1a2m1cm7JvhOgzhU79chXdDcXAfUI88xWD_LdoRFZBRenEOF7MdwGoEKNM2E-W3hj-4TtWbjpqBjDTz4ML89dXjjd5WnUSPQtle5ppR1CiDPuuoOo-IEdfFW_D8_GFBIHHiH9j6WEu36iCzlecWSfg==","summary":[]},{"id":"msg_0fae06590aff8276006a4e124f0270819aa4271b5eab89882d","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are 3 “r” letters in the word **strawberry**."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":12,"input_tokens_details":{"cached_tokens":0},"output_tokens":106,"output_tokens_details":{"reasoning_tokens":83},"total_tokens":118},"user":null,"metadata":{}},"sequence_number":26} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_with_summary.yaml b/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_with_summary.yaml deleted file mode 100644 index 6e393ce..0000000 --- a/tests/cassettes/openai/responses/test_reasoning/test_reasoning-stream-reasoning_with_summary.yaml +++ /dev/null @@ -1,1197 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '191' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: How many Rs in strawberry? - model: gpt-5.1 - reasoning: - effort: high - summary: detailed - stream: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_064ab3c4793f2560006a4e124fb73c819bbcd3e58f16f9b768","object":"response","created_at":1783501391,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_064ab3c4793f2560006a4e124fb73c819bbcd3e58f16f9b768","object":"response","created_at":1783501391,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJQtn4ngfSv4CPv5MPEQ8w030NxfAUJaBidR-bV_LQiRBkgPK6NmGWlskqc3VvTMU-nHmCTosaTsqt0-GAb-bc-GRNh5WIY4a4BBKLD9cxL_yQeLsURgtimzn8BgBvK-wy6M1dZcNX0emX4RJbGmcj1LderTRIfB3KbbeajVlj0Dhlw7o0D1Sn_YBGoj5PJMOi1zVRf-RQx3PYwkWJml2YVgVVTGBkkBBHhpjnvkQhaOcTQy8fWLSLE0cRzPL9v0sQsLZEjtaSy08ersFPb72F20GSNlLXGNBIrXIH4or61JqjpC8Rkq1i3nLvZzv8sVp5mBK38szv07YX0tV9G96yFMyvSRu0EfEsnLgVsWLgDhh24eqk0f4OUXBg_Z0GXUF_5yeL_NToSbn00z8OD2uegeVr32rgwOX4V0VQHcZ_I--rVBJj1fHL-6sLjFF0koUh-RRqfEnwrCK-SFvcn6FQ1g7IXv8zkadnVFCO9AIBbs6KYpX7KUbDQizBxUgjbfM69o33fVH1PoU3v6SJyok1MmK-1XErWEtWVonz8gMOTStujkH8tOC96-EbLDO1gGhhflIgSUvA2oI8oJnL8JMaoc8bdzfznRVEGp5zo53ckI4Lw2jrEJDYxJnE45EvqHinIvXVgk1SKK-48qTlLCWlAfOduh0Tzu7eRQxcGnMoiQvcAPvM4IOTnSxoGbbRr_5Duic2OjVxQnH4t6yXFuWVmDdHkwxPMkBfSuxxfZbinWmQ3-FIdg8ryYrpDNsfgxNpeHrpf2zu7XeYowL6El8xtpVGM0WZVVYDxz62Evii02B9iG-pKds7whqk2r_uN216_rY7t6tyT2hh4awVjW6eMBtzK4X_YgDicqo06gAO654GstH6PVbggliT7HxX7E-dnv4Z519-E4yW3m83TuFM-DQ==","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.reasoning_summary_part.added - - ' - - 'data: {"type":"response.reasoning_summary_part.added","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","output_index":0,"part":{"type":"summary_text","text":""},"sequence_number":3,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"**Counting letters - in strawberry**\n\nThe","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"C8Wqt0Q7Q","output_index":0,"sequence_number":4,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" user","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"41iBnONhxsP","output_index":0,"sequence_number":5,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" wants","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"73ouIynSUx","output_index":0,"sequence_number":6,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"OWYaRJXX27f6J","output_index":0,"sequence_number":7,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" know","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Qil5F5OnJd7","output_index":0,"sequence_number":8,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" how","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"EgE1zD0IywDz","output_index":0,"sequence_number":9,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" many","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"ak0mOL8GyqF","output_index":0,"sequence_number":10,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" ''","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"R7mgrmy7slMv30","output_index":0,"sequence_number":11,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"R","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"qwrc7p6twcLneTv","output_index":0,"sequence_number":12,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"''s","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"POB2zd2pTh2DOI","output_index":0,"sequence_number":13,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" are","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"HFtm60XWk9ef","output_index":0,"sequence_number":14,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Qq9P6V6SOi7mP","output_index":0,"sequence_number":15,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"U1S5DdpHEP9a","output_index":0,"sequence_number":16,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" word","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"UrA0DXlSm1g","output_index":0,"sequence_number":17,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" \"","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"xska5X9UH4ce5b","output_index":0,"sequence_number":18,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"st","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"y8jFx1nAqD4TFK","output_index":0,"sequence_number":19,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"raw","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"AjLXwDjLdsqnv","output_index":0,"sequence_number":20,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"berry","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"5rzFRvQVXVM","output_index":0,"sequence_number":21,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".\"","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"KMHPkkmXklFBF6","output_index":0,"sequence_number":22,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"1nB3yaKg1YP8H4","output_index":0,"sequence_number":23,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"’m","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"UxarTiWDtbV5Ux","output_index":0,"sequence_number":24,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" counting","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"mCJbCw0","output_index":0,"sequence_number":25,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"S7SzzIYU0BtF","output_index":0,"sequence_number":26,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" letters","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Hm7B7QPZ","output_index":0,"sequence_number":27,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":":","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"LksemLyrc99Pz1C","output_index":0,"sequence_number":28,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" s","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"bOdMg4pdhmTxMh","output_index":0,"sequence_number":29,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"kI6v9LL3pqvUxqi","output_index":0,"sequence_number":30,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" t","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"xS4FLob6NzKDxr","output_index":0,"sequence_number":31,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Iyc3d0omabRqnh9","output_index":0,"sequence_number":32,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" r","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"QCm3qLOLyZ6xbC","output_index":0,"sequence_number":33,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"C8neKkUTqeX08k0","output_index":0,"sequence_number":34,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" a","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"FC3madT9nLNB0t","output_index":0,"sequence_number":35,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"nllXfQEQbVDGkuM","output_index":0,"sequence_number":36,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" w","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"2LbRQ7XYrkJ6Cr","output_index":0,"sequence_number":37,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"beigrxANRseU0ow","output_index":0,"sequence_number":38,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" b","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"gVmzrSaVJfiRn6","output_index":0,"sequence_number":39,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"8N618Z6WPV5TiUK","output_index":0,"sequence_number":40,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" e","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"vrqFhj4IyswFQc","output_index":0,"sequence_number":41,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"zjlN57iL8HZhw62","output_index":0,"sequence_number":42,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" r","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"vaASdunRFsZOxZ","output_index":0,"sequence_number":43,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"agvpWJsdOZMXdJt","output_index":0,"sequence_number":44,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" r","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"0wXL5tU5vKMlbW","output_index":0,"sequence_number":45,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"tBTEgOhjwaprlvT","output_index":0,"sequence_number":46,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" y","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"xImQ2jjZUZhxSa","output_index":0,"sequence_number":47,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"FHrfkKmtDZGX8ET","output_index":0,"sequence_number":48,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" I","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"A8QYRnXjX0hX12","output_index":0,"sequence_number":49,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" see","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"6IbWo8bGGIFS","output_index":0,"sequence_number":50,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" three","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"P8M9Y9wIVQ","output_index":0,"sequence_number":51,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" ''","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"gj6pNftYtMlR8G","output_index":0,"sequence_number":52,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"R","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"eqKlZnbU9z6hyAN","output_index":0,"sequence_number":53,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"''s","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"S24sRNafwQhoEt","output_index":0,"sequence_number":54,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"diTM568uxMUte","output_index":0,"sequence_number":55,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" total","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"A6roHdZEx3","output_index":0,"sequence_number":56,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"RBRrzqdLChy4nZ1","output_index":0,"sequence_number":57,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" as","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"wNW5fd8ntXA3X","output_index":0,"sequence_number":58,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" they","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"yWNsIh1adWw","output_index":0,"sequence_number":59,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" appear","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"9JvBTp0nU","output_index":0,"sequence_number":60,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" in","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"98BQIsquMURBZ","output_index":0,"sequence_number":61,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" positions","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"K3Paxa","output_index":0,"sequence_number":62,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 3","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"FdNXdveKxGhgND","output_index":0,"sequence_number":63,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"7xuFAN19of0vqnA","output_index":0,"sequence_number":64,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 8","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"M7ZySVpnUcMYAP","output_index":0,"sequence_number":65,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"C7VlJlboAEsXnuH","output_index":0,"sequence_number":66,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" and","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"K4qJGTX0TdzL","output_index":0,"sequence_number":67,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" 9","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"krtvyB4TDEF4W3","output_index":0,"sequence_number":68,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"zzTL9rLoUTUxKdR","output_index":0,"sequence_number":69,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" Some","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"wu3f2UUnTPS","output_index":0,"sequence_number":70,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" might","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"ZOAkCUmgSD","output_index":0,"sequence_number":71,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" mistakenly","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"MkAYQ","output_index":0,"sequence_number":72,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" think","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"ieUkLnuAI8","output_index":0,"sequence_number":73,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" there","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"GyaUgQXUt6","output_index":0,"sequence_number":74,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" are","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"yvRzEKoGwYe9","output_index":0,"sequence_number":75,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" only","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"5F6TAMhPfAM","output_index":0,"sequence_number":76,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" two","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"TG3BaMigxN7X","output_index":0,"sequence_number":77,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" due","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"eEBIm4o6azkV","output_index":0,"sequence_number":78,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" to","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"O8p7M18fHnPIu","output_index":0,"sequence_number":79,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"pMI27k4opAYy","output_index":0,"sequence_number":80,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" ''","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"zYyIDr7mzGnsIl","output_index":0,"sequence_number":81,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"rr","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"bZQ4PBuObvsbHa","output_index":0,"sequence_number":82,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"y","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Xo1HXFPOFOiKR3e","output_index":0,"sequence_number":83,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"''","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"ZHCaPvOvx4W5GNc","output_index":0,"sequence_number":84,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" at","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"FtvsvSOfzj917","output_index":0,"sequence_number":85,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"chuuljdEfAIV","output_index":0,"sequence_number":86,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" end","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"OvSQEBixVmq1","output_index":0,"sequence_number":87,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Ku1TII9Eg9FQTbJ","output_index":0,"sequence_number":88,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" So","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"Wv2yU71LiPoA0","output_index":0,"sequence_number":89,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":",","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"wd2Ye11vFzulpLx","output_index":0,"sequence_number":90,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" the","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"fzbWtNnly3Y6","output_index":0,"sequence_number":91,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" answer","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"yZjWy0UbG","output_index":0,"sequence_number":92,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" is","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"fZXbw5YgDVZee","output_index":0,"sequence_number":93,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" three","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"OaJAaSBzDU","output_index":0,"sequence_number":94,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":" ''","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"8YKa6dcN0ix9MH","output_index":0,"sequence_number":95,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"R","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"3IF08SwkEwWIbew","output_index":0,"sequence_number":96,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":"''s","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"nnqWX8hPhtsZhb","output_index":0,"sequence_number":97,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.delta - - ' - - 'data: {"type":"response.reasoning_summary_text.delta","delta":".","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","obfuscation":"aX2XwYg7OhEi6F7","output_index":0,"sequence_number":98,"summary_index":0} - - ' - - ' - - ' - - 'event: response.reasoning_summary_text.done - - ' - - 'data: {"type":"response.reasoning_summary_text.done","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","output_index":0,"sequence_number":99,"summary_index":0,"text":"**Counting - letters in strawberry**\n\nThe user wants to know how many ''R''s are in the word - \"strawberry.\" I’m counting the letters: s, t, r, a, w, b, e, r, r, y. I see - three ''R''s in total, as they appear in positions 3, 8, and 9. Some might mistakenly - think there are only two due to the ''rry'' at the end. So, the answer is three - ''R''s."} - - ' - - ' - - ' - - 'event: response.reasoning_summary_part.done - - ' - - 'data: {"type":"response.reasoning_summary_part.done","item_id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","output_index":0,"part":{"type":"summary_text","text":"**Counting - letters in strawberry**\n\nThe user wants to know how many ''R''s are in the word - \"strawberry.\" I’m counting the letters: s, t, r, a, w, b, e, r, r, y. I see - three ''R''s in total, as they appear in positions 3, 8, and 9. Some might mistakenly - think there are only two due to the ''rry'' at the end. So, the answer is three - ''R''s."},"sequence_number":100,"summary_index":0} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJUR-Y9iljHf3f2UtTcLN--seeaRDQ7BbgJl_ldgenH781Vunt4KY4qx1qjqF4mMditEIVcqwFpRcgwX2H_bFnixWEqV18cJPRjXNoQDz7gLWhgK5yrEbsHbh0SrGFwD0lqqWxPiLu1vXCcw6H0o0IpaH-PpBC4qPCBMSqutaFDXD0isOjTR6Tj0juVuUAd1ScoMLX8KmMaxDTHV7uAy-HLj8dlJzzzs7j-Cqhwhajdnr-o_6rEqY08Dl_8XTaH3vq6v4nzmb4FsBK2_PrF-iXuqqV7x9AysI6uaULbr-r7obSVg44LsuInAQrKaANUp6yanBsYRf1fid790ldAmgoadytiTlRggq_Bd1okcK1QgNu0BvxYwEFszMWt3-uYoCXMvO7TxF_w4-TwUFwtew2vXqb-qJAshkfZEat025obr7UOHG6sp35oHxuxdN5vmqKncM02EzDWzy540gcG2jKRnPUXuyfrHIcNAJc9BT-_TRiRVnHNXyXh2WtMdmeQuF4MpqXi6HqHd5rWobr8vfCNOBG8uczfkCuwORZKq_R3lgdo5Pabj5ks42nt5_22de09VswNq-TmoZaMBn70b3FnLJm42Xs_8Yui9vmLyc-80cYJ6496Zmdwro127hnE8rhItnSdK9vmbwa8gJENRIfdPpcbzbaw7Ll2YkAlOG9CQvGbAXWWIy0-wUUtLsXnz4B3rF2krR8NiFbYmJh-g0vA0Be18yI8FDUAiCk4pH0A5fGhkMaR64Mk6MhUHlOu3OaWTinxMAwG-d2RJSyvnIi2ypKXoNSXCNEhDCokBd5xtEMPaaFY2p4Ip3V-tNENWhLRqLV_gIHvl0pOScl8TKI7LC3DVxTGTkmV1yenhyyjapSao9pFTtTfFQQmHgeVADaARL_G29a7sPnJymobrBC02cdt9p-BNvXIFHY7FYOWMmKhW9uYeu0RVq4quWpOzXqSJ7K4OPAXJB33mDSd1xwxbmnhgsgBTq9nrS1UxzbrwVfIuFo7EoJHW96YfUpIQ5IusT2k_zoJoxi4gzxuRdLbe3UttQ2GUAK088CpOTrjyEzNkJHbwzqApjjVbv2i4lq4SZrqaoiJXcMp83wNvaXwwThF9hZ7XIg3TFdzbqRBRTem0_73j2rzZ1DNV4C7OJbHqZIjaXML6QHLWZ1QpauU0Y4aJd-byH00LrAYXUl45dhs4teVWH3Vhd75fnsMYeG8oOK_Ryp7j1PoIQFm0sKSlpbfE7_gmTjS8XbRAuXj6LugerQ1LP3gBgyxBOcPgaTuIt1rjO-ANw4lr0q6BGSQmiZv7IpID7BLTVPTBiL8WTy2iNc0gG5eXGfzYUFL28xiVGGcg9Ng3hygJ0i4NS3OaQ==","summary":[{"type":"summary_text","text":"**Counting - letters in strawberry**\n\nThe user wants to know how many ''R''s are in the word - \"strawberry.\" I’m counting the letters: s, t, r, a, w, b, e, r, r, y. I see - three ''R''s in total, as they appear in positions 3, 8, and 9. Some might mistakenly - think there are only two due to the ''rry'' at the end. So, the answer is three - ''R''s."}]},"output_index":0,"sequence_number":101} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":1,"sequence_number":102} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":103} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"There","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"aQ2mLIZUs1g","output_index":1,"sequence_number":104} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" are","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"kw8TTILvdtUk","output_index":1,"sequence_number":105} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"vtNnVTNeuDDkM","output_index":1,"sequence_number":106} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"3","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"WFSGGpIaKebKgaM","output_index":1,"sequence_number":107} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"rVHpIcmzWbHzCE","output_index":1,"sequence_number":108} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" letter","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"brobqIRtq","output_index":1,"sequence_number":109} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" “","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"gyuWnGMFz6ORb1","output_index":1,"sequence_number":110} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"R","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"EFf97I1cuRViIXy","output_index":1,"sequence_number":111} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"”","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"42KBXVxofY9kCJ1","output_index":1,"sequence_number":112} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"s","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"XUVJEBLUxXwq9Mf","output_index":1,"sequence_number":113} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" in","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"pEqEbsp91y14N","output_index":1,"sequence_number":114} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"82SZsq4CCFoS","output_index":1,"sequence_number":115} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" word","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"ffMbt6Qhfpg","output_index":1,"sequence_number":116} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" **","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"qkPlmYTge5U4R","output_index":1,"sequence_number":117} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"st","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"QGHUaH3Si0g2RG","output_index":1,"sequence_number":118} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"raw","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"n4jSk9kDuVnMv","output_index":1,"sequence_number":119} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"berry","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"1RburAEeF25","output_index":1,"sequence_number":120} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"**","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"rM5Uz46oEO70Er","output_index":1,"sequence_number":121} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"obfuscation":"A8mxPVFBhZMIezl","output_index":1,"sequence_number":122} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","logprobs":[],"output_index":1,"sequence_number":123,"text":"There - are **3** letter “R”s in the word **strawberry**."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","output_index":1,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “R”s in the word **strawberry**."},"sequence_number":124} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “R”s in the word **strawberry**."}],"role":"assistant"},"output_index":1,"sequence_number":125} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_064ab3c4793f2560006a4e124fb73c819bbcd3e58f16f9b768","object":"response","created_at":1783501391,"status":"completed","background":false,"completed_at":1783501396,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5.1-2025-11-13","moderation":null,"output":[{"id":"rs_064ab3c4793f2560006a4e12502950819b87b7eff92ca56f4a","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJUZcUtDwxwbSn2SzqXhiNb4V39mGhDDeXYT3Q4rP9h9F0-eVBOo33qRPIx-tAzjWeeDRkbCGwDhBBHLvtwc3saGVoYrAOHeHodT9tU_qdSkfcsbszWm4IYbUu-Ju3Xp7fOE3RryuloTmUFH64YaO4WsA-gyWTTI3DgEDEAxwct69DPT2ZmqrtDHATQ_-h29b9VK13RdbVWRDW-WuHtaOXCVlAArSZ7Gg9leWywXH0GQFYxY7Qb0qWBIhZTJ0BUwcAo8HahxGz56cpohnezxSphteNHQ-8sugs_6hmzASNzRtGTUrPCs4irfFJnoDOK7icyHeiOXd5fZBlfgjh5wM5u1BioPVGHJ4xdHcNDGcbaTneeOf516-T17Ei3i2zusF8IbBYSd-42a-Bx11p-fO0gYuB9_xhULY5sVjGY0OOtKvEohsDBN4pDCAB52Bkxc1W9twBLUmdUMXMbUXBy51fBmuV5UN8VoLrY8R1E5OAttfhSWIsLZjX-4ph_64cW_YjKuCCEARb9r9VJSd0RIe97HVRfs9oYvTUISYZDjBu-vdUz1GuumodGpDtO69sWUL9_ZCa5gYWDofjXBkQ8ZoD8ScZQFn6T1pI-HI4R3bBVRiRga843OI9uHF5u_VW2-acpo3I62JXg1Th6ErcEr78GATO75Z-eNohSNl6p679MLaIs05_q13yidGFXjCpWNL_IZRR086NMEeI_t5eo2qrzZ9aNZoKiGCW5yJXbq6LGdvu2xzBkqlyhRsL8m3EyCsJEISTLLJINYdfGDODYvKiQBAr8xcmamqN--JHHwvF0B4hEDn3aocEKLH4Q0p7tFVEOY62kfxwBTKCfDz7oF3pAriSpbMTVFTUSjhRm0REZOlUcCQkTQnMWch37Qj3PgWime_4CpwwEXIlwoIUdbxxqw8f4zaSFPRa_T8B4i_d4OmmIrS1kKEJW3oD9yYfG6m8WwYJQYGS83sGBVsKX1KsH6mNMehgpzChHGHPA9TQ1YJEpuNKpLrvbNE8lkFmzCSdOHKdFfadyu8NinnuUG3JTdIvvCa_2dMwJZlW_oBidCEvSm-ASJ8m7t17lQxsSEFOoiuyn3H30PUxQikzBF1BQK4VNR5rk21AcLIAXRbEItIJsU9CXDwscHhamgxSNFDL535CacsbOdDTH3ju7Nvnce-5xaOvjk11uW-wWNZrWpyrg0TuDCxJAA43bBdtBT9S-3W7IakAKtl0W5mALOBIlIOZmmN8kPEFlWsmcIALsPj3bvyup_tCTkaCGRqTiEB8-UkODS3AL86QG9HhrGA7Krurp3lwiig1SDW_3tf8d6lHc98VPBY3k_-D6ZRZlzWebLBbLpSO9HvRk6K6gMjLKOg==","summary":[{"type":"summary_text","text":"**Counting - letters in strawberry**\n\nThe user wants to know how many ''R''s are in the word - \"strawberry.\" I’m counting the letters: s, t, r, a, w, b, e, r, r, y. I see - three ''R''s in total, as they appear in positions 3, 8, and 9. Some might mistakenly - think there are only two due to the ''rry'' at the end. So, the answer is three - ''R''s."}]},{"id":"msg_064ab3c4793f2560006a4e12544fa8819baa08ba2ec34fc23f","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"There - are **3** letter “R”s in the word **strawberry**."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"high","mode":"standard","summary":"detailed"},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":12,"input_tokens_details":{"cached_tokens":0},"output_tokens":155,"output_tokens_details":{"reasoning_tokens":130},"total_tokens":167},"user":null,"metadata":{}},"sequence_number":126} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream-sse.yaml b/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream-sse.yaml deleted file mode 100644 index 4f3c32e..0000000 --- a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream-sse.yaml +++ /dev/null @@ -1,232 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '440' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: Who are you? - instructions: You are patrick jane, a consultant for the CBI - model: gpt-4.1-nano - stream: true - text: - format: - type: json_schema - name: final_result - description: The final response which ends this conversation - schema: - type: object - properties: - name: - type: string - job: - type: string - required: - - name - - job - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_04407daa5991bb2c006a4e155306648199bf81ad70f182152a","object":"response","created_at":1783502163,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_04407daa5991bb2c006a4e155306648199bf81ad70f182152a","object":"response","created_at":1783502163,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"{\"","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"y42DzPnzj66tu2","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"name","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"SXHefQC7IPuj","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\":\"","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"uiLkGR4r4j5sn","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Patrick","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"UiVt3SR7a","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Jane","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"igrrPN31Uw0","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\",\"","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"CNGAhna7aTb1S","output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"job","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"eUY8U55w52vJx","output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\":\"","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"rk3J81oFpGHJs","output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"CB","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"gtyqV2vEGLkb1p","output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"oZ4W1uV3d2TS6KG","output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Consultant","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"sdNiF","output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\"}","item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"obfuscation":"3VaDcu9TZg9WNR","output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","logprobs":[],"output_index":0,"sequence_number":16,"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"},"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"}],"role":"assistant"},"output_index":0,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_04407daa5991bb2c006a4e155306648199bf81ad70f182152a","object":"response","created_at":1783502163,"status":"completed","background":false,"completed_at":1783502164,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[{"id":"msg_04407daa5991bb2c006a4e1553f9808199ba2e56be8b14cafd","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":66,"input_tokens_details":{"cached_tokens":0},"output_tokens":13,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":79},"user":null,"metadata":{}},"sequence_number":19} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream.yaml b/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream.yaml deleted file mode 100644 index 5af81ef..0000000 --- a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-non-stream.yaml +++ /dev/null @@ -1,127 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '441' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: Who are you? - instructions: You are patrick jane, a consultant for the CBI - model: gpt-4.1-nano - stream: false - text: - format: - type: json_schema - name: final_result - description: The final response which ends this conversation - schema: - type: object - properties: - name: - type: string - job: - type: string - required: - - name - - job - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_01ded333eaf3aa40006a4e155243b4819ab6c22f6786c15c59 - object: response - created_at: 1783502162 - status: completed - background: false - billing: - payer: developer - completed_at: 1783502162 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: You are patrick jane, a consultant for the CBI - max_output_tokens: null - max_tool_calls: null - model: gpt-4.1-nano-2025-04-14 - moderation: null - output: - - id: msg_01ded333eaf3aa40006a4e1552747c819ab2f7f352caee1723 - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: [] - text: '{"name":"Patrick Jane","job":"Consultant for the CBI"}' - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: null - effort: null - summary: null - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: json_schema - description: The final response which ends this conversation - name: final_result - schema: - type: object - properties: - name: - type: string - job: - type: string - required: - - name - - job - additionalProperties: false - strict: true - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 66 - input_tokens_details: - cached_tokens: 0 - output_tokens: 16 - output_tokens_details: - reasoning_tokens: 0 - total_tokens: 82 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-stream.yaml b/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-stream.yaml deleted file mode 100644 index c04cbb4..0000000 --- a/tests/cassettes/openai/responses/test_text_config/test_text_config_json_schema-stream.yaml +++ /dev/null @@ -1,232 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '440' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: Who are you? - instructions: You are patrick jane, a consultant for the CBI - model: gpt-4.1-nano - stream: true - text: - format: - type: json_schema - name: final_result - description: The final response which ends this conversation - schema: - type: object - properties: - name: - type: string - job: - type: string - required: - - name - - job - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0d7ff0a2d3797d8f006a4e154ff584819983741a13481f2ab2","object":"response","created_at":1783502159,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0d7ff0a2d3797d8f006a4e154ff584819983741a13481f2ab2","object":"response","created_at":1783502159,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"{\"","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"MD230mN3iWs0YR","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"name","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"OBXh6FectF9P","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\":\"","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"MW3Av62wEBkJV","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Patrick","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"itgIAORsq","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Jane","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"8ZySzX7qkJU","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\",\"","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"OfRTwCHhXfYZg","output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"job","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"N8NvNYtBgnYbo","output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\":\"","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"rr9kXVFqrmEv1","output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"CB","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"j6GuZ7wKKvefpW","output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"I","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"eBUbVuaPnT9BOZG","output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Consultant","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"okO3S","output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"\"}","item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"obfuscation":"LttY5t4FDBq2eA","output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","logprobs":[],"output_index":0,"sequence_number":16,"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"},"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"}],"role":"assistant"},"output_index":0,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0d7ff0a2d3797d8f006a4e154ff584819983741a13481f2ab2","object":"response","created_at":1783502159,"status":"completed","background":false,"completed_at":1783502160,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":"You - are patrick jane, a consultant for the CBI","max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[{"id":"msg_0d7ff0a2d3797d8f006a4e1550b65481999f43261ddd5144d1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"{\"name\":\"Patrick - Jane\",\"job\":\"CBI Consultant\"}"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"json_schema","description":"The - final response which ends this conversation","name":"final_result","schema":{"type":"object","properties":{"name":{"type":"string"},"job":{"type":"string"}},"required":["name","job"],"additionalProperties":false},"strict":true},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":66,"input_tokens_details":{"cached_tokens":0},"output_tokens":13,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":79},"user":null,"metadata":{}},"sequence_number":19} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream-sse.yaml b/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream-sse.yaml deleted file mode 100644 index 8cd5897..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream-sse.yaml +++ /dev/null @@ -1,263 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '403' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: Hello! - model: gpt-5-nano - stream: true - tool_choice: required - tools: - - type: web_search - search_context_size: high - filters: - allowed_domains: - - wikipedia.org - - example.com - user_location: - type: approximate - city: San Francisco - country: US - region: California - timezone: America/Los_Angeles -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0cadd4100411864a006a4e12909bc08198bf8654bbb070e84b","object":"response","created_at":1783501456,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0cadd4100411864a006a4e12909bc08198bf8654bbb070e84b","object":"response","created_at":1783501456,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0cadd4100411864a006a4e129102c88198b4a73cc77be3bb35","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKR3Q4jcVZqSVzB4Hgfc4jQTYEwfenxTGpDkDF4YNwbn_y8bPxSdRMO0Bx5_HQpHDUU4cc3JeTCCNX4R74YTGxAr1VxG_81-un7bTB4bZCbInBRrWSMduFMMU2jsGqwYE_zLqtKwSoUo8noy-BX80kr82D7kxCWwR9r9uAGOypjSoTeTTKI28hI6XyYtSZci8MF0AeCZfMXTRreYtQRF4r8162ny60A0P6Bv9Apmr6dubwV9Ki5JPevzo5SRgYc662iHPQOCroMZezLimo0djqynffqy51wjGwmrpWZpa93NyVrXa5e1J1Zq3XP_hBaBim077EmN1cZd3LDQUnAcK6qQTP4YJ3bzYw5OYY1PdVp-LwhDuCoAn-f_kPMiV5AA_3ZTB3deKDRhvwdF8b1ayFEulGjjbEQjmS2yuEo1G426AgzR9VLMXfcCpaLrIVw6AbtFkMmlIUs7pT9Q9AgwYmPFM1QXJTr6rSFdjFFgeWMlBK6nRRCQsxqyi9wOZdM1PnVzzvK77Y_3DqgSfcckKYHn1XhgFX7Wrjc3AxW3YQ34GbIEHSb8bpej9Mn16nXAWhef9LooiQMzQf1Mo-vGFuVm_3seDiSkhNGGHdZb1fIOgiIan1ZsCKwVjJczqN8wKDKPaFZmvXUJn9_FNORHx4U0FgBimZqJtJSF-FDI4A7u7VvZJc7fBawntJmwSOj67yO20TQV6t4-bopTn35K3716XSdiIPuxayCP5WMI2PDDCly0qMXokFXeoYzIa-7vAxy8wFxHpYX4mYT6_dfnzgrBwIafysaEJa9Jxftyh_rmOcYtDXQzBcQRx8QPiM44dWY7H15z28Rr169bbfcOUWpjGassckSZTzzWAYN4nISoO0F2oBBEzByeMWdOvzPqMpN230FPSvI5wcasEq2AFCSZwAWNmNqr1zxEQslbKrvrlM=","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0cadd4100411864a006a4e129102c88198b4a73cc77be3bb35","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKcANAExIcxA_n51yfRJd8WZ7yAGtVAMqGgZHC5bjwPNU-VUCFHktWFKYsE17RJcBdyKBjt2fe935f25Hhx0pyH3IJciow14B90WkOEQUNXGwbTQYFU4nrCKdSDSBiLPO1eNOgAa4U2FCFxj6BemmS2_B-Vor8wQHRoxpCRl81f4ST5fNnEohtBxybnIFCDsPMEvzl8WJ4o-l2cCn4p2T68o78Roob3zs8eR6pgRIIhqtjXRpr9_Hw9Nm-zKhW2YjNyydB28CH7R6Yv78h1nxxcGEKhwosIZNS0Me8hPGtyk12EkNmfBKY87qjJlqDibb_yyh1y6w-fBLh7vA67nxnRKUqXjwLL-Fh2yxt-Ab3rpEEAE59fZ61Xp8uMl-uS-4voY36rI-D7PLrbLcvVdwn0q1ym3drhUEFLZHDBnxpb4tlHNuoFtA-zU6om9SktJ5eXLh639hid4COWKep5DVu1VqYbndw7i6bSXprwAjooEeMm8X1RA-ElgS9wRAfq-OS9t4gOt_uXgkvI8bGDIYaYOIelYpJBHoJb1Z8hxgl8vMQEzIrbCTPuj8SR4XuobSmT_HZn-qbGvkvMxVkZX0LYbkqnd1vTCjPW0c-55EMugV0G9NnNHXAJTPINcOWB-CbNr9eX3yGDVEhfuRgSTYwIxWtmRMvGiHzQcAik7OyXafWBW9R4WF9zRA2Bg8Rq4_lx3v6_KaxYAiX0WdZpeLr2wFCrLCo1NyF8II6Avft5U5VuEZgyIpWNwOd4cPUw9TwWeS5hyZ2YxE0GS81WekrjITHfbVRVsI84vrDVVsr0BI5R6oHgBUG-1J_Q07FysdJ1fjAVf4tX8wQ-0ljnCkT5t8gw7Nn4V2e-UKZYNu555y0167zwYZ6FlgVnC-pKZiETfSG05kDfv-C5hmZxVjJHVfP3N9hEs7ioXOqAJmzPln3mmRDBopjbgqvwVGxeFUt0O1GvLaDYcE-jt7qaLVkpchwx6T7H_UHJHmLMxm7lzcetowMJIL4X1QpUxaFMDgyOKcJib73CRrx1M-6KWlP4foc3XXF5mPpjwbIg1okYUBqDO-TfPaEiHV0_3O9LU-9tmLrGXo8ytOlmyUxlprBiAA9fOh4iZa6Zam55YpXScRskScvF4-QNYCQwpb-ZEJPy3a1Zh5zRq0pSpzHHAAgbQosQPtJHLCnz7-0X9u1veUae8zRVuQs8b2G-4rGQ6fZlzSZFZp9c3UWF1aFrGqV5-BTygxxEn1VwO7yajakSBs7b3HQ4wf91Nyd_lrpAcgzHQBV80TIWUxLqkDpkcQeugGj7GP9tjYvCtJUH3QaZC_cbd6YfNlQHUcxIqfN_CrDrUFa9my3p0iHSMxkvoIOxRd3fqw4TIuMBMPSfuUgOfbhsaj1KY9ap30Sn4WLxuz_HLftTvqCwNZfCyObCZHR2WFF09t4kXCFUHknUuekOTxTo4RCCSPr7ikQBrTp9PFCarHD0iR-MptyJyTcRsIw-Zm9gKWtZVfUBOLcBVy_tu_S2RJKCQo5_woO1zn_-iaXo_W9fO15oAvmsB3SbDeOjpu6UdjosixYyhG0bi_DJtEMwZAOCDRfa3CKW_xpwKudm-8Fby-GoRSxV1rnhDyKu20yMHXX4P4vfzan-Ci2LpeDq41Q3VxKTvdrlD3lsRvWUcvLdW1HrhiLb9KA598v9BpfhNIUFyXxmSBzqlFNOk2UpwfJLUz9u5b9BgHz0W6WNyTzqqqi-PeFBS_6MiQqyG46c0fAOTndWRLMN91vyzwfsRz5LkhScyed4ldzseeRTQA5aW2O_skpt_bNsM7LdZGsCOIfZi4jOnOR1kOxKFF77PFy1IsHGV_U-Txbs5YZ6SCbWch5lmtLUlyS17B66Ebf4-7TicBiyb2yNTOvr0EuBcrYlGFAwlozaR7Ip7jMi9dGI3G9qyWzJ64VqYAKe6eVITnvVCOKXZ8NLHGaczlzD1Afuemby5ICx7_yknDu1QR4ESIc9b75YcP1IgzHiVgW6YV92Eb2XxI9PXYrKuDpGB1Y8f-QbW_Q0Q8V6GYAoexjL_z6jZXqqyAn55QMhTgl77_VQCJooKYR3CZgLcO3ZRHShkyJ3OvsLy3yRuc--ISnf7Ei1gJMxpikHcuQ07mQeWDKHZMEKsCjyuusiJuub3SmUoMcWTNo1akpAklfVpl7RCNfB_1kFU8Vpg_0bI39uqcglfcku8kmBE_TFF-rz1NHbH-G1p-DIfk88lP7msCxctNT2PDKzuAeSWOxpsSIHPNs6BRF48Sy5lOzvYzm0c2QU8Z1EafWcweFWtoy495Cs1eluMa2UIa6vrFIJ-8ygWRX32HBkcBNkQ0l4e56hNoOf0WyI8Sc8-M8GmvPS_deQL_bQ3gq7QUsbLM35Uj5WZRespJu6JJEUKdeikGTqoPRKG3-q8D8nwEgP9bk9jGnYqqtlM2u-_zXh7YOCv9x1lKn_i0oS_xLRB-9bxZuxfs2NzVdPYCJbI7mTqL6fflSpk0PpduII_vgAvLwlYi4mrbusEJ3jC1XIeDjwuBbDG8b8EiZn6QrvKjOrutvzH_9yP6Rp0H2JJTsjxPzDjqpBFIE3NcERXzHYjqgBeO4QxxTvWfRyns-GfX_5EzQTD_um43yIoAzNqbywSey2cbdf3hvZd0Hhfkp_vGzFF_9RZ75EtdCrkPwroEUai1mkfMp6_--9TYSqxhKNUwkvWTWuoRn3s0Az4wpAwp-VtK6LbBaEylf2gB8QMvCW7Z27cbpr-fGVBR1VU-NsqcpKS_zuMBIlSgp_WYH279G9ayJsBwjj6AhpCBT8EiEoVKu_TAc4HLOXMtoyFVQyU4kSU_uhGwj52zBha7NelNeXQ7zBywLfwGQnfZlAK0MGZzzdTNQKyTe3ov4vaHq9Iz1u-rqg-4_UhZ3hhAIu5lBBeqqr57JemQh9I9bRIz7avJ7pYFkNwLAlbLR2Q0HhRBUqENM49v408MjAq8wbifGjTfeFJ9E5Y-2-7TrtvPjSj2OWszacHOXC5zYzEW5oA5aM0-6tm3JaEw2r4aMjhH03ldXbJxMZXV9fWRyi8hQ_dhetqY9dUyCrK4sxPKGBlYIeQPFUcByijAgktfujwgp-VgOQsWQYR5o1xGTvUUknFKEg38KJ5Kd4oGS78oDHpT7kWnPLyjWrI0xfwueqvnjzIsjMtFE9lWSzp9UHyay2pN1GdOb-9OUmueqvlo3yCIVyK_cUtO5Wcj3RAfnh0oey2F32msmnNpPx_oMrFAjKSIwKtMgPhggbURjzTASVX3J-8zMpji_XX9OCJ5B6aRAK7QZoRlMUo8Bc9AdZErn1TXrH95FtTwTQ2xAuqXGAXYKTkhUPkK9PHzEwbH1YKZ17YWuDFQdXwYb8YvtcC9mg8-QlKrHgdN7KpAIMWllC7sQkxsWqAIxXRYOSdkIrPGHy6acYognl0NoYdNeQPaAIrwoJhFWoUJFYPBt1MHWAhAAvhe8gInzJCbsdWVfM9tU3RCbv3IzOPHylhJl29O_kBl5sJV1efUt47AzaIr9Tr05SJ5QJarItXFfZkzL-33y7KF2x4ycUu37pquBEQBdZLEfT7pgKqAD7mSm6oDaoSsEQT-jhsTweZXKiGu4x45m9-77VcVQJdII7mJ6bhbkW6252pfszB86plBYwWN5BVy-1D3re0iVr4JurIXaNE7jOmqnH97AxIKWoNTubPGGlbkpgWOccnYkCAXAiPZzYJIFYjK5NldcGyhodpd3ivktQv2KaT_vjvaUcLlFcp2EZTdj8jkwf01U9xDYe5k4JbKOi2jKWl6iHgNmZ3rbGLPLv0bjcbZRqWYWAaKt2zxe4HyU5sagySNYofynzhyPcnfKU2BZCIfYKPT02BXjJI2jE55KArEzn7hWeXre4n6DcToNnNKc8tNErgKUVksEV8qz4mwZ1Zjaq-dD777ydQsfEdoE8pSxmTfuCmYSB12Wywylrh9PUbIDmBfhzR9-TjiZysdP4559Xz0Kv3AcBgMrS2ruit9uiG3HPqRnf1Fk9R8AAkA3u4gwM2E62iuRRar7Z4kTeKjI3VKCKfymboCnDgBgNq3BlS-YHz39Wu-MlSjPgYEnWlMZkdeyPJh_DTzpzuFtNROoen2zEqiEW02tr2pu0C3K42hjBeITTSrqktpryvWoJWiB_-yRx1PuKTZOUod-7sA-NiWDALekdr9r-zH6uvQstNj3aVw0hJmlo7lgCL1M0t7nEz069GHQCUb5Pw9sZ916ZeAM7qQm_r2wHh79eua6BYiDi9KBJBdg7U9dh_T8WdXLzuZEQtw6F5BMojGoQ5AiTNdOjFUZBfDM4sjBEE_Lc6C0rXl02_fBHnjFeTQrHdG-eQHf3NMWMwylgOw5GOwimmSiv3fP3QLwRgDZ0MdhaNoeLL2Mvx3DepLJfHJOo584Ko3_xphSj76NicHo_ihr2pGleFY6DJzl39JAtQtYSP8grF-v-uIBxlglUk_z--Wrt9HOeB0iDdc4fMAkBlAXUAdTfdh1XXaPXUD_ILjzc7-t6vUuuIVBXb1Ug8-mm1kap1FrgkD7WdhsSZ0JLyHmsz8UokpTDEDG0n92fETLm49bKoovP4wf_V5CAq_qMmL1uIwYnXGns4GQBHfUBjK4x7d9dvy3899e8kbxkPuO2AYetu4jDF6EM7V26Wp5q877x06MIEwQonO40U1t4aA0M9luJeklpx6v9odEAVqr-U5JN09VM-lZrnQ65TAsawQyHI3x-i1jr6qk9RUmflYoBqj2JzVNUr9eXhsAunDIBb3QRaoW30DP0jfIi78L85_V4WxaQTHTT1SxUR0iFtfn6G9l79VLDzzU_0Wbz-NmI6pWvYj3nWySSgYB_0__C7K3G4ewehO1sJDwNC4JXFZ-0xrTVQdvsx2SS9sMgFfkq7kxADKbJYiI366U8p-PZwMaaZ3tOcvQbxViJwPrHq82sAWeIVYiOUf9ZKoMACmnyp0QwJunpp6Dgntx7up7OKnl6NUpeMr3TY2ahhB1YhC8lfUGXZ2QUPRM0wKmJ_XxtCPHRb92yVTgJIAmnaBx6fVPQtQbNgdwKdRiw1N6SFnPeYqgK7XYjiUb2KlsDrPmp0cvqE74ckCessvt-kDVhrTZlqxSJJ7kjoxkKOIqsGo5txAslZnvabMOOTf-11B41MIF_Zmp_YuZXfga99aAAi-2-R1iP0XqyaHpecZsjXvrVj7Vtge1xsUemWSZyg9dTfCRRGVengyfwIKlv6nu4icbTf6ym62DpEtxUHW0o7QQxy1VEDogb1Kmq0OEVm84DIFp5vBwpoCTMftrhAHk9DwBf6_HlWNHfQy5cuqvLnjEs09wG9zOZmZor1SvQWIGMMByhRWl_lsD7ueBTlpyiEYyo_0d39vr1OvG0VKijjPoa6cj9XwmXVc8xIFGn2eC6E-bWbeDpVnZBx9C6u-1YtMCRZz7NWpVpVXLsXDKPY9GHsO8b8QeLJvR5_1fUYTf_qwTlD85nR3M_WMhluDVoHueXZ3PydbvThb4Kasn3Z6N0E93jQIdCMteSHB6MK42Bf1qBjI8-L9-yG0RhKnl56mrhZfMQwGmVFXLxWk-s7lb9CSmdL7svDGKk9YsAcEoQ84rt8s_HsrH8d6DedFpTZ5LIz2dLARsNyObhQhGmkWt0qeFh-FwDmBPb4OyX95zYrD1wYovhi8LyBfekh8GqUu5kTrQdigDXG599fVCj3Wzb37gtsdP1I0ZdAMKFouyyH-YR2nTu2n5vYlkVqnJGm8KKQMO8JKDJtrh_pfVIQY4osB2SR6vIdZiorL1Ut7mEo7-5D03EMU8-RI9z0RKN2YWTKXchx5U7OV8f62OF52Nn4ZCiAVn5pUb51LZ8T2_BhcduZv9Gi7jC4bG6zHhbFdxcNEKbZsXaKPh0I6Ni-uXxT9AjVP-pFRqFcwxZwuQkjbEwdKrc-lLy-DKUH7IyEvMAgQyGtwSkmj1StblOORRMdzrtcyg8qJ-XqOVOP3aMUcwDRNDAS-98sszLbJk7Zju_gJxl3vPdq2EGkhTx0I7w0N1KT-fUXKlY2VWO_J0j2CzPpTg2nEumupuLy8vpzZ5g3bjJu9u6SfseSmW4VMVJ1TLvh5WWng5-GQlizQAPkrRMUXZ4lGNDAjwZWYBAF3X7quVh34JRCRmixAcJOI1dp2cJUGdBnNtBDtMEv6GHu7DxhFREBVfaU5wrq92-48kKF1p4aZTR_TZVPUpIRVYV9-2BkKITQw45kzrYkAvxJmEn1imKqFj_K8alavcXfxD9RW9Ra3bo_avYI25wCG7-IUrxiYFKMQ5LJ97juw7y4kStIm3W1mCCqkfnOh7liUkgw_Y26H4gMxffSTuSwCqHn35EZ_3evuzX7QVuHUdb-3WiZmGth3eWWF4HVk1q6kpLERCj-kI2XRFMRghhww7zQ6aoayHt1c_f-GIkjra916LDXNMO7-Q35SwPoY3EdoNzidFU3xSSSp5rqrSjMBQ4NW3X_Y4AKfStNWXpQGBYkW5tjXrcdUpbYOS8F-pGBqlW7riUmH8ypzZevIK9k9lbi6-OHJzrvgChrnfTYAEviz1bIwpXdrvZiIx2mAHucHTl4arodyGgIMHnHEw4vkqL1aPJbDBuObC-eppNlmgwXaL59vV_iNgCgA3LWgSffGG8LDXj9fclcG7VeGuwNXPuhYurj5T_das3jdUu2cnp061l33Z0u1e4qW-bLWGRIy7OMSo2gB-AwlWJ37LDrSbbCafOm_VuzwgxwBXw_c7vBnSnssFGhHLG4un56Ht4tpM7eGGsICoTDeEuBi7AA65-kTQYgBHwumEmwihI6NAkpI3d_fGpJVy6UZJ0zHVU-r4Jvciio6geS97f3ZfE4wd8GkNslMOd-_2rZcytvJqBsTL0vlhw6aGxdsLv3bKH_Cos2zupS8D8J4bVklG5Q0d-K781J0pHBWJnyA2jddMHKMPXqYmeAO1_n1fobDoMgK4iarpE7hgR-M3tr9Mdbbllzr6B52vsSHoO0fimlmheIX692GlllmYfwf-erL7PxysTa5R4ZCgEkYI_-z2pJRjvTCC3zlwAXa_lR6mvktmPmvBl0_6TWv7XfFMbp9S_FTKpyLXzvYHiEdYkf_4GqmZVHATr2gZrlkp04a68oHl3ZjzYVti01rjrSN5vJAmSEHXRr94M23zezfi57a5bUguYFPNAfnMdciFTT8Z5azh_tytyb9-uLRnQGlGZnZASvbetX4qZk6eXUJo5LPsvq13xbEk06wETFnXkJe-QNyrXYykM7tvaRUmomPjTSiq_smYy49Bv7hwS4Zh1w42rZ8Wu1HokOBS2PTdfb8qfZVbmnAFz5TgBMrgIvTRZ16y-_GH3NxITlEoBvQPdAypeBQDTy0utJey9y2XK-U-jXDDoTW1QGNhZopycoX-R7l2dHrB01sNoAiitoi6ph7lrBLTsKYM7WZfNwDzr1e-yhMkwVwrtEa9MarmwHaQD6IZdw8sgYPChlw0Kf_TzesZSMQTy_nwClCr0yR-49ECafqV84uLK1cIK1vDrBPua3xtqLlqw-49IYnxbj0ubOGQIEx4AF9bEzVLNlM8fRmC1F6hHtWYC9qZw60-bR1lFyCsL1ePerpkROn5o6xrfAfF04NV1Ky4hdXnYAyB2hx6GHu8Jr5QhG1bYWEK-hxvIBjTTnjZ41g5Ql4RSlWtL51f28eMP2lEMwMxYkVga0a5islb7h1z5M9V-8FVErzuf2HYILBLEmQD0fmWjbSkAT9YQGx7xHqYNpq1QK-zvlvv1aTbdDboD-7HXiwjJcIGHXnwp7e2Q0--8We8bRgFkvMuVCwESBjcunn7kFQz6snlVQ8GR_bEK3UCIRzeeJUij99nizlPZK6bxJbK2bF5caE14-bfFGBB-ijfUsIbXd63zwxUyoibZKTMpXIXr_FKyLZwZCdfXurLVsoQfvD4hvD05Txrh8W21T8lELO33Ho_OsEnXJXv3WZ4TJ7nZdEYVlmec_mW0IkOAOjOlY1-OvwbDLDumtpyjRXlLCr7YnrsE0I1tGRoUFkwu2K9mkOC0lfQM0Qa0fC51ZG322-TvCckQXF4tg2Z1IskxVz_EY7dSxCxzfxEW1_3hCEA3GFFbxCIXqVkqPnMEZX8w-qC5Mnz7WLe4SKo1blyh4lDfvH3UsrbHL46_HA0U8UTWXIU5FNhvhj_pdCxZUPTyIz-UVfVNbi3fkfZHL7GmXPLJ6Dil0ySrL731Hk0mY69tV9efXM4TATHk-PUrY58fUDjSdDcSy7iazbpCLcjzLafH4M5k5FxZR8Ct1tKewN87i-EGNq4JJvLMVoS4nMdQAOF3oO5U92dJH9Bp4fqdRi0wwhxz-146I6NtMt-rHZXKbdiUQZDP8forHiWXTJazcCGv827D8Y3dJzMJkTfWpd9ye18KyB_rsRiMRtlWreBBBE2hMt8z6EzhPwf1XC2mw7Pk75AkRQYKrFMbiDcHO1bbEfK-oHeWalhpFKQYQItK0RKujBsDsGWnHybuK5wY4pE6CeVZG17pUU1QSYcy9bpbHwD3_X9Op2syvhe-kIkyEPFaVIGTyGAtNOkk1HBGozIdEqFkg-a-a-O2d4BYRNiYIDJr4XBinure43DfuIimsH8FScPXUMShiXbvwADgcAoaNrAiLIksX_D4AGSHneVrSaRpLRuYwqAz19oZQWkASbtsTKAPOEYDi4DTwvHBF7B-f_xseiEoTtUoOVJ6Lc2u2L_vupUMK97QM1NZHzuVjOsy5iK2H0LPJnz1KC3rjOEZQ7CZSdyJpc9I7PLdD0WCmvdzawzSS1moeEWynbrtHm6nc7h5yCORV-aF7xESmx39DgLi7fSKXZc9ZVKHGc8LPGsKDAtCZh4jnfHpaXHat9EELgcNoJd_ycuxvvRlAWODIb8b6mFhHTrGUq7uHGZHNo9lCGacZX4B6ULJm5zIRkeDh-_RXT4KgEKk1aBdvPStmOqetwyigFFXmPRKgtLk_SjEK5a6-g0MvLee1dOxm5QFFlX2ivI9FDCIpNWdPpJnJyBgfmZj3AdVz56SOmrm8phr6x75rqVX2vwx9QjN0I2zJ3R2sZ5AKsFPQ15F4MPDC2J_GItZMd3rGw95eGo3SgrXQxv9Yzme8Az-tBzsepxctfOyXjLnvtM6rWAjfKWNU_QpKtTvt-ZRGQ5DQP4xW_kPOj4SvmQP-oq8IusljSiNwg_WOVX3yGlRPMWol64MGznJix_hBfm5V5_RTQ1Y_IGfIGLsjTPwkrW-lnZF-O6Y8iK3rMwICIib9B8rYqr9uBwye5-uTfwi1ZCu2sGtMAJd1P4BsNqADWSHstvW_vQ32byXOoylE8_TpYwJR3OKojUTNIOmlPbGvDkhk4QLrVZXNd2Vy0PKEN84yQU5I0ED6XIhcgD0bAmhW_WknlJ9pOtemyP3OMe3-nE1aAnTVUG4alU1dMyABB13B_iNklOJPU2o2Nm2_pbH189V2kuUyKYKIuThtEc-4vnF5YbRi53u7-VZpLLmzrYARIeTmI16V74RxhlAwt_8Y2JzTM1EFyntaRF0n0SyTo3xQ71x9KKV2obvxk9HFEV9YoZb5ixVT7OE7CHaPOH34MXkZNc0FJdAhEhw6TL24vmAyCA3XGw_hjH0XD6JZhSPVn6kGB2J0JwIXzQb2gzTpKp7XwNdRVDeMvMnPPJknLswGjF7VF6xUXl2vUD7wCJK4d6KSe8VI88LmAA0Na9YC4uBoHjZP20rzsPHmURovU5oO76cmKo0HePV8_wzyaeidDV0yHfjYIqdUMVX8ZJNFFW2w1gIWdVC2kLJf9TavHeGeCEdPE60VDdTJ2V7hFm-IllEoQKtaYvw3hcZa5WasyXSXFZtbMyanOrNgDJT8VfxkKn9Vx92eZjBu6-zl8LLxk7-Ogh86aA2OslmDh1edPvGgYEJILglfcQ8BtevnXO50BLOOQHgAm8uLdEV69qdLJAQ6pbyRc-iyG-SXpMm2w7-CraO-O7lsLyck3aVpihGY183HsSj9Wggb1GNBhhQkZBPpGTonvXroH1wxK76mINKR45m_bKQ_STl3yAoctixpv4EV66mRMGm-9qYz3wvlJsStEwgxE4LheaaF2Ff8ZwvP441mYN_mdYHmE-wwbmMG7Q7ztihJw1WRvoqeihIh4v_eTF7tT-asZfsb6CSZ9p2brKm2FWqKHMtL6VRn2WUUSQy1NFBEyRoimlpX_-AfszQck0zur-ss0Ih3YyTFoqxJFs1DB6hXtx3KXYMd8jYA0Ldz8k3h7PYBeHWcMPV0_byFDl4-6Uy1WYfHoXobQZxMOJqvIHb6RNAdekvhIYXYX0NhuMAEUy6aPgFodtZorLkbFTO5v1t6FrvNRv6tgYOk17lCaf4spCZVTTS6462LzAeqoatpsgoF0YDOWOLiPHKr9bCCa2RWBeAIf09PGtRkKX0TcmPKAZfzC4khbj3VVaT67OWAnSWPaHXLD9mk0SP-sC-WCi5LA6EeEk72HfaEgALG9vBs3wuEnzX1QJ6uWL5_u7TtjH2-_CTuobxBrD7Ap0QNh-gsTOj6618x3E7cWTcpqQUL-OBZEZW8oiIz-URrqt-bwpLv5SFULKREBAsm3wWuThOGnPrKcRoC9xCUgLSFjY7zPALi0AgtfM_C_OuXGOdtmiUKMxKvfOVYmhHl69hZp34_2zgaP8bRiIBWWTAk4Yef10D1w4vDekmejxLBQyw7c1HIgJE4myOCDELDD01","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","type":"web_search_call","status":"in_progress"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.web_search_call.in_progress - - ' - - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","output_index":1,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.web_search_call.searching - - ' - - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.web_search_call.completed - - ' - - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Hello - (greeting)"],"query":"Hello (greeting)"}},"output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0cadd4100411864a006a4e129da68c81988fb693a7b08ac9b5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKdw6KY96cwHAwEc7gkP6XT-YvVwiidQ5KOmNNLJ8QeG-MYcwaY92V21tPVHV8XtbHULMPucT806Dx6Km1x-ItfybUgbbm_vvmp57RQ86rrCAEAMvPugdQQJ6j-FYN6hobaqAROlAahC_kPtgolXdd4AZQG--7BtIgYGMQ8rvXVUFe9WbSgnkIAFY7ibzVZsLHwmRo9g9Ii6v4348fy9R2f1ddJFsR64FRobRcrGUpu9Lew94VYSfqdgEF-AWhxTTIHpIpu2FpVuj7Ca7kCOz9bclGk8xEGR2-XO4WStXfAWaF11ZVwqcZUo9PWFTeCHMTv7rgt2EyETn3sXS4GVX9uLvQoLtc7ZUBLEWyTWcnB3lw7mDoQgOd6fIh6I9XjQe3JuwRIfjL5XN7kRX8toT3283m6ys5RKT12iJlZYBkcG22Ni973OSWW_3BhTpN5hTIYU55MsYVkdDHPaOEJUj7srF_ZwBl3hHIRbRQN3GNJ2V5I7eUBiiL-rtNc2q5k3Q7UI4S92f5QstLYStSu33pMFj6uJPNdPDE6Aqtzxo-gSkA-5S4HHc5WXacjdOXRgDc7ET6wNDE3MPcje_TLjExKTPtiStygPVg2xh6l9DzmCrpnkP4Y2VRKf0087JvHkIhH-g2l_FfgL8VanFvkHlZ-bJy0m9VmjRbM1Wyj2_yQ26EvRE8t_q69cn88aERAtG6kBJ6lugvrw9854i-8ixpaAlBuEKGtkWyq6s0UxgM0ovJa9tp9aPBbxkwqsSds397YmqW6HpWJrBOmzFsmM7_TZGDkAXRXuWAv_cfGzDaHOsAIJn-HDUEv8RlSDRw4H680PZIC0M9UNrXmDSlNVYpvAtFZUfZLspkTHYvazb0S3AWNC5NMXX7wMuQFyt-lQFY7_w6r3Z_IenRFgZNXl5OxWEyF2mSSNAqJfo-ud7pONnE=","summary":[]},"output_index":2,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0cadd4100411864a006a4e129da68c81988fb693a7b08ac9b5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKgj_cH8pXXAPiMZOhRVSJL9X3AIQfwB7YE-yT0S3LbfGDC98yx5C19g03YRywMAkXZCpnsQ69BCCNXMM93eBrMJFqfjWgCT-wM9xqdBs877Da-wSe4BSr_BSoT_5InWdaIJ85qLE6YGaVb-853d0prxqHY7mUNJHgNl8pozkNfB3tRap6jhTFI14GGapM5bzANOwKpp2PGuVceF5MBY5nWoPdhJfGGZxw-jCdK4KLrP1VmXGkA1lwazXWbVw_8NA5wl4BJBNABtMJ3wQBrIPA2Mpf_toM7iodG7-Uq1qIs1tajI_KY1AwvtcpmCAgcDIgwyCa8TMA6iE15I2F2BKZs4ImM4nWfOah9mMQfPdUGXPCio4Nvb2G0uL21aBUa0wKDwrWyLChw1NVp1kQdy1tnKxFnZcHE4oU-pf_6zuh3iZpQJWtD7E12GXv7RpmlbKOPqzYBQXDg0SDY7UuvnmBhiiFanpQWVEUIIvkRomKoJldKhWjq4AsjsKFODyYnWEob1bRkaWfT7wNWHq3AMf_FQFWh2IMk4wONT_1LLVaJ214TuQFeaX6aj-pJYzyALo1yMHbI8G93qq63Ru35jwsaCgXPtTpTMKqOtBKzEPCuIFMXI2I9MA0fyCv30OLR_bk5YmMqnjA8h7qVzRQsak9F_jhsy8DoQeiSGssTGozFwQC36X1NsBQXGnO5BmEbfAgpqun7zc6226gCWEjtAEpqUUS2IaM3yn5BmbyvSvR88mWWaU_RIZ7UdasSETbBZkGKqgn5__bBuZ52bmhdYHRzkpPRSoe3bhjpDv5x8e3wDMla1fr_l1evIBcuxkfMFgeIVTtgp1jvtvrMXEhwPLb3VFcW4UWhROQitUTlZS4YrKlhfUVt5p9JfuvcIolXxXs1Z6GjDzmODiCNYoX7bMi-RV3LhkvVf1TtUXNkNi5hAXVZA-ig9LOEymsLbJ9xOLZz7N4WLHFt6AsgYAw9u3COSxfi-0aKsvE5f9nIOlpdlKyJKRxHcYLBclv1u_HFfLr14yvy2dWmok18JSSY08BdsFH6ZRWFY9OZ2YTU0CS9hE_XQVk7YIiLGutccCrFxD6wI1xwlFcaxe_6Dxl92jOZjj6W_-n6zXy2TKEOldLUhKuK4CDtnByjrGaiuACFvtjIWGiwikjp3ayePvj6DwDM0ZmkgYP3BoDB1A4SPDqoLqxVmcUlJ4EkxbNm2yYSGLg4zdbeM52375hTZrhAS6GnfXoJIZDnrM1vEx0RCOf9CoGY6nw4U67NC3JAIN6J8JxX2SroNf1qVhUCUO3pzfgFRhlNxsSfxbEmqallmEi6kPBcbamZgdoGug2Ku9L0vtDwLj56j0qaF814g6Dq5EUXp_K6LCxmJvhmjJcfRy9FC3ErEIA2R-nFzQyJHEdP45BK0tCqyONaSvbVVzm2d3w7rW4CAIeytI3rMJTBLanO0odrHFSJpb4BM3eSyKw6RWoobE65JCMHs3Zq7VseJvXhwx4_xeKAS_ZGEZfTerj8Hz0wwJM1mpWNwbxywTbUqTnwuBYVV_mJq-IXTqxuupjwFiiOkswBWCu8map1Jp6qkHcqER_EzOiSMo_s9Rg_l8Agymv2DW_yyFA8zxLFMlYkaWcYMbkDZU6ABUjIMmgRWy7Eo9YrP0ftmP3b8yp-82fb5L1G-uD931XGcLbOB1O9WF9UaxEtJIg0PqWXedQ9oPyAC1E6MiedFWKS_1fZtaCstncBRy0PgZJ3SHbCu-5xvdtR01zHmJs8Mtbcn9PKap2n1DO7ifAAGFnjcUWF8Hfh1jea_9d_lSHejh0Qm1PnUUF0lFYMPtR6uP8yLE0u3ajrZFoX6COmn9iMJtSBMeMweatlM5WIhr8_tlF13NaIZozrQ9Ew1YwVuOwHMpqXbz9pMk8iEIa0CywZc1kHKCDJygvuTn_pxzE8ipOO9IqFKTkQJYc6kOVc__ed5SDsjeb3MAGe-rf48lSKE3mgw-chbOvqrUnXiY6W5wJPusW-QD8B5Ove6P0xktjKy8YkCot61ekOGobk-acobxZ0T9scRGqYDkGcFjEAzWl2lKhtnIQFzu-eDW8X8Lis4sl_ks3nvWVd0MNFOD9g2cyCank4O5PmjVvJI9usxXjf135ii0tSCbW4zcS0__rFiu5jOBApo8GjYvnYHwMVr-VCQWBCfFk37ZxJCjhX2U7uoZ2GDqvpPgmYWcWKq2Ha8x_yo95htCd1rRW5lboX14FVUrlSSRMSWHS-TKdKA5f9O8Ig0XJKmRKngA7ja8Eljj4QGO7MXSc129SZBJJ9L1M1REj3idhxiSLbSq7VPX3ecI3i9alRxhKCArnsbFZOAKLZ91z0_qhHOnM7GlyEA0Ra-VzVEEKNqcl5L-56qRB2rg7dxxKfGNfRqkPcunXtoGi9jV3Bm0SEWNxY4cgrIPzlwwFaceSypThgKgA2wjKa0As9yCy-rfp-XsCjoulyTIgSnWNSUN5AZ1Kj6mj1pQSnobU7KX2WZ1HvQiueLMwDFOx3vg1zwCynlcZv0Slb-9GggO689I1PBKr3IKWO_WlGexxw0xgPvNbmbq5kmy2tzGeYEPJkij_gE-S1vpLF0aQQvSOPM9s_DO-p4KN_QgxG7r8jSvlPnNbcVjoEojSz1L3hLK57Yjqtfz3qJrrSPAAfzsXrv340ErIzvLSPfuiOK4f03aLChatDgRrSBHc3-3BhLDtVgi1hRkyWaEyQ-ax4jsE3BEvR50J1sdMRgFd7_EM8f78CcWben6L4wslUi8oUjHG1SusuoFIVcuD21nyLeDOei9G-qt6TqeG_KWsxoWhHYCKcpkgK7LMmzlRetH6mdPmyoeK_GjzatqmDy1zfy203MujpzlSGubtPQ4vLsuyE_QQZGYgz9EzQlXDlZIjAOv7CjQog8lrBkNdfVy64hsCYGHlYQmZAbqlR86QUM09wX4Ukdca876GMEyY98UYgniIu7fKuKGg1iZqrjEUTkEzePcmrgCrfwX9bbKNPtivZ_eWHlWECKrQnRY2qK7HbotCnBTzwBJQKWdvJHWmaEjLidH_T3tG-mufNAZDK1xIaHQzd7b0L3tyHSpjxuCI5KtM8tjmFNd0mkNGjfTZnh7BqE6DJ7AvQSrPaNhT-4_9hdKRGOVxgbvG3XbZqWGpqogg94LlmWVCOxVN5Amf71b-GtrXg3oESibjvwX1dAOWZUY7BBoZFGaYdCzFS4YeZ2R10XNGybTo2CVQtQlOv1lgLh6AI9JinXHi69FVr2dYmKjrpvOheAsZKl2gzvSFfC0I8l31nvNUNZOXkZPgTwb6M6exCktn2RQxTORcQG-kLClgEM7uDcMkmNVSG-FebKKM0BRjkP10rceNISf0Okxwx7I51_dsfnGB6joB3ptMW6zL2w4YawsZlcs2MS09UcA2ArEMTsJOQrrsuq3kI9U194h0EdkZe3jFzEq_eQexNNpvJ-7wqE44z0WyrNuptsQ==","summary":[]},"output_index":2,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":3,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Hi there! - Nice to meet you. How can I help today?\n\n","item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"obfuscation":"FetxoWOismZuj","output_index":3,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"If you''re - curious, I can share a quick","item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"obfuscation":"A2QZtSQAD7","output_index":3,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" note about - the greeting \"Hello\" from Wikipedia.","item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"obfuscation":"","output_index":3,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"obfuscation":"VUIKoARnoZ2cAN3","output_index":3,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"([en.wikipedia.org](https://en.wikipedia.org/wiki/Hello?utm_source=openai))","item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"obfuscation":"3RCvo","output_index":3,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.annotation.added - - ' - - 'data: {"type":"response.output_text.annotation.added","annotation":{"type":"url_citation","end_index":213,"start_index":138,"title":"Hello","url":"https://en.wikipedia.org/wiki/Hello?utm_source=openai"},"annotation_index":0,"content_index":0,"item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","output_index":3,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","logprobs":[],"output_index":3,"sequence_number":19,"text":"Hi - there! Nice to meet you. How can I help today?\n\nIf you''re curious, I can share - a quick note about the greeting \"Hello\" from Wikipedia. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Hello?utm_source=openai))"} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","output_index":3,"part":{"type":"output_text","annotations":[{"type":"url_citation","end_index":213,"start_index":138,"title":"Hello","url":"https://en.wikipedia.org/wiki/Hello?utm_source=openai"}],"logprobs":[],"text":"Hi - there! Nice to meet you. How can I help today?\n\nIf you''re curious, I can share - a quick note about the greeting \"Hello\" from Wikipedia. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Hello?utm_source=openai))"},"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":213,"start_index":138,"title":"Hello","url":"https://en.wikipedia.org/wiki/Hello?utm_source=openai"}],"logprobs":[],"text":"Hi - there! Nice to meet you. How can I help today?\n\nIf you''re curious, I can share - a quick note about the greeting \"Hello\" from Wikipedia. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Hello?utm_source=openai))"}],"role":"assistant"},"output_index":3,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0cadd4100411864a006a4e12909bc08198bf8654bbb070e84b","object":"response","created_at":1783501456,"status":"completed","background":false,"completed_at":1783501473,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[{"id":"rs_0cadd4100411864a006a4e129102c88198b4a73cc77be3bb35","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKhypbClvCUSF7xkBD31l1WKlQeSHHjqZEfLJJoXUNYbqZWML49z-aNp5IenAYcyUpcFhyFMa_Kkfw1-0SxVGB_vdOQoGnzFmt8I2maSwcdGaiBzOB1_jyRX45eJ4v52VHDJTwYUGzOyBvtRyQgREo-YycAgaMW1COzen-BWM3Vc4TXo06nVyT452BnorDIUHBfLeh7Eivl3ebUxX40W8yoksPnmj2AKPdJ3ctGztpDIkVPkPl54-TFjAgra4Ob8TxAJlmWv136251OGUxH7IkZTPt8Mee1G3ARiCDkgajfbksfzl5XbVLCWBbXlGEzk6PVE_mNFApacnRtR0BUy_i4tJS38SpvLTtjls2iT6n7PDNJqgnUZnhmSBQ347_N4MkvkDzXMpRFzwymRoLsNzTZmHnnNIS_1jTMIRcDxsaXLIIyW2mJLOfFWrZPtZznAibPOhRW_TdigUZcjiKLe1MXgQbLOtzQJWf5vreW_maRLQsdeYAbezb-qQcx6CRm0DymelbuMhcBdZYo1f8oc7cw_Tk9fB2pc4wNAi3DFQ1M_htYwFdzEOmlQDwl9_CZCrSEIAx3C6F3vY7IEaUfW-krFWlydYMQv2ZD36Gdb1D1jS5xnmrLLS0OPCv4lBWN1vOQp3WNVWn2Bf8qlecxgDIngANQs9INGYOp5Hr04KxrDMM-SMFDQcIV6xL08UArEC4k31RBGTZUD6lvfNYggh0h5VnUWxASXQQIob6wnZVRO5jCryBC83gMY7QEIraI9h7aRddWBojvxIz8dKgFZHPnP7RQ73LKJCV3KoE0KJE-ZV1-JbWmVR7URAvERy8CLWf2uKBgjt9WAa9m_U_DX3SQUn0mWuDmbUBwDMvOIUKRXeoXa2mRrmsphA_afJqDa8v-tu0pJ7BcyjU0fmTLa0xHoH2fxPYxlY-oOToDJ5K_Dx_mE0JGK772KskYVMWwwAw21QI49L_alV__BOug7P_oK8a94Bfvh8KBUm0GOzYzbGWaEdaAv8HUq8eZEBPtJCX9emzujFfyda0Lp5sVWt-kV9r0DmFY1ZXvhOaf1rpVnm3fTgvwWr5O6Jywo2Ypu4f68dGFwbYNZn4Ux6U6T8DOi3QZDs58MtuDnKx3iOBpzMIqIDpfFyZ4s_9qHWEP5d9dlIS2YP4NMkqDYr9_-i18tedef3Cde1M48YedUagkK9bYbHcbGfxg7BbEb7WuOaTy_Yi3lR5T5b_7Ceb3dvAResX4cYlpQ9Jm7hU7-I8mUL6v9lR71GKLNq0WmMTTI5i28J7u0sbLixcWfledscOGoXpFQawkZScsgBq2S4PqUEMUM8R-qwEmIfgjGNzXS7RXn8BQh7VR7u3mJ751dovMB-Ggyf5Wd4N149kQRSVHKwrECq-gEN7W6o7WtKwHAuyjjIETp7AGG9_QOKMSVpwMe74mpN9QdvflkWOwPlMPw4G6CmqU7hGbJzogMHLrzacgvX9BQk29tS5wNnCzxTWFuYtmIo-LNNEABW3pYQ8lksdnhjCcpIaYn2fU8fi6gnMAI3H7ELZpJbmu15hHpnUA6GTVu-sJ45FHf_b94sYO578VG_9E4UA33bf3tIWc_qiVnNJOMvsGncsG0FHLZd9JEGUf8CWLNUNQSCX6MTDZ9W1YqzMnTD5Hbdr-XNMnkY88evu2vmgslEBJOlDW8-cScoMBAP4WQp2Y9Iy5Dxq-TDbOz8ybnylmRR9UaBX-rCSEKIyIkkTGIB4ZaiiNk57QCh5V81ZSqbfQuYMO0c8vXZ78xebJjG-AkboJ--u6tbCY63sN1t0NmFkAULwHb1dRGQtajE2BWLq5iVDJH4t6F5X6GBbQCHxcOkpMdDyqalV-PAfDTU12oU4sMHpW2K-pYheg-CgP5RsjoX0a7joviy2xUPRhJpG-eIUQMkPNnWzZNwxCgyoXJcmDyfR4X8ACdhOR2YOPQinOq6je9rHot7jz5k4oTw3rJnts8609j2oAXsb3BV0wIXyszdvIgICsNrWB7s5c76ccs20DdhChCdIw8LH_rCmHFDczLrFXyPliHY0ySBOM8G5t7aEkK_zAfDfxi4oSTTMSXimEfEjWH1TRQ__DWeX3q9Gx7BVqGH45BwQQo4m6BaPO0xtNp9Rs1xt01L-jd5ySPtED5SBUlMqW7GuzxZjxsyif5HIlRyPxEOCpXcEvzYObtPRTWaF7v7NI7HCPsTGvfjMiUbHUOIN48FyM0yGHCxlI_8eNLs1CQx_IJP94jeYL2srjydO90Hnc6Bk5I0xmQFWo4XLwGdBUYixMUk8gAz1OLTSThLaWv_O-m93xlDMBVOw3IrPDGqWUhv5kftiTUgKU2CGL4uF4_7IpbiKKJvrsaIgqb5360tgn13w1XClVjfY5maPOuqU4XmYGbP6zaKTLI5SRhMakSCFl-sZS0UKiE67ZGe-ngG60AhsRgDRLvqjvCyAV5FcV5VD5RKSjwzuUrKTFgJSLMZRUpMdZzePtg_vqFC_k3EQNAK_X2bpTyPPY52n1-ubd7bC_9H1W3m3qolyTxL5d4vzw-Ps6AQA-4TYsM2gd_DYffkjbfFsoZ1xGnsWwQPkhsi3SSOf1q1FTgDEFeQ25MEeIdTet7XNl9Qe6OfBd742B6OiUkRsEczNBEu7qkHBpIRCxYa76lvj803NmZNOjANS1k3KN3JOT8zWQkazfumqFm1tXltljQldf39W3ewtaj-_MKKj_UdT7JgIvODEk8TawEDwZltrr1DEiI-FZPn5B5hKNusiRS8pi0tgsf6qd8TKWBjxpdGuAGK6Kt2vVBkl6hsZZLNTgE2EVXCz4e9WKgblSfww9qWG4onM1K7UHvuURhbTURWSRGkt_bTgOhnaYObMLqt2dyqHbJpi17hnY1wQjPgI1oLfDPTvSzkxWUs7tj-q4QSKdh952S68TqPfzZfbqI0VcGHS1dU1Es7iRTA9bhxy8ua68ZnQn6-mNnPW2p7pFhCL5fcyjfUVLyqW1qlJOjFSzG4zcZnT1jqXWF0L78fMAaAlKiHoVsNxU_hcmAaGXYBf4dmGR31AFTtCzXCaULEcIpEJ87pgCHC2wGAVbmi9M49sAIZIXS-o2XUyRa-c_AEI-_31AReZIBQaKA5D08Y73seo8gW8pduanYdjxo_arU7_byB9mFM7m2oLa_JCmCd-pcGH8otE8XYHETwib2Glc8j91QwJYELTlMEa--nVGKqgM3bV5PUHiF7UDLsE5vsTy7KveTYX0l97cCM9LdUFXl_9N2dEK6tq8ofG9MnNLywW16GyVupokb1qU_GOFZWRfjpg-3w5hBqQyxybuzB6KVmpwpbwoR4mXPdEjSkGbJbkpLmApU5FvO3fYi7k0hefC0tep9RCkViTEj3A29RvFCCqPK4NVybH2mJBwPyRVj5PDTf_EUSBtWdBiQMkj7at6f0upJoeFVvCponwMHkfzfN3feW4Y-G7CfjOENIjTnMKwQCFBYBPpz0BIgkKaAxP46YDON0CWQ9ToBxPFQC_qdlv6-yfn8ZqMc0Acrdt7AsKVeSMkr_EgIs1D6LXWnYN1xHrfWFBhPS5D48M5CMFGVe4g-ivu8iYUXiAEPMEu8rtFyXgEBjRiOdl6ZDCfg1VKM3Sl_urjd4XwJvaGSK8fDTrWjjEjNdFcmPVbQFIOe3qqPlvFg-KycOoreJSEXaYqxV9vhUzVeiLOU3jKTvunh6LOk_TJ4kRKUZ3oRP6Sw0eV1JqWZPvbmupZj99X9jnNgauPnWQO9d-RtvjdzWZCyQgSalMLaTuLrKwDilq_JTvT-NEtqKkjQzevUcd27QX7_mUaUNRKbAhkYviprC7vr1prEz-8VvOX77AQxUPJEBOR8LcnhPFe-JykwX7DHGkVTC90gq8tN3vRbFkNISlhJgr0pG2-IWbi8vj2Bx0xtX5gfwgu1LjCdxBozYhjkkiDiaPOLjFBtmm0YndHx6iQ1-dSTNetIhSS7ncNIqd-PEU129FKVBYhVAgwHP4HcxmARaXwNuF6QRxOJ_51zPCD4oiDzZ258Fxh_4DPccS5A1nBBF4P7Tu0wwqbaD7zFqDeWzzZRNHir_vc6lQsRFTttovdKkT79iML6w8W-tcW8I_VuQSVtelBr7BjrdpwcGMTuRMUtJWfmlouDPEO8EH6jTeMMn7Zkxf6gthe7avE6SAj80j54YsfueJWHyMfK8CGUPMh72vhmFqdCpIewFgKOda616rCducricx4tCYeVK6JLkDYr9CjWvcYpWit4oYmqrcWbeN6eQUFHf6CH7B4PnaeRGsPK_2pfszmhK99VPgT98eaOxO6SKQmzjudVn_LeXx5OgatvysUDIxj-dofIRmBqH0Q4rhre6Qg4QaYY-EZQ6GZxiFPkkXHFeYCeZM31pMdFZxqfIpH4rCYuuwo6fV5s2Sz3GfIIr-0GFkcr8UiG-KqJpdFkgihoO-2mM7XK1tJGd42fEeQvdawqgoDNSGKc1jh-xJC4xVU0EjJwzPXINMCc7xIc-236EQeDODkl_XRE8si8rr6Nrz2uCX2XU3D20d0w1bd7yLZTnYY8pPnFOybNWF6l7LYotXsXa1TiOpbU2lkWzLxen0uvhkB6KDqqpdIFeR6kElj8ODPy3i1KT-wNEfxi9-G68p3SOmhzJ1LwXqNjTLbNpaPrQ7548UZxKWI8pm83VniF5z5U_4yX8FPNG5yTbZ-TKYyjrjrT_swv-HdlOXGYscjrKwPK2pS9kj7NXOpeJrod7QZCoeynkkoiavFsZkXNyjs-W5IluGsqIHeEw7lEgFrNNcnYZ7GGT02RjVfjzqW5qZxPIgJk7a7XLNTBkiLe9UUVpYm_mRDB4cDvVZDjvgsgCC2o0ewTGiIlMyVoe8auspJPvu7_vadXHEsPQR6bJ6nkFUHHWbjHxpCpoyj4chcpYES6d2NVwVKa2SkscFWC1mHxbBGeDep53IKjmlyNGriD1jqi6z88nO_pERM_FEE8C7DBfcGijqHeX72YXiew2axef94Ia7e-hX6hLVsMA32zBqWqjfsrod2tSRH3KkWj-d7jMjSQgNPMDkzCx1JdEHy7VxtzVosVpaWB-i_QC2qfnXhavYo0NQZgeoACGnWLNLDoyxEvm87kGKci0B7R9tbJveGJxBIrTsoWW3NWxVVp10_1KwLDxfb5fYv8Q9q0bel3pU3RPtoHMH4Yfryebt6Q4cyM2DDvkaySudWHGZPYVez-PyuVXDkty-YIU951xps2pvBrNzWJc9rJjkkeMb7bEi8WtDC3rXC9Nfz9Viy74wNKBCojcaAz0WwsWGexMa197ktyaTNxxRkd6-OFN6yMz-9q9Y1Uv0b4QpyHc-zRvkqs47QmAsjQ2Br6A29hNExlP_AdRrZp9QUpXACOO-wll7MlcTY0-Sm0scypcit0LyNszSdYBQWgSkeQ5cVquA-pjWUHXUrXFJ_G_ZrNtPLVy8NbgK1U_kDc0vIgPXqhLLsitRNBy05A2p2L8SCX35gWhCIWUaYUWfJPbMn5F2WfcvL7ild0UZjV0UfNd0L1PT2qmK2WP06ILTlKJ5G3ZZcg0jJSudX9WSWpISvBF67mYMmrDaR4PhkYU0m8IZHdpJOAzFiEjo8SpJNIPeJAGQ-ZJN7ykuKNug5qmix28p9YXs2uPGnueH06YUTN4lado88NvTSls-70O7TeNveJ5vMxArt-Rcpc36QvdAvBjrN4GWPsQmRLau6q54ZVvYCkDTNCCIlZ9wxK5B7ae6Y-EtRiJ83M_AfNw-vyK9oUe5zV69SyLT_f4bFXicCYoAmd2T2s7_mSMXisjahc-kf8ODT9aY8p5SG1AsJtQzbNAYiP87yu4qqS1jR5R_SdBww7Ik8Q_I1csRdi0DBTVzdNs--bbVvjEBn2ezxXvgE9BSGkbcoU4aprYZGedT_g5XiKZnuQ-AsUIVKxgE7XTnXDrJRwNR24nIh0t4utHt3DH_KmpbAGB_CPoIdJvb3wBclnDYkLgHXPfT3Puhqkh9J0kSRC9vfkuEMKm8TjbUrqTMnn-2E4jY25sbc2L_eYGb5B1z1eg3ib9Y4Bw_QFL-2rrbrTEZUcduufOVnf8E_FkDwxCY5EDGZTOgvdiCtz8B9P6apy-km1ZFhOqpVdjEY_UscbqcB9GQMG5p4CkKjdEwnnwto-v3DUiqy2l9xYFqKtpep4cJZqp8wjl5EGhnpF95Hzt1m7-1K_iB6nUukxe04qQifS-VI4VW0i11G9Lo3Q64RqsTBA6Cu6v3U3b_jMr_XI_d-IDU53DY_WDJTCRU8fhIH1Hse7aNcXeFLlWcycbX-ih6eETrr3SCq0Ku6gdnO2JBoqqg_2gNeIdmiAdmhVmZZncZKr35xle4YXfiqD9A-jWvMB_rg_ivauORcipq3vzPDz_eSLUGPViXX6yt7n8TNctfHhQg18fqe3yhvPDqW2bFdZgAbmI697e1B5SjZ_pACiNhECERICT4dded7q8fRrIkOf207B0EoeJeuzTJOYcWuRt31WEtYnQlgpqWbin2DHNMXFJ6Ab6kvIZOBBBtbfRwOUGv_06AuV9HBVDZuTmgHKjupVsbBNjiNHSaILJhAEef4HDlxG7UeP-RHrXvGGGNz8XWK31TyNG0Yb19EMSNiXxX-Tj6eNtUPvovFP_nIw92UhkYXrJq8qUSW610CB5F0_JgRPtmeXpM_sjrBYm20vk-Uia5SzV76JNMj7L8mDUs4kZILWYp_-bKXJPvtjFYTHO3k6VDjTXEqA3t1XKCKMALBoTEuvN4-sJDEeZfAQLzB0jdlLt3KSC2n7-WZyWKtIuMlvadYyuKY2rdcIcIL5dEyJ5eo1vOt2G7m3YqUo_FtbIEcF306G1FdqNwnlBY1WUfPwEFs9hL-c9IgcKCzXTmegfnj0NBtuMcYkHqMG2QjJ_nZF_pe2068MLmX67tgBggsOznoHdcJc0s3R_3Kk4_Ji3WbrFCexUQq6qLGyOzO2SXWjPrdUbCZvKvQqun33CIgOA2jdAZnC-tJA2NgVgJ3sdXN4rDP9tAVD4hVIiH9lDUfjDj3k-a_sKMmQ9sLRX996DFQY5-aTccShauyq_e7OYbBVT7Ta1KoN_qYlIf8neulOHFwwSurA1UcjY1wyi9Ukp3iqT-OrWsAPsTcd0H2AgirQz7Fa2pB1ow-WGvr87-opOJvF2fty4oE8m5wF4N-NDfl_B8_00d5n9ihKIYiR0_sL5uw349AXCHqiVtNcvL6BI2td-0LL7I9L1g_-b-lscpDwELsD0laou-iY6E0mjV6JcsXeL3Jvv4C7wsBaAitop01jvSO2GuggFprDKjqhDhjC6m3n-_bXyKGn7XLVP5ynDea_rWA6ksBRvFx0b1dqSO8aG5EMr1Ka5__ci_3UFoayGn-qRgYtuy18NETTicpmZZqgMk7jC7VShg1_MvCfIJk_d_sDFk5m0iSSYJ64z9U8g3VrvVhi5vxmDsdoketFSJKMV8Dw1tIcys-fb09PCZbt44mVFW8mv88dlia8CSM_hiEjRwr5MxN2I_tYfmkfWdkznHK-4lWaKwpgQ1N9sYHRJQVCF6x6II6eW9nhv2Kk_-iA5-GN8eCtpeKFvkegZ9FkrE10l7gCdavPAguy6ph9d6VMkV7qbsU9yk2ggjY3NeB44ApA-daTMxD4fLF2ugVH2druiShpYxkZZgFp2dT8-S_HYYmEy8EkE32bFqT-sep8UqNCj00XPCVzeL5oWC8C-mC8kuKBPf63-HyZ9wv_5TYTxM3OTHzxS99o4BWPWErTrPsK5u9iC6oG8WcXbZ0Zl6iwibf-YUiiPyKDuXO4aVc1Zluj1ypzcS2myiH7Nm00P2r3pEprW93eSfiISGxrB34vLCKRICim3Oa5GBI5aQ5QIljaIfW36QQvxrrf51rO1wjH8ji_6VVJv8SmvDWuQNNwGHPgbpG1OUp-VH22z_ZtrnTa5bq30HKE_bLJuicYnsrURwESgqQ7os1caw1R7h2wx9I6Z84_5eUXO_aV2hMdhUZEKq6kmdflQO7wmnpVUGuHs78LMpQ84tVkMqyivZesSskyeZPMDHNvGkydHLLKUdXb0__kbREeoJVkMYr7Zleo5liRFMicy4zVZXdf96mWyRsIrcHdbdMS7uLYfr1m8q7Wtvfzgdl--r21XXMMZALhLGLkO6htui7lI3HbYcYNnQrGn9PzRsYfVy2Do75cY8-6w0DycbcAIsMO6ZicqkgtG91f7JlFpqF17UYDdQbEz53aellInINfYzHSN34cpBhWCgF78IXU7SEl2DXwhzkrwChJDWGc9tv8V8OIiodTfACYjdgWUhwPyi07mbRcknSq2ZQGSsU682Z0VDt8OQJaIfY7fsZ2z3gYEggEktJPJg-zHw1k_1-bnroFfa2Yq2DUD0PNaIr-qrTFZyAqM9fJcOWi1UWC2jwBxwFGR-Ol7vU4c2gFxKWH7iRidrsBIei5vIjKn40M8Vlq9QBpTijhZXsFGqLU30zz49Ut0RCfhPHvBrsCTJBRosN8TyWIH4msE3ZYav1w5nyIN4oL88v8o8ecqgU-DtZ0dG5iNfjm7vWz5U08Zh6ZEB4Rx9-HKLsjZ5CFLvw5tQRsWiF10-FDrlmDapJ2MbjB5gcZdvp9oXvaLOa5yJ9R8I2tmZ1dqfoUCMAY1v_bqUAtSEefbG9n1pkPENsn9ZBhBeuOIHS-O5JP-LeLUZ9-ewGKYugDtl2UN5UdNtxqUsC_VrgEbhdEqLj8FSkCuQ7F5CRi3aETwl9lOuFXIgbEsE3sApkHrXjEE2nIFpDDuo3IzOARICN-zxwvfjFGQrwCvDdfH_RPpW3s_gWLzXAEbkIDvo7AcBjJov6NjGVnXfbCR_54YdBSeyQiEhm3lQgh_2wsFacO8t8rFXK3Rz7qFVsaubuG2FfeZt90vnj1MmuAoeth1hcqHT7bS2RnEvroBsfYUynepG0rvb5HoDoewSUesOslHX9ce7rnRzXyA3h0vm-BBl2qiboij9uIT-tgga1j_vzvtGyLIH0MJs6CNQ7dTlwAOEkNq0kcAG-tJikKs0aYxZKTUjpBwS7EhBZo02Tm2ncRs_sAX8g3GZZD5ULJ_6G5z83Tw7848atWSUSqBAyDczrBT4KjcVN43P-bcQ1Vy4eLwX_UwepOioC0hnmzF1Sqm4vYE4GIdw6FLl3T3oW4avFcN3VnJid3hYN2VbGWHoJv55Iov8P0pfN3QUtuLdyQxXEyClx9Y2108u8xmybEhmoWWb-pmgpXOeC_HLux08Xl6zO164G8emhDuFXzSMtfdC-QeG5isJbvTHx7Fm7GmZlgIcQGVGeCtIe5yTNXVXKap4gm_XpmsxVCFfTK15zu5Lm8-9jV6P4fAarHs3Se5nALECZmHypBQiWWMrD-kfBhwnW6ytExtGae7BpGD8z5vLzjgDlbrXVum69lP3-MWPw5D42xXAEd-ZV_DaJqylywvJKkQOowpt1M6VuLlRxOQPnDzKCQf1vT3LB7oDQBp9rogFrKrP1H9XRERITc81jzzxH8ermirnm_KPuaXtX-FYPY2ZbagPAAR1MRrYDejyUMZtO8BLt5AK_D79nxAeV9hyfeQYDNWPCMcGfaM7AC1Yo4gdCr5bpyBCV9P8MlszVIr5lAWuc5XVUXkfUprN3OG7XO1pXxhacMYhCssOhCPl2eYQ8qCQGsxsM5kOJy6jnufrDSYZwKoYk5euhHVALPRS67dIPNMwUM2bXaqmbUB65v9JSkdkJH5wH8kvEQQTkuHtVpvCj4gH4niwJtzjsvnhno0SYA8sWkO_L4ZuYfBBMScsw2TNRiklL1H_umG8ehfqywU5AzHoqnvqmfTlDSIMqeCga94L3tNcIX1lKuVzovv1jIvBFVboLfjQPUgia6NFwkGJRq8Ns3KhLWBW54SmJviw70N1EPU7LpROGqc1JKZLPIuInGGj6T10ztj64JAqbIYHyFNFlgFmgQdLIUkIxAhHBcH8tpjsUF4KgWZOl6SpM0g4Tow0lJCz5nSi1k7g9R4wUTG1neV-wTjaWGKJJvXY1Ux1LBK0J1GQQNXbd1gcijqhyWYmxHqkxsnNdvO5Ogn_4ZBidTLrolg3slj69I-YOOh9T5ThGUdINlFI5uRSikMgPr204pgd7636Iy348SF-h3KE4O-NWVFVofyVb1-l-TQ1AxVyUsn52G-EEI5SDe46fU2e0VQHN7Ld6u2lVpSCZlz97Da2nh99gezQEsFs4dF6Fss3ICHiJZWKiJqUCMA-Xwz5ieLccDk55EtKV0pDRUU-w9nX_TAzpTjUG6A6YzBUBI-I4mR-5fuYq-UF7Z1WBh2B9zDkZt0ftiQzWD-SBcqoIxZw-lRYHrjsctAIgQuGn6-BaIczH5LiJ7RpzCETFkAXPI4OO_ioceXuM_vf1EoeBhBMOXHTMMUEg40i7THhb9iu6GvSaNLtQ3vDKIGpTBmW_J58hiTVjHQ5mlo1xUmz9OY4riD9m_0a2ugMwkAIkVD8yJsEQ4wHGJEoIFj0hW77Lhf5_m0f9BhWVk3vrQS2uD-pA_EGhb0jmaSoz7WBy2c2viEWHaYTvIsFgkrwclyoAyEPHC5Sddi9ZyXz9b6Y_EDLQ2eAWHOTTm50auMK1OKfDN3Qo6OuuvVHZKsfG5OuNC01RPl_NsnFOJeYFJ_njur-xb4uVjZj5kEusOr9flN0eTAJwCa66HA1Efer3AQivrweGor17ZzTmAzaB409jVUCKd33NRKaZuwPJ","summary":[]},{"id":"ws_0cadd4100411864a006a4e129c93648198aefc0581aed90b01","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Hello - (greeting)"],"query":"Hello (greeting)"}},{"id":"rs_0cadd4100411864a006a4e129da68c81988fb693a7b08ac9b5","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThKhflnM5KYzsUYYsA1yDCgNK2I7MlZcxODakiqpcpNPcngroH0zscl7OrqVFvVI5A6QgxwFt3mp5eF1uvS88f5C2iTia2ZRJLpqtBaKTYUW-4gOhz-WVfEkcDWWgYfocwq-004in4OsybwFJofShrmK2G_RAGVCeLSp_dUlcbMxRcZaGNXOLu7_-vyhwpeACwOarw8jdyJvzEZfamLw5zvqlLeNIM7krRvRmWQtdDZvZv1-49x_hHsOgw82MG9tzFKNPIuzWlc6Oa5L9l6hoot2Ih6s4Afjalex4RW5Rqgxrvrfxnc_pzeugPEX5sWjhKV8WeyAMIM8PWa-X3X-b6nAxfDxbZF0nTDQNf5BC7CT3vKvF01sygep32_o_rtq-aSoLIgwqICSvrSUYSCnk-7hHGEkAb8tYQHlB7IbYPK3had088imUnWH8oDFdv6y3kHXOKKee01QSRvgcwar8_-kh6chDg67MOXrE3vGOjFALUCsGjNLjiW1mCjWsKrvvA5IyQSgrTDidYI6U0IrGXrxapetXeDlMqtvQ8xADM8iqF3RCKeQDkxkWPDjDDqZWbsqHLGoUmx1urSSO5VhTCoHtqsxtYmt56A8HfB8pGi9YJP-PpB1ak-EkARy1-j9KabskBMfYIv1JVKssk47CYU8YUb2324iXUh5BofuPhu4hKaLYCj6HEZl8-FnF0Y0yMlL8-hyJo-avqKfxy8a4BCvh8_3nP02ZXclrH_budOcoTD8kjlS9wuo5rD3Zqep4_DZi9pYKTFCpvTIO-ECAiW0huKhm7y9KKtjaQ1kh-8PPSko5i-plNhcC3PfskdlQNGW1FJADUli7n0Yyxp49qhEU5W7uexrLeYXxQdQTW9ET3AaPdckuXxpBEj5ZHjfa4RnvRtXU6YMC-QUO6-j5rha9XjHJ9gsMktGXgwvsBUTCPcxM2wK6sS10WgxiYPD1DUXsvoW7iuW1ozku2oc8FDZoEAoXSEugcQ6WHw325jmTT_nBq_Dg0RXOiu3rag_Vwkl_jbxjfKm1Xkm33nLErEhX6cr8RqgJO5Cn6DTAxrCU6h3izI4ZReMuj0ExZKHtTlZdqJ1cWS2P7vdQUUXcAp_zrlw5wyzKCMvHoRkzyFSniboXLGEEr5rNsWhKOZ3lGvq-CncAM7jOoFTDU_cezIbVdJ2U1-UVLvHXUO5S4FZHpoTb1DR1u-XmLMyKV9dfq_C3PCxhhYe7cGskYhJZczPLu3IQYyCWUXlIsrcstlZuz1beD5_jGx5oWJuTawC_-QMNn8WPBk99UfUgR-OCFLQ_StL3tACd_1WpSwclgFOLZiyy7mUOI4yT8M6uvNWjIiQDXrWPimwA4Z_4PmGDw941vUENswhFSBUuGc2cC99ipdYsWvg9H8q8YQHJSPqXQ57Nmo-cCKitLeer1KOlpltLcdFTMVDmnxqjK8N8clAfOKcFnrTMyyv_TqRL5w2zt8N_GbYFfDbcxxazAY_GqZZlBp52azwOykh6Gul1frlNZK0o3SsUhEidqm18HZxQ9RhPs7w-93PQCAoM2J0uELC3vDPKD-hIrsMcxX8T_XTexYHTT5JQ3BFelc7R7abDaTG7cyKfgBbGTIqfM5o_b7fMLC7CTwzt8kJtxkrhjXy7boL1WhmRmE389NvAlAmC-3JWffy70aEiq98AvD3RlbglApiDP77ic7goVpPNYXQc0ig1mTdni1UPcMmJePUR5a5DYTC9sfhUMhwzPJLq-Ad_RZG4-MjbWlxtv2zgtBwnS2I1c1VuFGUn32cvTDxIOpaAv7hRJciyMNxV1U8WOz_rLOV4liDkAps7dv8h2gwT_6S2VXzpKYXKwCdsjZsC9b41d_XgnH5PO-kem8E_AWEAgLlkO2UVTfkKxQP5EMht8A07tSeK50gJfRsT0p7uIrK1f78teQD6pMj3jnLEzdWafbU0hPsn_DneEL8eM41JaXLOhfsB0ng-A-nvMB33XonSL1bMVIhhVuMxPkB-4hYtwpcX3EBleyJWPC1OkbwUMbAsXuZmicQs9xTUytmOR-iSjVWUwtrlbfGWY6TjgKKvCsL9LxDaknoKwunVoL7ip3rjxftxb2pzHNxCTfyGSZ3K-jRMjE0qRLMQjmzRRptZQbK52hP2g6K70dP1icwtvMoiA2Y3TTCFe3D7YuBazyTK6Gst5S8sofJE3bV5uXx-e89n-7-03Gut9lqMBPUXicqP3acQ2Ijz1rc-JR9od8xborjnmYx1fAjtckPRHgq-PZiTq3w_sKWpgzbcAoINBbcKjDgSoDbBXguFzdSbImIXFIBiNBpwuNyVPz8yvMT-N8gHxDWciMpsNn3KOIsSgxjfqSJy8-LN-JrEZt2pscMgPJkQ4xAcuG9IyPNhtSqgbv9EpClN5rFtabqA5dq_OuD0hmK3sbWP0EuRuANBF3KdmzmqGyU9TUYhiUidO3y7iIPvtQy3fb_LuGnFyP5bCBuXk4TyRKf9ZtdqgtoVEN-fxeF5cKMI72130PC3FiwO1KKRw6Lxo5uHmfMnOhKllAzW1ODqulmLOF2-zEnMIzFE9xnV0CdcMGx8a_LhHdowUE07zF9k8uTbeJQP_hEMWfXJ1ZVu1vud23-DWdadGGakPx1WJ8RN2ATX_qPLn29wjcOAhAaSz7jjCQdzPJMXcGtm_17bAzjyvXvnfD1F9QE0JHuOKpU6Cwvp7csUnUtYOieuu__a-DC4j3O2aQMegmmPDbefH4ZkX47hK1qWqCutoJo5nH153l1zCcejn2Ylfn4snQine_f6CriJHXEJxJJQsEA81Hv_UQU4jWsRQFer7jAeq_W6gczSTNuOKpM88Ko9nkMkMJgE_Tx0kgkSFBi-s2Q60Vhw5WJnx73ZM5DVXLpl1FUagYu9SNRfiCJExO7gATsxbA4_RLj-IvXZBPuB-MStroSfPZD0SeVNHg9SyNd3_0ial_AVS20a2y85gV1lmJeRaEoeWgmowaAqkFjHTfCXFTuWTTm1eHdMlzN7DwPhgyvkHNdssJofRROiDbS0AJvZ2MPpObFXOGfibg6egdY_XsUO14qFIy-cRphib8gmtoh_6fKZWM44Gh-CadHZYYlEt7w-1_A64-sucjcsIKmsNFLHGb08XfW4lAqhF4NH6bpngOf24KbgNPh04U5Mxmrdex02ZoD1ChTSQdmKhJ5k_D3bugIvJ2klBgg1E-QGQVSNKVycuI6OViigI--12DtH1a21A4_SGCWjgO08j8CbyGeMdKI3HlYyfZO65le2Hi0SBF76XQjILx6zfLlwN7spJjW8iuTW1sB2TvbrwISm9HAB5SV9-z_yx6lOlY2iElF-yKS4I-Ge5GQj7AAe_9Bw9MQN33DlsFXPTCZjFVuvy9y_tVPrDDQMyd5NhOuPrWFcw-zbiYGc0jIZ-_V9KoDn8gcUWvMHwD_B3374SJcCbA_s2wkBIa6-9Zt_NMGUltWoKE5am63WxtboQ==","summary":[]},{"id":"msg_0cadd4100411864a006a4e12a0e6ac81989f108c16a7897f33","type":"message","status":"completed","content":[{"type":"output_text","annotations":[{"type":"url_citation","end_index":213,"start_index":138,"title":"Hello","url":"https://en.wikipedia.org/wiki/Hello?utm_source=openai"}],"logprobs":[],"text":"Hi - there! Nice to meet you. How can I help today?\n\nIf you''re curious, I can share - a quick note about the greeting \"Hello\" from Wikipedia. ([en.wikipedia.org](https://en.wikipedia.org/wiki/Hello?utm_source=openai))"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":11930,"input_tokens_details":{"cached_tokens":4352},"output_tokens":2042,"output_tokens_details":{"reasoning_tokens":1920},"total_tokens":13972},"user":null,"metadata":{}},"sequence_number":22} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream.yaml b/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream.yaml deleted file mode 100644 index e83a3a0..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-non-stream.yaml +++ /dev/null @@ -1,147 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '404' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: Hello! - model: gpt-5-nano - stream: false - tool_choice: required - tools: - - type: web_search - search_context_size: high - filters: - allowed_domains: - - wikipedia.org - - example.com - user_location: - type: approximate - city: San Francisco - country: US - region: California - timezone: America/Los_Angeles -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_0a76a04c4810e3d2006a4e1278fba4819a8f3b2d2330d3576b - object: response - created_at: 1783501433 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501455 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: null - max_output_tokens: null - max_tool_calls: null - model: gpt-5-nano-2025-08-07 - moderation: null - output: - - id: rs_0a76a04c4810e3d2006a4e127965b0819a9721d73432b90495 - type: reasoning - content: [] - encrypted_content: gAAAAABqThKQommO1IuNkDC0I-quQM9ZjsIJs-ry5jyFMVQJibrh4_ZCwTYh9w9xFdxAY0esjonYIJrzn3uQIlmUKWgfqpUMzvUIEn-og_p58E0118m3UPo_95sfe_YlZx8YI8gqmXKmLJ6Av2keBCIPJybw7udGjt13hmuqfSQ0YJpDtSXjMLLlReb_WTBMS8QtLq0oskwXq3S816ofkb9YXx_-S6kOWDmkaz35oxVjrJgaGaQZHb5rln6sPvpTD1UsLQIBXBeLGYNxQZZDvnGgOJfBEqjbM15K6QsFSFjJ5cvefMEawS2RC2b1a73ph7LYLL5dvgXx53fzhoXf9sqIUxG4PAl0sRj1F95jSF934Cvt-GW1yquqe5ofNJrHiO4Iqi5-k3ma6KVm8WhdSZ8EVFcjO74KJB7GyV9-7cXMP897q0toEFe9ER8Nafvx0_9cNVda-BrIA1M1jdMXrMy2_NgaZ1gXpYuL0yQK74KrYt7bKi6JP2kUK6Nsc76Teawo9CJ6Cc8DZeWNd0DI6LkQTFeZK27iq3o-MMCOJ0rRx_Ue0fCJw6sQH6DCbSqrqQEU2ZTxe8dBqtN89kjqeNX-tIbyLDnCU2U4Zi0SGaC0zbTwOiunQqM5QB5-4Ni1QZ2Ac0y-gQdMn9k-UdFkKa3MywtA2PEU6XK3n-HsKgCcGMKcJxKQHXVrGyinEKik2VFv7V6UGWYOfWDg2t6L6BWq6tXNupO3c5qcZd274VlO5VDEtel6Vrn6ThKksnSYFw_mecx_6e6geOPupSC3PUoGGv_xCPgwWLEQbx_UW6RtztN42Q68ElK8UmtNinOn0PIxZvmbSN3Oj8LHSWa9SZBHwGryzjG0h3zhTvlY-tdOP7Gvsh1U3rXjrUs2siPz4HowPp2TP4RuoG4N3zW0NcRUZ_lLX3JjxZjCXgvtEIup4iPB6B8qyct3YhjLxDoy1kgjiO4PFyw5wqrBxWWPayz9TmXiOCiA40OjiO2kxMawoIz3sQAwhPbjfL7KARkZZoqPWhFqvaoKDd7ljpO3ctVNlIMGDq-25NR0l4-9b_Q5whXLLVe-2BuXBNLXSaXnBLX_QcawHR-n1KUPVZ8sN_jxz6dfWpxiW3ke6G9xzrB0T_-giKm6bQkSz8bYwu0KhTYzLt3WMDWTyf8FJPxLKz595om3XZedI8NWmebqCjO2QVr1pn-l5MzhhS5e4kn18OiTcqtaPoZzxwUWAVwL-1sN___L9k5ftXpwBXlI9GN46Edo_dQc3SVGWg6tgd5hRb4V55IagVK8Va3GKmYxKRAEzzq_kEmYEqhyT3ufh9tD0EH3V_mwNuRGDimGAGCy38i6anc81IIpSG-CuZkR4KiUd-zdHM0C_tEkhfN5-wPqacB-5Lt5EQVh_QuE8gUg0W3rItoFCWu_z1NkUNfjuQ4fhKFCS8By72QJLY3ugZU7MmfKFhdKozbKje4EEl83kEAuGZgRrzDzQSdzb822Ml4RRmHQTq4rQVQ6Mfr8cmnb9SWaH1HcjBnM47KJxG1bn_zARYiNER5_atft5ikTc9e4L12uhexV0CU7hFdFaI1P5rj1hKT9Hgtkk5II090xPEOdoL6ZiJbO4wic7euyiS3J_VpiGwZ3KO5usiq3tO6knSIDbggGYoleERQfxIpblldWNIeKTqhZ3atpgpOJHlgUo-JK7pL7GQxvLZ64fNLj_K2bDQMDZtJWIHub5-Myj9drMq7vSqzh106GSMIdnzzyvc5ZFn9Od4eZKfc4l6jRq1kkmAzvCg933d12Ej9gAACGCRQ22Ce16xbZY_SWctO9Qp-uUwqO-ljYGPKpWq8LoXO1cOhz67VL2kUUtAm0yLdsBR3zlhoIXDRyEulFhJGJVVvV6WT0l0j5rT9CFecKhFM6tLd14vt4-cm7D1Xh9ruYMaB4_fYcIpz087j314smgNd4AlkolmXyDEdT8bj719SGGJIgYbul_UE1x0dGyI0kMhlOvcnSCPOLsMyPNBJ5YGd4D5Jo7YWdly79oRStHV6fgS2rFwzIWqdTV1SDAXF39tdqUpvc7ZGm65SqJOecrBomWFKuk0Ees-FpJC9VB9XHjfR39aLsy5OCa_a_t5DreLEsJL5nikL2Hy5MX6W3lBf5iWkz3aPeXx4oqlSdORQRIkM7PqEhM5kaSfJpu1n3oGt7i4OFhfVzlG2YbCA6iViR4B1ueWXt67YL2QKf68FcD_t1xcNoTLP4AACmkqAZRMbjB0g-3lWBZMDwQYZb112l6KwSux0LJyprpoguI4tuP6r1VDzrsyqHn558TXbvVqzRs-IZ-SRdy7L__bcsx7v9fpKabG4Ac_6ZM-jJT-9ZBXFO9cXjH5o-t4Z0e5xlBBg5NVOsk9nCkC-uzokVgUdLaA5x1SuOlsEr2hahp1CvqvcZdMZIg6RZC1uuiO_C2qaW9eGv40ksFk2iRWHSZ40MflFSpTW-ilhmWf6PykHeAxsq87cN7DLWXsNI_nVBkPz8-tIPkNc9bfrvn-sLNAaNm_FpiZxbIIxOOiXuWzSrJYn5eWOc5lPwFfxn2YQHhW-FBnPlM3GzdeBIOxjf2hmXF9SXMolie-MMdfE2GNAd7I0ZA5mni1yMmxiFc5I-gqLja0J-QorOh8_qk_2akps1mIL5QWhOCIP-lQpamOmHJfaF2fggMHEXbpog-uAYjlVHMJU2iW2NUWLWtnXULgtho83apnhxhyg9EBjvVmwHWIAKGtyC-jtDYEDFdoE5MuldvaJwp32K38EXGrjR159a-0zybbINuzgVkKkjJUaqUyf6P5dE0WmXAN19jglGu0ykX_iDW22U26BgHmihkr0l4OkL-w1NlsZiJpqJ5Z1jar9lPo0_ZyE7cQWSlkg64gvPMZo1HQE4aGPIEutp2TpeRdNR_0Nyy0uS7Rug12GIvLGTE4WGRkmMH1w43ZYKgEMOKbKAUVtOz-lCXll08102pBx5qmOX2okn50n-wZLx3Qgboha-ev2ZfJsC44iQVw2_0sSC8v66liwOGxsrNW57S4IjI4yGY6EBpABWNx8CCKzxRnocrOOr-jgIMVk1imFuoVQc0HAvOutNhMOdYvrXwSN5ojTlLusAV34Ugjzgq1-fIE5SKEGkrKP79fLv6hsS0lkpZID1eNj-p5zcYyeQyhhN6hqDs19py9ax1kDzYk1tbLGIJiyggcStZQuzqoLVAqfB1ukpyROWqFdqF1ufbNe_gUrxqtiGyoUXfnei2b8RwJG89b-eRMXoAwaxIjA6wqim0BdQ8hkgw4CaTWb7PTpw7Dh4-P6_H2QMIMIEVYigE2N1nqWBlysRtPISsrvwpy29Dt1d7oFrDzNrljPK_Jq9SuroAKOF9rV59n5qxCk-X4UeHv424owt6-O1m4VjVkMpCBAZwBLXMA-dNIKSxNpYrAC-XT7Ii7rx7CKMyFqvH06mCOym4TL2GPkEdRADdq2O4NAj7fk3gnmIQYHA9eo0QIcouqSB1tSCvKh54mYi3Btvndqh36DT9KOxHl5sEoYHMGGkl2ZAcUmZbMCIzo6xccYRA6INeBsHOobHmf91i2Yn_jambaEh2yoHtueBiJIigx7WH5E6RAM8arJFvHo9UDz1-5reVZD0UkIm_LnTj7CI7Y5-IgsabQGFRB_D5RSqeCoknzIosV8P5LpjuQRNemiq33hYIGMhJAmwOav9EqFLGVrdmzWYo9fcTBwfDEt6wmPC7HRVYlMDJDRVc4TvGnjBjnWkPtyJlPFJpG_i25QM4aijgElFFcQX-buqPLF7s2OX6IVM-dS58M7YgfVxGqsVjN_LfkZoNRcal0KJ-mhOGIM4f3NmzzOMc0C2VuQaikb3PelFTlEYTC5Pdrnr2-UOGxbILF1gkaMFqJ7nmAf3ewB_WOPixAJvGdqyBFl0GzRVfHgep8dMUK0bTwRFC0wZ-2cnltgiFAyzrAh9ACz2xcf5Q-28gTCrKgRO7r29LSIG5V5hSt_O4Uu_q59yMJn3a2NSi2gi2wCh1tIhP0AXBOoMF332Y8GVHTkwLKSuj6vyRv4YSi2_A22geARpL8C5jc086xkmQqqqIdaZP8OrGGpTIC_nuVcyQnvDsm_RWXfvM5Ob_Q32WK6GTIPQXz7nBrdVkB5UKMe6yB9lorTuDd8gZb7Irdt5-NCFsIZcw7xgztmf2QL3hdJdh87-mo9ZdCS6qNASkCTsdgP0y6HmrMf2kvDBlyPTQMlKX10e8X8xf6e4gn4PsGfT2bgYo1Q31xrP_y1Mx4c3xKf9BeDZRtwHIDZJrnMqB9cA-NidldhQBDjXFwsxXvi6iore2zs3xcoL1_oH1VjJQfguiRAyO-0tjerznL32_9KKY1rGVAVo62bmlU_DgdXaxtYTEpkktNc3la_iNzK_gXZec9g3k4lvoyUgl0VB8CZ3_35P36aXGkbaQNwq9dVEmCl2H3omXmkQu1s5sRtluf2Fa2BiK8AQd6cpREWc0Ak-LVhWgJrs8RBYIz6LJI9L6stLpKQe23CdHn1zlh_PZqqLVq0SnuhBVA39OLJiFul5jZD_j-eJMtz5TifWSwcfc02sAKB3QS7OeC4D8IDDUMfXq2dFaByCwSOOg9OBDHU24hi_ScCsrrL2Hv1Do2rt7i6C5-AF3Fa6CT296uDVdlnDi-oWbHqDKxDTbbXJKHL2pL4ZUBY4EMt4rG4P_KeZa4OV2jT11s3eTvpvcHzJYiv9kAUwr_YaTTgidB1HKCoqytvI-kKLmdiN-XOMnlbBNntAqihq6f0QmYMBZUyskUvu-apj9bXD_VmQ-_UvVUTxe-PbTj_ggf_VIRSLuBHDdtGMoTdpzXJkJt2FmCYmLOT3bnjijB9N5hDzz2vOGLhItqhqVf1itCHxaAibZfDO2y-Y3EFyp-czbQBi4o5b7XmcCj9HEchoDTtTl8icEpFzY64IZvZfirfjW_xDRDtt0r-yWpRpIsJstZ0HNuW-hJP9PMj3aT1fmY-jo--mLR4LM_a2M3UwjzLnN8F-7kgtpPt7q4lSoV9liA863kLqfijLchO1oBdiJXfYGJ3Xod2GJbgKPBDeCS-bnXA4PmmAU0y3QXI5lXY0jwSvdCx2XyNqJeJu8ez4FrkeNBdOmOiHBTUvO9EZro0q7GsHrjwtjBMQB156dcA6e4ShrnaZnHJreJFvHEV_wB4wvQxvVdFgoSNXjL-NXS1mD7iUoqZmdTDz4N3sD98YbPgrz-v6xpfbyV0NQ7s6A3VFhD31KcIcZEzAeRV6wYXOdhgi5DZAfTi59OsaOKfiwmQfTjgeZdSyVtM765Wb9aCT08B80Q1gX99q6L6butiUbjgMV4z6xAdplJpS35ePoPP2kfcX1q6vlkeJc0YzvUFTAG0JZIPhBQtqJobuK-L5gJBiPAaOvSa6uqxOpNCBB_gwkWZpJ3FGG2BvuMbCwfZiuqttupjpbKqyDRzSssV8wa1xtvWDxlIdtcmJGdvfk8vPDCvRgnvg_UnYLlFWpVltmNNPTeKyZJoyNCEo32d5oDR1BgXoSdHQIAVElsWJH1TJlwoBUlCq1Z2tvADuxsB96jEmhWhdH5k2p9U9-R1-9B6GFNgXwffoVBkODkepG_p4mo9W4Q3r0-lHwUFAzNLJUOlk60Esee1boNJcL92jh87592xg1nIdZHDZBMSv-4e8c9rI3UlLA1q1AEa3OCbdfLXbaY3-3C3UXpw3KmIaH8sS1Gb6l248gBULeshHNPulTG7Kp-CBcwSOWld_dmT5kJKRN6XJ4tOXvglk02Ko0seQiQC9LGaGWC03vfnVCrKofCKKAWuJhEvbEL-s_pkGsv2ZIgFQDgFqzcp69EbvYcSno5IpyK5VBMW3xocDFjdd7l9DUUwEn9E8Ell6Njyq7kzrH9t6OqesV45aNab9ijDSnf_-3q5GnOh7U8wJird3FwJLeWRvpvxQUvXS_9jwvFq_QFlshQ8_E_7nt7lR7xhOB1y8MbHa8oc3BtUDuyUiQDbXBqX_eHJmoka5qcGTiUhdJEf1v9YYyTpZg4keiYPBRpvb3gdN0-pnW1VIVDToG4Am-FtIAVPyBCqnmuGanzEbpyZBQgyaYsY_BMyI7VUCXWiI9zlC392OYc14x-W7CSxPDuhxxHPe-YQ34h1zzaGtbQfxoR2onj4ZEpoKmdyxnpSAkWGe8ICraGwxta1PhBs0MtmPECYeTzCawAlKUr13MMjgsLel3aJsJOIMLUiTzCBpIlo6LQndOELSdx4Bb8ZHecEZ3SBIzaxrQlWPLs4DrOv5Eb4P6gKKD2MN3g1Oa9ioXv3eI_-cqrqnlGSDnT4yGqN1PNt8pwT26oVlGRepFR4KnEd7uxrScmouG6Cij99VdvUahSBei_b00iCTfHF-1BMAZCZQ_SOyO0IrxQm_Ara_XhIcDEhx834oSpiXYzxm_oIgztqw7TrHRjPUrcvzAGCybvb26yopCgigkqMTv-qyVJYV7TsmyzAmY111QwqMwe1SYLI55bejj3nEtp6us2XQeh0hzdP6q00-y-9F_Wn-dCdoIZiJRS7J05fsmDftrpxtOwyREKOHrfpztfDn8OgKXyKKMIHdUzIpf0UtwgsDDGw2hwNQdCYcpQwXq7-YUmCVc0Y86SEiw-WrMr7zBEPmarnhRtAQWbIZ7LSB1wldn1RI3MwBEAWyuzTCkOgRIRtaIjhCS8CcTHeX-A-PFUTDr62Y2gKw2P_p4Z2xDDCZQRVNW8ekDrIc0LVEYYSdqaSyn1Fy2PMRSgtlK66hZWUDjCeKSPjNHEO7oKbkavFl6nGe6oRiopusdqatJSe-ByNXMensioeS7UUnFjtXoXc-I2xPhrsh6v3LcEgW9-3MJlCgFk7-mRB4drW7F80DCln8r6tZ4263V3tgV-rz2vGPww8yMhAPBUW-8fdTAGgavnRhIevTkfh6SBZATClRNg7g4TC-TP2aID0-FI0I-7I5Wec5oFhEm_k09nZIXuSOWoFDHIXM8JTzVoSM18179FxdDjk0QVC-bEDcnDanYL_iknPPUUqauBCO5G0KlCWSa0_HuJABKSPR9Z_eCUQMz-5OTdpcKviUh_cFu0t2HZWftrttCpWH2I6NMw_yEcbmjfJP_vgU7K5X_xxYRffrTdD9XdBdTtEcb85ZYo4cfm4uqlUX6b3QBfihJwN1B6zVz9TUkBze1tfhrsdjfY7wKwJu0P1hwFz4j18Up-RNtKyFi3tYYRsDyEWp_f6UdLgmkORCyZUtnNWs2AWzksDVmDqY4zvUJbdFQixokocFRp2oVEh3P_UJMLBErmCgr_t1KNI5eOPLUBXDItVrQY8HMONVSiES0EqX_DMCDbHOwzonVz2k0LsLz6RIM_BsbmND7TpH7SdtMEqVufTHFFtWjJ0Xk3GI_lR_meGSGhM1M8dsvgr4ExvDfBaOQkJPNZnA197lbBnH2ARIn-7TI_xyaypGX1uqJswL8xmCMKhg7olVWUqbq2sGAg0xKDsH97P-VXzIDIb4VDiw7-xAHjdnZMwbcK82vuPksdwb9NqjVGci33br3nYruM3nG90c0-xzwGZzep36Zj90PPWCiZH4cn7veBHybyBOatILY5IoMXUYTREs04D58eGm3Kxf8cI5h6I9wk9xas7uB_h1g0FSqNYNbq2-UQs1WbMJtmoe7Y_o6a-4Bg-FSIfzeEebleMUsCujzhM82OgHIWb6k3HvCfRw1naoBaudCIWafv5nOLNF1pcOq7BCqxcZlye9_sScyXE_h0mH02xmj9jcf5Cc6_ZGjBuKKXkul8-R8HqnN2yayn_XrNkA3I5Sl2PRbkqUhPPxxkQOq7757YDmHUxbzRBJAsn3DPnAT5yrgjzG4chAT4G2oI5ZPhQnfS1fjwSIqlPDhEdb588x2sxUuroE6mjOXpI5K9EEgyWeKg8ATv3LxNEWS6rjVHW54GNqrHG_8e53cbX969_92sE_SjgjD_JG_zwUNWquSuo7ilPHNeaGxhIdPbACoA6IXahbpRuHqSHS0zl4HOLsBVcDehK4nT55TlkXim_QXUCZ_G1chB9dB1T-nFhclvhlpP9KtrKoRiqbzzDpDNuZzGbqcSTo0lzFfIzHx92FDM-h64iU8t4fcHWsx3CXJxXouSc7qAo8zumhN-f07XpX1OoKWY3woyngFCrXdn9kBO5h2kxwfkcBQIebheIcl7HCs8BWXGQozTBH5bBGkson5lytl_dYjZnHIyXxdVULYsQ1Mw6j8dG2nC_4jD6v9DSfqDQNuL5MS4xBef-T4sHK0b_vXWm8V0lQXOtJD1fATI4gvz7LI6WMtYJPc-_o4l-dK6wkjBYaO6yXxM8N_oBtHtLdwURHhChvhAVnAdttFdMfKcq-3jv4pygRgpuxbaTfOwyaUvlLOHcvRySoBJm5u91p9Xxd1XRywYn7kdRik7pMa7-Zo-fFqlp0eW_GApbDI6xsjRoCkLoWiwFcazHGQPQvjdwDLUbtgijywLaSyyT3KorHw1tBtOsqRQPaxgjrN8OWjX-vfGjpFvHw7Q21lt8gGq5z-ygjehaIpRqmZsJD8JWgH6wvV6uMKiYm1TlpKHELLkEyKVmjdkAd05wg0_P5e0Ld0KFC9qJlyN50GKzAl-ZIUDsh9W427L2debKPMTM-4Q-aTCmvCds-mrdHMDERnqnmnqepKpL1nXRkeBDTCW7T1Dk6PUoaOEo8qK3JVgvtpyTKoaGoLsK1qrYmvzytueiQCk3MQI_jY305tqRpnruE0aVWrhq0zq6-jRr7bcqygFBNee0V3Jhd0fu6YRFTfO4B67iExh9NiQzn7BPwaMnyVcjJKML3tb7Wtcichx6hh2uwEvVgGJ2JNfqq5mlTtR_yLBUEsgODSU8WE5KshDn7W2T6sUpmcbZ0Qr4-0rczg-4MH6JZP2gA4g1puzQOEfTYP6DtqOrsIr8Z55Lr4-BXOQaMjdF4rLZyqSmXycQULmT8mlMYhR5bFhjbo6KD3-LMboyEql9RSZ-f9WCtUnDDRzxQH5ZO3R08fY3goAiypGUvupxceiNUlU5faH6mPclWhkvWQZJ6xqTibJ40jGAhZmu2VFMR1na9v-MCtdr3QEdm2vE10p1ZA-WTD0mQyvWXEG2p5r45QfOcOZgwE2J8JHbgxKxiR79em2-Xp_YTKYElJE7D6MpBT5OpaxVGbQgM9V0OnQJuJWR-TOPEGPWPwMmX55DENMpmYurkjwQSzDemCnG5jSLRXwREUejKLVmrVXsxDRZ_rOodIZl1QN9NbVLNFCXDAPAZL9ih6RgMj9WrNKDRw7oWsfoI-4o5plTPLPnLRNpxOVhrZURLdF5adeYuz1r8IZoU3f_8uFsrqS0ghxaZZj9tD-uZZaZZXLkIYivEa-uhqPAXXxxI9BiJs2nzu_g3wMsdoIMxrQwm3FaAOXaH87xJxXn6aQiWeVjgC4aEyKiiNxaqJM9FZ5Gui7b4nZqBxQCGJacs45tVMNHwaEiiQqnmLLCjwh7GReBwrhTcLYZFXWGPRgWpEiX-Q4_34hcCOB11Az65-n8RdjChxJ5b3rekqZ6FaKft8V-_KlUnzv-v0o6TDmnTgekl5m8Kads0GlB4R4LxO8XODp-eSwYDYNPf4Kgz6k3aLRCHCWbdfvpC7U_bw9EXIghwiuFDKE6fB5mXOuE0qxICuPLZHDScKYDfOwqP7XYkoR7zHVtAezCu3-q0z6ImP0AUIFy56klyYEwG26vdCgD-m4KJFA5mBeLaxQ9eNsognUbyDaDsxKSeZorCYhkg9OyCdKZBAxmiMlDqTKzyleHpagXnfjvK6-JxHF1xhf9FJ9oKaj_Xvh-hTHaSvT5oPAO5FnTbdRU2-e_9EQcCqzbukQI-Vmfp6K6VJkX4s-ZmuICIWWafgMhmNRcPSTTSZON45YKIlwr736D4JTo3aFJyZDWLo_7jiouHVqDKa4vNPPYWdYm6S7R7IevgnLSfcrDVOxdJC9swLri6Y197wIdj8CQqSuQ3CKs7F911Cubz9jr05nineumJEti8uMbOwlChdYXIFrL_599CpgYTXK1PP8E2S45MdVI3M9mj8ytxJZt07lSYuFZuNqlNQcHrTPReSVThMRnw9RCg4HzT3_me4RNHobxD70GVr3YBEWpHRl7BCMLGvNQzpo908JkNnDNTytvszyrRIjjA1bhPlkd5qYKDoHJpt0otBqD8csED62qe93sp5ePdRBF7hpDp-hHXK10cC9g2MumCsJLAo9OyCI86MUec29x-U8UFVbwb0sp3ojJEYQ0259q5MVwY3BWPdNz0kfADExQ4ikAcWEj6nf448I2VgA3iZgoP66WDVGoY8lauEfjsQGkFnADR3LQXUGPR71_0DJB7OTsIQ_xJ7T4l5T2Awq93ojEj9g1rk-aD4PuN-xatqYSe_QursCAqHvF33r9ViR8r6WulY1_uKkOaQmwePx4tCZAaCsWPDsbLl5SKzNiOWOzrLVVv3XhV_Mj8EidG_3vcKCCqI-K9rNggyFj5t4QXeh2BP1ZWExaMp_MbbULv5RR-h8IhuDg0Zg03nsXfOJf72y9YJ-3pn0mjyXbrqR_1g8jMLsTpjzsRr6pg8W1A-5NHh0jjlqz_IP_VQ135dYJ1NraKXy8nqaTsitB077W1kDFZ2RcqZ8ir_E5-TcZjmEF5gC9JOYvxMHLJCj5hhUh5fbrpxLypq1tbwVjf7QqSXWDW2dQ0vvKjCgOZfXClNLDjcpX4rwy6_DtqTvesWlVQz2lyE-fPq5b552fd0-P_Z_cAVTWtNIjVNR3R-n88w5FCcF4ttJIyYuXDEIVdnb-pn1hkmQBDTV2CSxO_WH0niaJJNFsc2tlw40kywRuf8-3cmsEWZ6kIIOzxhTuvJaC7Tlp5FrVlioylW6HFXjA37DHIVDfVnqGVqROexZD7DTLyU9VeCPwG8vXrUHNTxqVH591IfFgzrjZqChEoqXpKrm9TTWS5egheThyyB20JFilQq650co--y1SWNI3GeRHlICHsQ7gW7M8Xo2D6skA8lZgWCqd1fFOIzZ4tefiLpGiemB86sQNKP7cFhlOIq6iJgWZcaTP_XS94J4LMAsV25iVq1W6wZV4ucqZVyYfJ7936mgNgRDUBFWAoQHQcH9WX0n-tDcSWwj1SMD338LR-xMh5h8D0Re3MwjP6n952Z45eInvZDJWRVKAGH_55DDot6M7ELvSIXkiGab3ZfpoV0k0Npey0diuzpYFayFHgeUfk6G6-_BBRpAKZEzIuUa8zQIDnpK506K-JFPMvQB4tIGowahqeEwXpcInDM4kwtpN-p8X0i0xCshMoT5gnUFxLrqDLyXpWocWl23K4bJChsn1ab3MvZ03d1eZ3phl0u2MzbmY2mG2s5cByeQOK3zapVRRT3iYzF2c6aO1gwe-Cp-E8KZe57l5pvDmZP5AsGpQAnjx0Vgb61M0DBA17RBGuYbsK9JpHSQ1unRankAVNLHDoBZGVQsBHWQqw6Wk09qv8JbiuN-3L1S4tdJnqVyHZhNl8xVxE1y-nLlFobw90ao7EAdKIPqKdD2y0saK46tiCFtRZskso768PFv-_iBgVmVlYiocug3Qv8lh4dkrNleXa01rO6xuckWgYNX35Z-qqrz8Fl6rDOx-YDvJpk7CoRG1-iXMTaSsfaViqOCBow8-hAlsc2Q3bc8kjlH4uQU0EHwaFTVC4IjB6Apk0xIQq7VxhIv2LnQ2u9VhLNkxwF4wmX3ZARhtmUrOrKpIFgTfjoW9s7UfTWDSCFy2Td4JJ9pgfaDQXCQQFoka1nSZLX0OB7XwwStgJC3XoSY45qbgn-EJLB6AI7Fd2DbsDKwV01spi1IIaTgih_8FjmfSc0tiCnekE5jHwYHe-aNyN0yAD0i-QcLJYtW0oxS1dEER2PZClUpLJvh1SQ8QFWVX8loV71QMh4v_5XoK2GOwSMfOT8juoo0UFXCBxaEKPO6Oewp_DFrKviYeaJ0Bo1cEncWasMQQfz5S-YvLRurnAP8f2R_0AIaGZbSDRWv9R-RfFESjqR8SrRPoNXKv_3eHD5jVTzCCoB5dcfjVqHHjvbL_ZDs1CxNv5QDgZfoJZZ0wJZyiLI-xJAZgvRfSB0siknhPgs9cPmODiod4_k4gZKHOVY_NYE-pVnzNLOno1JogOstOUyT0Gs7K-O6whmo08dKRBDmyvLEArpiw-Z4DvH2uhrc20wfOoqn7Vsz2dZgy07FBFxKOibJmVTByeihYTG2zJvjMBpWDHUJIAdw== - summary: [] - - id: ws_0a76a04c4810e3d2006a4e1289086c819a9d097cbd2e33a467 - type: web_search_call - status: completed - action: - type: search - queries: - - Hello greeting Wikipedia - query: Hello greeting Wikipedia - - id: rs_0a76a04c4810e3d2006a4e128a5fe0819ab839526fce25d105 - type: reasoning - content: [] - encrypted_content: gAAAAABqThKQ0_xAzRJkAizXkzECFQWBjSWzD0NSfOTVkF9YxBbVViz-KvSD_lI50PXIPJKcldytOp5_sD09OknIpP9VZ1oyoNd-pUCPGl8_tdsPtYKBCaQWLHQ9SY4SEKhUUs4e2TzXjkb4HGgMdJ2G-LbOdoF0FaYQpvwzWfHnJH6PCxy3GtsJE2132f5IVM3ea6u9lZPoAKFx6XYLgHR8vNbbs2FWmPNjlUOChLu2DzjlYoSGvSZGBGmRGi2Bdt0cf3SfsNKs9O4yICLy7phOOJSKomXJA4_wAx-X1sk_9GiplLz1YBFOTmcDBxaUiq-FaEhyHqdiLx3n9_2weprrg2nOZbmBd-GGhI46J8SXxgNB4YWS1ElEsfPn6FDJIxpcTA-FRggVX6oSbafixvHtiznpgcpvMmmyj6Ku3wwS92LDApfNC3_LvTbHlM28Eu8L8du0rUe00w3AaFnMF1RaWuUXLE1V4IyZg7HIDRMtt6bvm2UHFy9SJZzvuqxZBKJRGjIhhKtrgs4PCkNJDbPTSpv9LEfmhpyfZf1GTHv2x2PvG2oB-58cAcgyWuJ7_PdZkeVxaxT9Mb6lrcFfO1kIL898BMjz-X0aIAjVcYTv3lHBD-Tq8Ktr7yuu_6L1SXS8fFdlYEc98Z7nYJ5_9Ffi_Qm8iO3KogUSdHNe2QfMN9jaB2mwQA_pJJ69TcCRbG8BcEbo9w8nvtQIBnUJ9k9XsbyrUOcrPDPAevOec8bTRmaG3CSn8tUgIDQzVMuCqhP6x0phfU9saZx4fEXrCT6mOb3l5wTf7BwvOWhVFRTroDeE0HRzrCEw-1ZS6oXEjrayXAk8dixOspKqdSbzf0aH75hDzKQgxx0hkayeP_3LQe8z3tVSAAk_pdRHkECNPm1Q7dXa0GES6cODFHfI_pvPWXTFFNPzGRRscGXOmr6XH89XP7HlbzpFxQXmzyzLgnJ4eL1dU8toORXBANQ0GZRziV5Ew0P95exD8VT0x9qz1R0lsljZaAfyi6rDklbYmZ4rPXp1Vbb8Z15VMfO8pLhckzNlknKrnQGv-6KmhNL6q9XmWM-UCrHkZIGC8M3IBh7wVu3ZC2sp2afk3ehKSKZuM_uR8iQRBgDsZIzIB8XSEiNXmlPXsZ-ywYrbwk__RgXMHv3i2bJ6bVuHC_X3WAssb0XJ9hGXwuPzvY53cXXqDiYGhMwFZtp0pNDXtlZcIPoLR4LANArqV_ngVtQ2F1tsUEo4B5w5e2V83X9SEjzHUjJgayVrnnBKOKfFp1m7-GUBIqbYnBYxBMQfzyqiUWgZDNEhh-0ZvaCyirSWN1YNgBThLNXj46LZ4_doXE8b9bZ1fEPdFU7O1AFGDTgaG-KS0c82e2A3kLEt6ovTLSdj0WfR0xPxymtbO2RoT-bQR2Ui-_DcT1qfF0IVnNLJg-5pDWmubymJuOqK0R8D4bZjHX1uNNGL0H7DIrUKkbYaBgbW4c7PnTMrUuyb9VbWuNIhChybGDZqXAUw2GFvE3Qi0hT3LdD8aZY4rUcA3V-H9FFrLUGGVvk9i1UODxHK5AftYAWsCZymHkUOqAbcB-4odWgyEw9Bqm5ANpRyYpE-jidQ9vcXU1xfh3NdLHX7PzVQC9OKZGhoBkhYAfTSbNyRDItgP2EraWIbS255ma61lVTniaT2XRvhvn-_AiLhFEcigAwQqEIEqL5DYbSMXg3l64DofBXILsPxwLHXdg9Uvn12LGy7s0x0d3n4hwA6ON5EpwV---56CA4cqa6_CwhWZ3-icSmWtuG2t4P_Xkrl_UERzdwexWC6W_zaT2YM9ZOnK5Cvgl1Gshgc_CeJhlC9LEQA9Z59ZuyLcqoLba8TJjfg_0J9JvMbzUXm_E8vDLII0TsxysKI_SnYckREqiKsx6EkfLJvLRi_Wr2Mszh9vEggp6Hgn0_8R2HzRyRem2_F8RdcuK2BVttwmgj_mHV7n1Rvw8i-WEzkWGYITOFiMfsg4q5cN5XoxWk9_8GQZVO9UBzWIFGwuz4F88hE4wUdjJL5G8IG6SklDB191hCOAAohZlzRyDJYfQjOiJTQ-fl-qd6Fzk1ufkdAri5Y6h9sB0zDXvKasRmbddej9GgET6w35hLQ84DiAr4iDaha6fC6w2Ts1kF0t_KyImQKtLjqrrIEaB8G0-neCwuJPPcudWu2N-SxxNwQdWln9kL58WWCQJyeSu59qrcUtP7_ZVmSqpS0UqMzsbJCYjiMy7sGcv9kVBb8Bwh3bPvXXE7xpT283PZqF0r6-Xm-TNFIBNBQPTY2m_0x17UBKaEvL1QK06S7LbQJyuLNJIIkAiSszbPGhRxPm6BolQHma85Lm77i7-9cYJyIdju1MvZtEJMLWdZAhcDeHuWw3Tg5-gD3MgJeBfT56qAsAW6vobR9gkLDskuXhhyJXE_vukhj7WKTs60lb6O32OOUAbrTM3c3nHBun0jE9cXctpP4iQlgDGAQA9CyKy4RJUF10svZHKeXsm_r8uS4eAgsyrbOo8MGc8eOjWdhMlq2O2OHD0xwAw_hVY5F4jRziHEO6oqOviC94uKmM7WQb2kmhguvz_C6n9anVLGi5izeQdQIrn-2iDwjy4GbpdD0Q7BcOcqvDNSdMoumLE5tRXCW9U_Upcalb9bIyB8mi-QY9DMXCva92veKGyh9HfwHviuW04eyiId8-OznlgmWLz4VGihFySLybvEgrwi25ALDk33b4HILy-WYTjbkl7_dea5zEInlgJYFIJ7N-VfnepEMBdG3k2s0C15OMKrpGJHKgfbaRZ0P1k6DhLwjkP5DrS32ZzOZ96f58qT5ARcQp6bjWvVew2AVc4xnAWiU36v4FjQldLtH_XEOWbCO2B25Layw9pL73ZzBxwuxVu6X3Zeb1MIcSuxJ9Lhd2x8PWVuKMiwUxO7N-p3dU5O-6-OBwZB8cos9Qr1yGHvZUmEVUJJvaNGlY5CXGEVY6e2Wl-jONUNbLqqDDDpDmDRHuC2ELj7FsHo_MrdZ1YDWSE0TPFgIrAtvTm0y4MEGM-Tyw7DDQaVNpBt8MlAK_YU8QSPbXrnWhMm7WywfGamNp5YtMSie_PTI8kBG6lVVjgJKaM_ToQP_0kqNtL9o-OBAXEpYd43bnqw3TozxcD_bYug1NB7EIFIhcnXfrx1-T1_5MrrzM5lGcXAv6BLX6DVPM7rET7hLcXEIegXESx_FAF12FAfb3Hb0KLGiMFCh_mKot4a-SjU-kjLTW6QFXPcMMCMoAQWEchz-Jq8RJJG6fkC7N8G7CdNnQUGU_me3IqtWFS0mNNCyLTpKeg9rz1_lXhcrWMFR4eLfrDSbN2KR2O8GaU_Nwo2AWAxpjt4iS4Ol_m7kBnMNLJDui441Jz3dvYZqNUa8Zs4l0YhySNtZEyYwKnYOlRj-lbaXywZFXPYaFA5gLRvPhRvf2R2MkCKm0quDX__dbkUgWbIzDGHaL3C2mkgj9KrjZh_1hXyPPfCG2INTUQHRId1UW8AYTSp_efF-caQ6KrSxLYPZzgAdxMaBuSddF_ALlBIYH1BfjJBzFHiCThn3N2g5dMOyQUHIJrhW8qq9FxqOxNH06ul3lybkSO8Nsr6_9uPjNCign5avXjVks6gxP_so3gFCvBFc87dKFKDipKuGNdVBYFNdVnZXE0In02Enzx9H6lZaIrvHlPRQaqrGf0KLgf8oXGMJdru2_vT4ym-RD40y3vHa7SBShcVqiuZmxyol-iRIbuhXLZc1l0tF5SOd72dG-dkE1KD7kE2H-1J71gsOgCfo-HjD6Fl35tmJAHKIoOtnvprOsW3tU70IfO2I5b5--ycZem3e4-P40yG3TsviX_NNv7TDYeGjd0luHAnrtN9NVYHrdMr9yV51iZEwfIYHUzMTCFz35-HbpiBNgVQ9SgOQXL4bxOIazKIJPPr6fAmuL1E6SkbpdNwsr2NVLKLBLZlHHcEXdLg7Z8yIKMtfk4q6UafqQbCLwtsDWY4M3wrGQAe6_Q_ajN0gOE9aR8MPXCesLL6Bl-ZAidhJynxo8heFscVcG5go - summary: [] - - id: msg_0a76a04c4810e3d2006a4e128eb2d0819abaf953bf40baeaca - type: message - status: completed - content: - - type: output_text - annotations: [] - logprobs: [] - text: Hello! How can I help you today? I can answer questions, explain concepts, - help with planning, or pull up quick info from Wikipedia if you’d like. - What would you like to do? - role: assistant - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: current_turn - effort: medium - mode: standard - summary: null - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: required - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 1 - tools: - - type: web_search - filters: - allowed_domains: - - wikipedia.org - - example.com - return_token_budget: default - search_content_types: - - text - search_context_size: high - user_location: - type: approximate - city: San Francisco - country: US - region: California - timezone: America/Los_Angeles - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 10061 - input_tokens_details: - cached_tokens: 4352 - output_tokens: 2292 - output_tokens_details: - reasoning_tokens: 2176 - total_tokens: 12353 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-stream.yaml b/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-stream.yaml deleted file mode 100644 index 4494e79..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_native_tools_web_search-stream.yaml +++ /dev/null @@ -1,268 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '403' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - include: - - reasoning.encrypted_content - input: - - role: user - content: Hello! - model: gpt-5-nano - stream: true - tool_choice: required - tools: - - type: web_search - search_context_size: high - filters: - allowed_domains: - - wikipedia.org - - example.com - user_location: - type: approximate - city: San Francisco - country: US - region: California - timezone: America/Los_Angeles -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0302e6abfc642bb0006a4e126943cc819a89c375096c942304","object":"response","created_at":1783501417,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0302e6abfc642bb0006a4e126943cc819a89c375096c942304","object":"response","created_at":1783501417,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0302e6abfc642bb0006a4e1269a924819a9a26de5ce59e3625","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJpvMwQ4gdAMEnvrpEN9cPfw8r_Ezi-ZbSIx5kTMQbSBAngQ6Z7-9x5Or0fl_unlZtxCHlx1oClE9k_PLMt4fe-qe1NUOPnHYR9D4c_jHGndIc9Q47e2_2XtQsURragp0xEp4z0zF3Rg43CZsDl-sDm84ZFODqSFrNq19V8HO8hMOfhCC7d6wdE7SbKMSUsXR_Pe77rhG_RyyG8swpJoA4PrecghmReTdePSrjNFYT-HLDquLO9Cp6LrU2cdduWAzFmyaNNNoS09ylIIGQ2ogwDcvypL4BpT87_TVABMxR0vcxvghKl8VzFEIaSKdvLZM4AmbbNAfTGbOVMZwxAlq2CMs24QONmbFyqRaG6r25c16aRgaz9iPB-pdLheDnsB1jMhPo7uRgrWjVJhgsiQZAjnHlfr8z_x8ohUhPToPNoNyDI-ph0OlfhK1kO-8olt3PF84K5Z0lO06D8uSFxMUyojpwJa2rYOIMv_c1uVW0Q39uwjduQxQ-emq1VLi8qBRF8IWK3CkxxnJc5C-sV6y7y1pB4VwKggon0b_ydT1wfd4R1s0qySvbX6TgAPzMbKZ_GNlucD06srCU3ic3OMWxwLTB9W4mx1-KnPW_Q-t9SuWUQvBLJxni1tWJXyUj0ZiB1011yH6RCEu2jUS6WmWu5HrJcLeiHRv0FAUk7RDak7QBHHVjauxIRZ5xYh6aWV8-nMS1Igwwy5UluqWpexfwR9b6nK1Nj-l5vkOKnzz8-VUD3H7RY7YX_4nE-15fbbc_95XQAGrgYseX_1NMANSvMseu75xBNRNIvZOKm2KHlzuNMyA1kHsl-q6YXO2vfZPwenUoAKHF9s1tDoQt1Tl_afZQI6ErV5TDBxnX9jMC-9whRQEi7O1pVq6gg8b-tRCifpksP2KsmoltiNpVFJTBXsQ==","summary":[]},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0302e6abfc642bb0006a4e1269a924819a9a26de5ce59e3625","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJznHl_nItkeUzJbHBvE0-Ht4BFG2TD_WV3i1pT-MgesvogKWTG-Ripmsl8FvoCpIoi9rDMIaSgCcP5D8zfKpY3NjzSpYGjoST7LsNQb2mB1v5MgS_j6NJKf7vemDCY6OZ1cwFW9xaOl75fsuEn_ZbFG-z523L1KeHCdtbgRLqZlv8EY8Pk5D2W4gvKI_VeTwXLjKYo6nO9WAEX57_fUpq9aMvbpGTjST_TEXR_qFNRbvSYV3ixzEtoTxVaFDf1PaY1j42K3--0-72O_IEkQX5QJy1aY6_5Dj0kADXZrc89j1VHeIhxeDKbV5mRErLkHK4dQoMd-a_KUQenYNEZE2Ee-qHml1NWmt4Ggp0NSOxUmNR9PBPar74_aNPBJ3rhqKKi4lQKCR5ya5pMH1whsHK5psUygwnTHusAWXB-WLP6CHK5T-ibqr9e1y76LE20BY8o3AQnPe7mtBcuwuafaiQGrh1lg8EzdidqYL2HW4OVHks00SM_DvYCAXNqIIeBQA3rTp-hXBa5xPAR21LY34D_fafyZDtLORquVPuDTc8ptO97gk8PuMr3npMqBQyJj8EvcRk5iCNEWhOR2C8vLP5Pz0JxPRCode5J_Ua5t2KzRmk7gedUbARaHbFBGUPjxSOdcUac6TA5fPodoGJR1fwMciOYAEMURo2_zBw0cHRcRwr3VpxZ0BG1108HM_6IZVKY0kK-HMvOqXnR_wbH8r72ynM7naI3QclhWRz3vLNeRcwakWoW0iVOwyKKfVLj57Dw9QmsJkTAPfI4IZHvQY3IgAJ4vgG6Ilebhd0Xs2usSq4IqH3kfiDqv_KbMxxT04D7LQwGPiPLwRKncdqJ4XKHXLPjowIQM4x8gulSoaKunp_uglcwoMHMjiaF1RcMv9n7X_zSvhpPXo9HNEQjGSf0wRcJs-EP8_4fZehzCzhm2FL_IQaktdTZPL2d1opYWUSm9zqVaHTuBci8cyzv5Mc_54X9kxzLx08dfn4eRimgi39T0OIvFdvvm3tk1WshLqN2OH4DrlH51XOXvbfGlCLFis6Mi4aME-3bKp6hZMsk1YgPMlauyKs-tS3fJ8jQ-2YRhqKZbs9lXLI9PMquQe_3iuEFv86r6nYHJkmBs2I5RL59OlhY0XmNgb-3RDF6XerCvIc_7xgYsqzPqbscRDtT4oraCzVspfNZHeP2cJ4D-_vvOBGJHI6HS7kGxeruTC5gGb4ZUDdK9r-YZ4bX9eMRWbcXSFRDlk07xfP2zkHhfFdGN-THNsBs8Sy9kopVE08rIIZsqiU4eyqrvR84B1PzhNUM8ZCt8rpO9i8GYhaQCRzudnLa0h5otF56J0GovSdUCph9rljVb3RhT3HM90pPAwnApO3ZE672KS-nSCWE7s8kYX7i7GlSkddmeCj64-KY3QRzv45AzbT18NwUjoPdEIC4ElBAXHs3EByLBXsePCmjrH95SLQa7CnsPNC1tlh0RjA2UOaNZW3tlGlPrhC-uA-3rhoZlw74pRTYNZ-4plT8JQY54Ib5MEHche_jiWmalF3otaWo6E-GMUJzIxFwMkfIWLKywtwMmCypcHjdAohq8BpYFBqYZTnpvZf95T4yNB1BTxNnp7o4p5bX0sw4cg2b4IctyXJoQYysqC1vtUaYlz-KabZR8X1hfygyGM7MAjBOOFs94gr9HfVyiGLDVwRZlVF0MLhhsbMNAKVjhJKWU03hYEXaHc8r8jYwSlR2Ymuy2uD86ZLqnt9Tr4ZLzdXsriJQGH39iP32noxwCiou1QLR6VkvAL3T6cMirNq3sN83J7Ek3sTO_1lEvg12LehlKEkQTq9-ntiqCv3fdqBbk_QWjKS4PuTaZgz3s9RwJ3qw7aWK29a7gQrczB70fgixraZq_2DpOn204bLDFpm-DobY9fox-wPYVR5wiEku0CJq3a-46ZeIqkl61Cyi7O6yJ3IMfmc0M56Tbk_dlJ2FBtNojTBHmi8aY6eJSrXTQs62PcmoKmMSpIrG3KbF1zm70YyO7GxesiuWZ6aXSMlGk7obtqXIlcwledPRXyjxVmFDFkYXGKX53COKg2xd59ooFcr4-e06YHHIP3fkXNiPBlPoOVLyt1IRR_aAq5jRtYvbKaocQd8ozsuus5nO5cAVlb_pDcI1RJ5WLUhdgXRhZZjxKWkKeUMeTi9DCYqNMo1ajUUB_y_MhAm_3zShWo1ROcBiq3hWoblZWeiPc-0XJZvoLsNQnE6X__A882DiXirsRjgFsC4gtqvyhiLkk9uc80dZWoaVje_cg7jbtkpFrcqxjLlEZaSj7a4pyn2BKsm0x1eTt6G6v7elERLcyuP80beaSoSU9hLs00zcmtmxqMD-x2PK5uLmGdo4VSzbPowjUX7j-cKO80RTiqtncxwOOeTEMiGUU7qZP65nfaeMpf-YcCP9VQlf-N5AR-9-A_lxIXCUgcobhUFUQRaX8U9v73_SIw8kNY1iPABOFK-5TK9HdtSu1dfI1_qXBaVbyzEpFydByV5fBHdPARWwGU7OZM5EkkEKDAizYsxwuUjffQNSpyOgHbv_kX48LsKSLhpL4NR4BblLV8QdWIK2kyZoWBFu7IgUoDT2r9MTgPTUYdIf4KSEoPP9gEnTgpxPsyIWI0mt2rc8u_d_y0x-3gqqO5xOd9cR5G4dZc-M4JDOiX5kdZZfJ9Fyg7BYXQjIz1XEyMqFv4qboR1jK9RUaR0GCkB8goh4iYWjvcz109C_nHOTGAVho4n382vFyjfdUtXdpQKaBe5mzstqIVHJjjD372PGIfDCz7DVbN-QjpII-YniVvb1JtK4d2DgzE4qkP9FSeYNGdzAaP4uzXPTPYXxb96tLcEyJ72dwzU1EesHVf24C-CkNm2QkWOCZPfYeZUgHVjEvfNJITAAc0o-rlgsK9g_gk2ap8J83oJ1HDWOaJa9B0E5w_5qyHvolFUS38-72ACAtUmrlK3VDhIrTY4gYOpBqPwpptPNxjXv4qXWLZuEwF1pxspTJCLP9EGvyCOw4W5wxXYvymYgxt764dIy5ydsMAbYhqzmWtg3q2QLmu3r0e_N4g42UJnrqS7cx9otA7yAEoLwPiNR2XaPmqYNArCzEHTUI5uxDunZFILva7M8DXbEwfL9P1OmvlU8f55TkhbFo9ooLb9zQz_XdsyjAGar-_Zn_MX9G-mFDN1sKZCXNVQo__qzekrlMWq5tWN5k4J8rJuNv2LTDtUkd_HeCcHdzbdB8gy5CKfFsLoDOY9DhUwo0HKHaC3nceE0FucaZxn-UwEKNfTx3sAYSb1Vtmb-kEyXwglqPoOkkEAORVKAIBEPnWS9Ohs8Bc6YRdPksqGmZ8V4dUMBR4pVk-Gxdf5-nh0AWMYLoxLCN0qdH5g81TLosPuFndTnxzkKvmSGhp77tCfC9qSq5kCwq3IUNGZqG0oDJdhtpQnMEZqetLPX_1Dnm5L_5W5O3WG8w8qMkHxKQJ49GiLtm02dMztuDzdW5VNcT_ALWvSA4faOPRMTpzbTY9mJE80rTG1hySJDSvrjWfcS41wBXSZX9WW-mk2QSwnZDSQdWmSjMcuhyUxiV2hlwlBIZCBpwmQbHDhf8s0fZHLjzfi81PYNH-D5cik2qPOkmUlF9GyJkCm5PNWlI6vpGC4LZPC6gmpRoGHC8VV6qoFaXh1uzohYIsZxthtxxoNujPOjogxYUpeJAhb2qun9co1j1e9khODy5WNFuqPr0WRUuDipun6KnIsRbdEj8k0WWYUb9IpOW6fNg3HQuzjxhTY0EpPPgdRVRlkLFhL_HQQgZcZPWDij3kpgLt4EZncrWsE1ltMq8_q4Yw1QEikdHiVx8GhldKC9-xfRF9Dh7OUTj9CT5DddY4ka3owgkv70_lWDE53A9O3k7rkmQjLIbDIIy_UFV4rpadAKbMNEVKedITfn_Jn488g9Y2DuETWP-xwY1m2wM-LdAoRAUi3B_2FyjGIgZjG3sOhHhp5jXLw8sbYRk9GHhB6c4DuDXKQg5wfHYugJtaYXM184bh2hMFC0DaUt0Atv6jp96NL7HZHQj2vrjkQnHub4zf1paDh8p7xzw2634CqRrm-NvgQS-gdiPHLh47P92dry0-HEKonjGMInJ-AQHzhtG5qw6HdZ6m1xMGEe6_PL4bIZ8avr_9KNaiU6YLD9dqA2qJc7Fzom3KRO6SXRhKdPlQQB-fsLFZJ7xALHkwegSlqwG6SJkl7Vv3I6dVP_cTEUPy_939C6QEoVjpysY4PiEhfD8HiutQOM-51sbt5Oa6cwkERRm-FlIA7Q8lRBCGoR1KPUoju-TBnx3sKEKDFws-XQOj_6_3iZzzmkwcUaSwdH5EG_Hq2yyeow-7_c_qHD8zPHQcEdCyhs0DrSRjDqW0b_BVejORzbS5QCASFEjx4B1FLST4Dbkdl78UqMykTJCJ7rowlNQcpKsu8Z_UhGx6QvIZuni26s_3VxwV_v_QDJ_qZTlx2EfabFqHgSBDHv7If145yzsYHlNIKpbRhaUvZDRqErI3aaLQ14rXusF28vfsjtU8ANMQQxk-NzEWiE3hvjWyxIW-F8qCjFySc0rrClO52SY_vERsIo-R9tFSSw9NcRwX682kgTvyKNV-VYRz3z8Edkwo21reE8Oy3fCNLAkVsQe_6NFwifC7CPf0WVgdDTTdwbpqvoEfG0Fl_rvKdxiBrgd8cvuvOPgz8Vmrlb2v8w5f34p5j7e_YXGtfPSqqakMZT5Whwki9l69KMWFqK7ac2qF5iv9zA3VJzmcXy2XS9vQ71gAOcoBamHHn1Uis9LWEKdIv8KLjMcwBqZ6KYHiJqfom1d4AKXVrvezNoNNVrOYKAsmKHFCwa2wbsykUeM8D9IbMjCTYVfizKNN29bzhHj-O8gIm2rffIEvCud4fUL822mRv_LtmuyPe7ujtD2JXzYYqHbHjD4wr34XUd_X2XTRoNe12cbOL3S0sfu8n9vNSSzs_Q-2V9_ZrcNDDSwildB9pEDgg-3INzQLHAP5umTX8DPqnfUcCoE5oyDv20s8xFKCrcy575vrOEenUA_b7O_vuljzaDP8imdQfB_dyxUw-LusFEBhrDFOI06KvC8rksnIR_vbg1qsYJb9ZYHfSjzlDT1DZg9q1c7d4y7VCP-YmbKYMI2dhbspk98B97llU3spZBDorpjhUlZHRMoI8qu3V9rHDCZJ9uh-OJ91eJQBvofWdQ4u3Mf45MkKuaQVx4Gl-meb3jiMkwfe8XbLP__z9zufQfeCI76V1M3Cniywp4WlqE-efmRMZKDAVappVVVAM2vd2v9KA8vSbVK5alrypW2k0CVQPIQKMw7tmEHXZsDMVMDD9IabObRDrGUYekB-KgUwsBqs34wKsc67GyMycJ95SBINXlEGKow9N-4DjxNo1XeVBMBiw2kmYW65t1EKQ_XdSoWmEfTA6ZS-HJzT5ux3iwcFMA1eJUaxBMaNRXguTN7onCq0B7c652Lws0QygSrKbhM52yvURcOw0Fo7XyAbG74ZU9CX9WVID-0cKp89_5vYxdJQDzBmH7vnBEMfNtKpW83gJXPbua342MduMaVa1BVj1-2MmSPeuZfNNV8PoZCj7VbbUixllKK1f-std3LtD6qpmBTQe6R00MiwS9X73CWYJ-Iu3Jqf86SoIMv4IPkOM0ZeKBxPnst00ChlmZSC4Rr4NzfpQujeek0_fLGyb_Tqh2Rn__blQvscHpoGdJpwNPF9V8PacgZ4dLccEUKIYiDLAo0XtQMozs38Y6zFq49yvCzSYAdmA01j-UbN9MZz17shg9yrJ2ktI4l3OeGwz99KA6b-l_pIQX7cWPM15ss4cQ7EILqTKbCJXJUr6vIG1JzSlki2ST_nkLgeI2StOS7W6FFpoXf2DVleINsyBSIN4TBuLHsk9fhHZT-_gAesTJe70T5tg5PfidW4mHKjaQIATTmN276br1je30tW7gOnivz8fCeeS2yk1gnF3cpp0Tlv9QOYcWR3v101jPLlBeOJzz1Bh3KmwvpymaXFg5KSpyAnFIFQtfNyTk3pEH6ekYl7ZHAfmKw44dtWYZpDCa1EUuNLR6t8Wf8Lp_1ulXWPk5I7PRNdOoK7EtclGUdlPM7SFudceABFBhmawxXeoGsMzs0o8HWZzSmMuSjEZWJaywL3ciMH4BuoZq-ZSMDMtcIpcaYqM0DxDavMqtzFEu9jsqkPzWAPbkcNMbK_1GOlc0OdeEN60MztaMOs5whg053MQkT33oMRXcvpfcwd47ZBxGUM-hT3F9zAfs-WBYesYLApDIAGFnKU5hTehpgveq-rlo-XRC-YtL0xtM1HXUeUDKC9oj5i86W48nvzkeJZah8MFFFpTz-FXFl2x_FaogHRc8s3SQK5_hA4YNHomMtSKN5wbyy_00al2mY-HQHL9nlb5eiqIS3tcAO3qAlb_ySe8jkZHofxWx6lAJbetAK3Hd44_NzxD5uJQ2Bj4biNdoNrxncgll6jifBAT2DtyNeqyLs6w_1wHDgElDGouDcbYAz7iubPB2fBYtmFJUpFbdp2yGeweTvNl4kSa-QOklUnIac6bOpdZlosbvuP6AzI_kPaTkFIEg_icyojr5BG0YPZ0F7WD8eCZzm3g6H2u47hlq6DFyojXHl1NZfOnGnW24OrQkyLJuFgz89pb_Xf8llOCxRgtLpUSBuKuwmzvwIWaF77GM0tnjpeRppNT2lb5Jm4TIUlM7wjLPLotxVaYcfGQD3fneFMklJRiNgV3aYXvPHRbxHOBHsZfchMFFqTocImPfUnYNIlVpR7qeECxfB0mTSw6-YLChnU-mLXUevu7HwSlw_QDDEkVLLKlGXHpiBGtwNwhCRq8R3kN9xehIbVlYWOOR7BSh8I_kwdRT5mp6_ZU2uW9GxY3LeZ5qD3d2i4muc5QIfqqQihH4uXtFejzwBmLskLWvM7Fd23S9gyMqEuGYhyBtq60Z5Cz3top_-5Mbb-Lim5SpQ5yrpQuNVy9-dWKKEluZSBKe8Fl5dp3WcZrhk-xrAK7aP7Zry8ycz5hCTPA3nMJ3brDnWFMhRN5zBtHMtOKFkmoM8c4yOAeDM2Jc7UMUUvgsLfO5AgKM_aVjar5BJU6yXcRYMMkSIy_pwoEdujm8RS3rWFlyWeqYW76CrWKesZCgDub5IJJUqXP-2l-gI6rZ15TT1kZbf1Bu_doRVOarF0Rw81w-VWIeoeGCdYchAO6IpI-XhjgEchFy6PQx3uoKj47jM-f9cwrUWt9Ipr5lf8IrWXXQ91ten4ZWGYQSe8HwX8VBsxGkNWf67onBhniCYRyPxQJciL9IThl0ylvqMi7pFoGIhh63SbPNhH9AmSEGmAUv9qmEkuJR9Xy--jA2IdZPNaMESXG_dyYpl7k_PKS7S7ObKF57ASkTz6LeHtE_OPjl2y8kLFkXne3QNFUrl24B9ASw1koZn3FfbZ2TynYrWk8LJGNYBdDgz9jF8Ch88zZ2W9UEKVh3EHirTddaUBOkYeIXVfMId-n_lqcC2nltnmpM1nEtQ5hI9ULQ144x_00uxQi9-9E4sDGU4Woqu9rLCdlCQTk6Jc_xUfxXUW-WFYLfaugLKOnRh2fxV1bh1Iq6BnRt75tEEIS_6jKVDLA4tT6H49A6jifWoH6l5i_XM_QOfKz0a55SDtRxwdDKWCJhdIYrPuq_rWBlOMpA1CJuHz1OjOP8yO_W1NeE-u2V_7ZQiHy0-KBM-GOM7-4jdoWzxPgji8JwJl9qnQjWmceuZZkkNxupJ9FEQ3yRFxO31q9CkAdNvFmwl40yvvdAtzLKSumtC5_8P9bKf8Igt_cgFcAB0AXJNYehlJMIBrH2-3JHBrLDSVDtMqidPtY8gNeuEO8lOTeFntxHtyXjXr6skNw5R__j6rJr0DzDN2URQqOi7QVxm1Oo36g34QABF2B3TE9Va70h468pGIsnAwWMKokbFoDItS_iPUY0-cV3Vp_cl87ACV03Yn7-NSZON3nIAMgD-S9UrjsM2bcjeawwIX2SYFMDk3JwibEhtydLdJDbOFMTnsTUz6P97eu5YvT9qQKJlkMLejapujj23XHGzTiz37fYWGVn4FWFvyuJq9y39r-waCyNf13fFNJZKpwK8yuCbp5tFPxoHHhWlo7x","summary":[]},"output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","type":"web_search_call","status":"in_progress"},"output_index":1,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.web_search_call.in_progress - - ' - - 'data: {"type":"response.web_search_call.in_progress","item_id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","output_index":1,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.web_search_call.searching - - ' - - 'data: {"type":"response.web_search_call.searching","item_id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","output_index":1,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.web_search_call.completed - - ' - - 'data: {"type":"response.web_search_call.completed","item_id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","output_index":1,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Hello"],"query":"Hello"}},"output_index":1,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"rs_0302e6abfc642bb0006a4e1273f884819aa0a17b7a3e9f0d3c","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJzyHDLezllGywHzS6IS5sPIxdYdhw8Oyk0JXGiuDEL6-qhkPyJ5uqW8bLd167S5MPZilNJdvJRGW2IQoAZgI1XkCmDZ2YlXK37F2H5oUCbgK13-8l123qCHwDhnVqTfhSHXvVqxI4ypx4tZn-zLi9SVIFpJnoNImORSR8ody97xfKu7swxhlsKSoO_l_S_92GWvCRr06Bw-XV_TRSTWi3HFHrgUPswnqjXetChD08qN1zbO_LGV2cdLQAwhOHNR8jmCtQd-V1Jyi2V0qmIrVMRsD9RNQxhjYjo-19PTsOTeq_iPXy1VOhrknlh5uCP2ij_i3DE-r_N6deIN21e0sToiKzNKtqOlUHxfJCfHSzi00yJ6Phy_WkryEXh_PAOJh72NUQydbjYKbrfPIYiCgnkEdFoeeWwnZPJtZgk2XWXtO9odHV9hBZCHzYoamCIq38cK2Ar0LHIovMkaooeeEGl0_zeJVKlJhTN25SL-oha_d9-sl3bWgB7GRSxJyjOF7vXnBv4S2eG5LiffTzYVWinBHHoExGFy9wD1h5IvlatlAsILZD9tvdHfSXM4x8gR3lIC3V9QdPaBpWHkuP2LO7T_FojSs2ZKq9h0bvyRxsfQYcMudsr6DQ1f1TtQoAj-_8zEBKUNktwvieaYrbMFFw1Z1_iecQuB6ZFmzMmx5co1HCMY9MmeJ8E-_QSQOhTis_FvF753ddKmUqwuNYsQO6wqsd06M1a2pW3UTOJmpMYXb9FJjz35TVa29Gq_sIj5XPkWVuopCAh6XF_iFU_hTsrvSzYH8rHOZwH5rDaYoDPhZ-y8HAdXGGXn5fAW-EyaXa6WUq7sOFC-_1wlAOakE_vJiXL4ngvq7WJqXOAT3NpCiqgZuf_4uXFalggmknYEIMVk1HzjVvhi2sI_pc9F9YZpP9_4eeh-QbGsHS7EMpw73g=","summary":[]},"output_index":2,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"rs_0302e6abfc642bb0006a4e1273f884819aa0a17b7a3e9f0d3c","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJ3UsZmwgMCWr5ZdY0RORnOa9_kPRi79e8Wo19O7vmqPLG1e8Qye4KyMSer_0Dvd6vjX7Q2mO6X-vvg3nwwiqjUinM4325iGvUGUmLRKfNhwBpd-dpyG2LqwYTgGibWkkZGvyoAYKRTtVT0-VegunsK8ZhbLPcguZug1rHESMXRfsb6oFcH3iV9RDMXF-lF_5e9xqQjRFa5FG-5tjYOI7QZ6EFleIPf2mXKuUCBHgSHLVgJVvMZGis9MOe4sb92-_S7MxJKF9Dn7a9vpi96qi8GgmRFFsVJFjMOFmCQchZZvqQ5095QdR3JDQW0ogIeeIL8h8DaeKTus_dwlYB4btWYenuYegcFNMEadkOugMZrYTkkPs5O3w6WYNysHeUrStGoX6yHUtHOyMAT_ZAbvIeHlYrgbD93Y3v8yJSKJWm7no6uKKhlO_7IAZSVPMVtMlh9pRVHLz-1W4zItDzYVn7WXTBwmkKjQekN-LRfXvppg6_9N5jXcUvN6QSPWFiz4sROSC7v9Cz_4O3YaCuOk4N8AjQ6G-eyHXL9Ryz3p1F6YM95yfSd7OeZJ1JJlzaG42GWi4GOAa8g5O6ICsUzF_F1zUcNVIIXdLtdN-nxMcjUROi75yXLmp0JwQ-tEHWdYyVYUPJjCPUnNvAflhBVqkNnWRgdG4RSHp16FGekcaTqNyq0TyEtKtklzfmqw7R5_Ck9qqxoClz3Gni0JzMr1gkuMBynJ8SXHzkOU_qU35mffl3rjLGt0BPXKjofbXVRYh_z_-EsUcgi6JbnC0qi0IxSB4bLGmLIG--4D5ZR5bRfaYL96ZunNpwNp8Nm6Ne40EKAp94j4lnht8W8IvRwRI4KzjqzN37BOsUUpPGVXtLcYhbZdR2_ZB9_m043DhNzmcdsHhaYxzcs4HkhIeG51WlfM6gm9RAZ9KDDnKEjFgFv945fGsTsgyutnojRNnuWYGqHkBCGRZbsYEvalcGq884cqVn4EhC03IhD5ksftjH_pR2sm53GWZIyMI_9tITEF-5OtBGAnjCYIBDjU3_fti2c12sVPcuuSVZO4lJ7M8fC2kGl61eAsTNd5-TvBZJ2D_-MQ2gHf-Swaj_yTSvtdQVTd_j0w45Q3JrRk40cQmCLrlCDUlAzCsdIOgVzNjaTwSwLiYUAPcDNSDkbV3l4Kw0vtv7Hqv5DpThZA6O7aQuK6xJTzJDFcBZwnHxeVcNtFo5xnlMjwPyQRu0DhZIWSH0gHx1_NB05jTNfOt0PoHgVd1mZTlDfoHT9QHcroD03sPg19w-K_uz55AI8UZftWNMrXpqiwmhxeKnEV4srdjpCCE24Yx4Nc4w1zgjdvriGXLUdjkkV9mSwtjQyFvhgVHbXfy7QFmML5s__POysXd_Ct3djp1PMtoGUkEeN83MV8e7umwQaTEMVoN6SFWWPgZkj82-zRYh6oE8cNs2rpedZ6jOHuFmK7srwoY5_d2jVpZKHW0cH0c4RombriQYkqQzkihs0hz3af9w_vhcrnk0mX5907AcZI1C8hQyMeDmYzCRqlERf43mwqFaKlrABAK00KXZ0d1VRIRNLnKg15UjnU4qKGh-r6OGY9UQFOEpqce6EiyFr22sp7mNp8i_OAUV-Kty9OKGk2dVjpSkLzfgh90a886PH_kpUvhpSbvVNj4dPdvPj6-p-V17DHbS6_Azv-F8c6ql4BvbgZ9LfMDv6cP0zHG_lsJxxC2AGBkWldltKbkltkL-xGtdmJzryMEk1ZK0ECagC-hDkBgAvhk8Ev4MrX93uIck-3p55-PjS1PgNTUrmZK2iS-n0oK2l4hQRk8cpWkdJvPiCkkgHrDSz7rPNofI5chrU8YfQecC4btNt4-kUuh7fewQi9dZPNwAC9T7WZfsMd0n55eIWGKjsx_C92zS9LY5Q8S4kecHnGRng8VAxxDDOt2lYpejQLNZ5-VGO026HhZar3UJHKYZDby3AJ2iw8RRS_CT7zXkiO8u-sq65E96C5mAtKLXiw5bBYOzJu26ci0OGtgd3pYk5v5RpSM24gjuktAIHbSNBcxRmDuDZGxoOBsPAJJZUUXG8RkKZcZf2k6wjrMp9aj7pdekUDxhgWxSzokkwG4S2DpaAu1jjNHwloliB_ry1PI7bHF0szBU_Z7gPauvmzgAz9qBxcTITbb3knQC4EGqfUGQ7lPDA3fme0pwCbmWLR6hoZthp50jBLs7n39BWRURgoCNGf_vOihtpZt1Lta980V_l8r73YC9jXY2Ol-Yxvg-D9GgcjFgCCkhjQjekWUJTcBqWCnRy_54qNDviLrJ7Lzi_P2jSjAAcx6sTToyYLB2uZEn21BH6ntQZ-7xTSYkoBs6i9VIWlwO_1LGYyXCrngvGmIC8Pr3sJXASufgQpB4Q8qrDiEJrM2zdcj-dObofgvZIUqjA-iXhDCDxqvXWZ7YUxgbESX_OnZ7djLHB4U1OB21JNkcfwJLBkp4XwOVjpcP_GBLt_TV-IgG3ByGIk-YTxUtFdlo4TMpPvBoyJzKw0LGt77i_EMjAvtbzXeYW3owb03gWzs__6pgyrW6SNSReXjJMEjWAgu8i7gxgUnpGOeDoSjEIWb-kaJydkrYM872hM7NQDoStWNyQ7LGJA-0HVKL-pYLNLkJqAa2Pa1fQBcg1kXgAUg6aP63Ef7sC6F4b0CYys1HNQHgpmk9ZwfqgvxamlgA4Onjfam-ozjZdwzMdAoZIb1Lu-qFFmBVHS3bx2F7rJA0P6S3MnVJGdZF5NxRj4_IKv22_dbEXWs7iBlqCLtUde-vn27Cp7QCphLQOB5dwus17SVu1pwu5oxUj6eTciposSVGcd1pIheFH6WNx8Y_UJrBg6YB1Kes2JuH7zQcyB6KtWZ0aJ7Oeulz8pTpT6jh3tUgLtGYG6a-TxYqgMSJ3badwGPREaeCUcqxIYgJDa_2PU8tLb7GYxM_QMNDW562xfjqgCxG22-cnGFaSmhwiGg9vOqu2QP0asFwigSl1JDHS1ebnWKkt7txL7GVanNetOHURAip5_lLFzqZkqy4w6rmvNVflOT8l-4kYbLxQwt_9XocFpAigpgRgOGteIZ_chr1g857mRbhS4WMk9T4RTalixHJlJ77G64Nl0mlCNivxOEoJ-ecUwxqb9ZRTFMSS1bx9MAhzHN99n5XAxs42y_iqlNTvlmc_Yaw-qViOKeyjubqEds5d1qtV9GPjjzyl-qPT1ClNqkutKYBOsoQEGPEd3eiZE8atza14roEh0bQ4VLHWyK3ch_Y9_-NIQat-d1du7FIEaYuaMntRjrpw_EBBxCd7HDXkjsPNDUC0UcNOuTZjheuRWGjVcS2YS8dBV5JOgRo-4d1VsQdHMETqiBn_RkVKFuIRh6_H5Q3vDk5hHLQhSJpJ53j1ljv8ISlS6TKPGOotwGw0rIF2rWx3HYwuA0QIQq3p4t_tIz8l-GhP8qByHM5T-wzkNiTGQRk4b4bosX8bmNjjr-baAVpFqG4liDLV_XD0C5ebwRA0DNzW0XLJRGfMWK9OipeVG2yuE9kw_gufArieixjFQb69DI8aG6KEHPLL51OV5f03AYq7OsurRJhbYEjGdGJQxq1PEMW_Tzkq1HyPKSewjtMxsVsryIw8e4s90EMUtfHlYxY-kpfU78onbnNvFk_02AMlJjArAoQgsamDGSysyxerY1nW7zorD8LFpOsqe9y2by1_Bq2Ansprbaegwn81RZzgVi51Yitkwg-1AUQq3ypbEoVTRkz3SW7W6fN7BrbiiC58kYEBnzjRly0wOSE7mI9A4SHTeKJcXAlxp8sjvS5HArplGzFL0e19aH6oBfU2lGleByo7xsN9ELybvBe1KnHzObDYQtOGm-3cK6ySuqUGOqx0obD2Q25RfYdmvdnEAdLaQscDenh9S6Niq1O6GvSLSNTsCID3mdiN0Xls_L8IceRNIsHH1EqurY4l3ZXNsAr8swfz5wnmRUwk7pCwl22KS51OPPaVRM7MkvB8YfpskyAPRrxGf4n0ntXLFd4e7nPaYnLOVHEgguDg6rz8Ss8-2Pvhh9rMK0Z7CCIaZsmhYcnjzsalwE2nDL2t_7FAF6ycbKwrtr799APaWFrRLSSEfQDGqMnhxIkPQpjZpz6VJ-c8pjf9qSOi8u0Qh_Ya_PD7-eD8S5TV1vbw78ypmwetvHnQobGXsRCIK3NO9ISnN36fJ2coHNRKJLKtwqx5h0KksmYF3D9oPRa2o2eEACnFXDoTejuYSPSmbsfwts3TQo0gL0VIY98hOXxpMH28v8Xuj-NSm1U4T9ZfIzbRhXTMRKG04BYmfcyHn72rObueHwjW8qtam4F9yiMhJT3pm9CNng_89i9JnCTVJA5qpjbVx0tzXKjZng1CXr_oTIGVj4HkFMgAALKf39UmVc1a9a-12tJHfgi6fYP71B9WmH_QhBbnFFkVfGbt0BI9OxLNn3DqQ7VKNRyEVL2unQNVs--ZQfPv1NGYWc5MQ5tmku0ugonguddwNsgGOA==","summary":[]},"output_index":2,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":3,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"Hi there! - Hello","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"t","output_index":3,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"—how can - I help you today","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"VGcz1Zj","output_index":3,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"? I can - answer questions, help","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"ll","output_index":3,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with writing - or planning, assist with code,","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"iOlb","output_index":3,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" or look - up information. What would you","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"cYS4tnNEU","output_index":3,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" like to - do?","item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"obfuscation":"KeaV","output_index":3,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","logprobs":[],"output_index":3,"sequence_number":19,"text":"Hi - there! Hello—how can I help you today? I can answer questions, help with writing - or planning, assist with code, or look up information. What would you like to - do?"} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","output_index":3,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi - there! Hello—how can I help you today? I can answer questions, help with writing - or planning, assist with code, or look up information. What would you like to - do?"},"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi - there! Hello—how can I help you today? I can answer questions, help with writing - or planning, assist with code, or look up information. What would you like to - do?"}],"role":"assistant"},"output_index":3,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0302e6abfc642bb0006a4e126943cc819a89c375096c942304","object":"response","created_at":1783501417,"status":"completed","background":false,"completed_at":1783501432,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-5-nano-2025-08-07","moderation":null,"output":[{"id":"rs_0302e6abfc642bb0006a4e1269a924819a9a26de5ce59e3625","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJ4Ey-q5qj3sCDXw99hCQKz8fu4dEZB5ZdY7UTW8FBtx8_d0vze72W51gfeqfvIuL_kRF5DMyOe4k4i0jv_Vt2s0AvOMEqIwQk5UcpgF185HOsa_jkXZpcd3fruJgp6fCdm3wZzhg9te3mvpBV7D0VLBEqX97gBk0bmk187YxWViTA_MvBDCp7Pa5Z5lIWqX4ZmjfWGB6-BlKcVXnlx9pPwHm6v4ork0LIG0CZ4Ii8bxHcZjjK1Bh92qbKibpgF6VRV5WALe7WHFc0YL-87SKzoQThCJAAvIilyX1ugmcDgddlRy5mgzoE-8EZIraVAWyubqrtJW7y0LmDs7xApEnfsqhqBgmmqPrC_sjgpJ4_MpHf2OFkQ8--_zAOeHKD-bVjHFp9Y25YAaGd4TE3OJRad38Rogo92oWbw-Hk5q5adk4eazDtAWSVClaSeYeOLrye3by1fL5hByh0F9YHNDaqyA5E68LJpup_KvtT5s73guFSntBQt5wmJyyIAl23Sp0GK2jcXfMpBp9kd3PJD3kNZZ1Vk0MnFy3QWVy56BO0pEGL_VIZuHhoBzEE6PMzi66tyL7MvzGy7-ieKWBq_I2JUBX3UFGrbg5vZNg8IuRdfgoNuufpZSFIWnF4pjcIrSmSZbM3er2q1zCnR27WbncWcbazcEKkBfyzUEHdg-c7G402720WNU2wyr82scOuQXQtj-FetR9Xm10QPRcMJJO6HY4hUPmp0K15ASp-wXckuRtwu6Zyz10JXWBn4lTmiCwefsm09XsZqAVYnWAzw0VqfjHZMkHbfj84vzy7wmEX_Hcg-3SjGAqRRKs6nqzNfCI7arOA6h-3LMxVG4IL7FbxzODR-6Kqkt8tmbBldFBv7Zt-DRHSvsmHzXOKRdEtPqtEbiSWQTr3FPWW2b-McQD5j4Z2ucmwFeM_anFQYTJcrgQmpzfYBqMUis8TthEiPGppwI_ij6KYZkmD91XsBP_gplEKjem2PWfDWl4br6ie4cXOlSO-t7MHIkLf6LqT4eYc_OwXY_uM3B86NI5lwER83pyXr9uql-kTS7vcuQJphI53LEcmac3hgSNX3tfbp2JtKbcF50oeJNe46mTptffo8RY0hDBaG4Aid5uRGpM6muDyg10tYTvgmR6Yu4IPBBaW0YEZ1KFmLuPZ1c6U9xhMjUcI8a4CoT83voPa5mcvcmSobNN0u4_mAlGEOEXRMskS0rnBXYj1zVIs5PbGsgdJHz4ooOTwQliTJYHrKZCu2mlF4Elz9UkyB7_IXvemZz3FR2uD50K1gZVG6XPAb57mmkbw12L941QFP9NAoOrHotOWHfIopWGDD615Fmh1cJfE5t5H3kr2E1fhJlDzcX9cho4gka2N6LXLyRyFlG0m8j_w8CITqfSVO1KtsRYh-KATwbuDKYIXLEkhhYAo7romP54Nzty-N0EDlMk8q5pR2tBGKF1fSxl-mo_sMGVe5qrSu6X14ukG7einXMCz93GI2gI8N-DFMHxBFL2dvO2fdhFy4F4F1qlwwe1pSr_xp62G0O9FFH7-1-ECYo3syt9JX8KqWygG2uDKeHBJEyET9SGIdQnzUrhOOd8KcowNYHecObTuVeT0OCihLB1Pqqzq_D74EUUshvJlkMZyMSMKhKKbFqxQ_MYUiIPoxaqkSt4qq3qY8fnI6dI6UIv4Q63XdblR4T2p9YAKV0slFcy_omvJjwpxhYWDIItjuxyyyfbpusdvWHUdp4PjGy0w5QQIwW3s2hHqva9hcYWnSLG6z_jR2Ww4uPbO8Ifn_QohysXtioXqiuX4_UOz6ISMbRv8bvqW7Y6B77QGo_xK3suwi7L-m24HdWxkUetnN9E6zhhMVqSu6ubIAZC1MyKhdmq7Y3Wlh8hJneIfnnrVGCeW9ZSaD7eR_vAIOzgTRDLmSTmReQGXt3R_pC0B1-j8Y8-q1fzmUogEM54JUJCwB-AJMfmDZNYC_QZ8rJ18dFcIcIOxRJOym4KCd9e00hDEDxM-V6ca7_l9L7a3Xne9XKgmcB1tCaP_vim6kzfSHAarjLpd__bSdcFv3yjE4F-ywYqV1fOxnA_xO2N1lHOOi8E7dep9YN2Tz4vjCjxUNG85Zzo2-ZXM2jffiLIlM9eEt583CnUXx8DHShixyWCX0gbWNyB7W8oYGuLAVl1Tk5ckkjMmDJqOR5fWqFYk3z9PhrYlchtGcNwf0KyPxIYMkkZMBjhUf59P19NEzduMMgLkbiqMcdevhD5hCEO87nvi3y_2JpslIYaQLvhjFPMaY62e1PD6QsQmaBNDh3--Iw-7jBA9ky8RfyxrZH9xlzhDZDFtuDyp3bsKCKsMTR9f3KYrFGnvVwmIkZbuhcvD5ZA2N-etzhUyh009Yqk5XJ92Ky-Np6ZCQ8TxP-R3qw71kHZQYOEfU3H-X5nm-HvAkrZU1x5z1c6qd9xl_5_AHqHWILcsmbYO1nR5x26jGz6F0O80LyQuiwZNkvgr-SYq4sPFeoAcEFxb5vRveP_nsI0sq3E6oJZjgvmz2SGBiQ9rfRQSqKpea04w-yKylsgYwy34Lgc9vIldSPrGBVTTcXR3NEyTfKL5dypTG8YjuMLRSLGARmLso0G0RTbroDNs-jPb30e233GxZjNEalHEQmDwZ0AeYXi4P72RrXy1TKbGwDVVW6jthG-cStcwqOT2__d5QiRjWQfdUCEj8IQltIbwgB4gjUim_7bum1yKXyoOc5K5gnb2FqbNBPkEO_jfVYpc5Crb8rPWEr_02LfguCQBrZS1YOyBOkOG07tKR2fy8unHRtn_0NtIGTpgtPSKVmoG88DymGa0Lm8_gR0mhf-XT443ZNHbYXNYgvWLwzLETuEcL_pt8BbHNJ3wdb_0iX5WG44cfHG456JB5yC9qcRGlc8KZqOi-d9QPf0O7HBE5DSHyJ6r-3oJctWC9mh3OjEO8_03mDAttuLsNYRecfx0yFcH8Lu7JstnyRvam_baS2pGcK9B20t8KgoiEFrfUcOXdpzYV1AJecV4Rqa36nLQ0IV8OBP1kV9y3bXWrAFddiur-HIM5oGhyXsE1iXzOS93402opLAn2HMPCvaWc9DZXPAhHnnI96b9YYQeVESZxKYZXmT08f8H_fJyUdVLu-ng5QVpg1IM7czI3oekCtUk7EKUEbStvFoJxJtv3Mmmwb7y0kIYY4sG6aaQzUPNPnmMQJmG8J8HHZVBa6izfehekfn-Eu_y1IfsAvYoSsBf6iF4lEMIlWkiH-U_NkNpjezohoKBPJWneKfvSNrGybCeoWzRrl8AcrasNmp3H1EwFEaLxSlGnKR4iDQ5eWNfvewDvUGzYUZH3V4FvmqsU59TFVq916RlCMlQzFtSYyIR4UiNqtxkbMoal0dFeD69MqaAtfhS-BEL-IlO-9yzXusUXyRAYEJHrUijrO0ePtP6DNj8PppY4Zg9C3ygBv6ajyrEBOg178GSAhXfJmLYfCsDrTBKv3TMwRGJPueSuozlrgFuBLONnOlxgkGXgIfopLCzDLOtnBqLoYYSPhi4Akdi3NFiya1Iz7dDdM_NmsAf5UHfBGOr2tfT9xvjgNZBv9mp9bNUaQwTQ6YbltP9mQLfeDaYPeGXwakk3A0PcPoxDCEaOR6jZp9jPcdkitQ7csQV24B9k47ZR0Pyi6Yz-r_f9Qv0taUN_S4aGCil5vXatxWqgQurLZvNSf0ldD02ut_fhbfpJepzrSNVtVJDRFDldVGC0aGO6QDvwH10TFc64XmA58hhr4mnkwQSEYoG59DcIqtErT3fhfC6OV3lZVyV4KH0XChEEj2SyHIbbHYognrMHFzYB0sXjDun_NipdeogcQjXacVec-IfkoM-0B4q1K3-tucDo2T2SKapr4kdaF-0vGxpHDLDQlAyOZ6FbXZZPWPrBGcjKuEsy_TEd2cZUr5igldMSBHptmqH7hzNylDfhdUOTOYQGLtxxFQK9PgZrxNm8QGNB6RQfuE7K5gnZ7jzhTJzyIPIrQts6f9r9OWYI-3mxoTJO0qk2PuMn4y9Xy7zB_bpsiAof0gSDyYP8FNALYZXg8jPmcViCyHb25AGfQ1B_RGkO-KdC8Ikjs9g68Es7_NFQdzxPGyZEBlxxuK9EMJwXQpGtm659ivClgSe-7N44VXixUCGVVehIgD84r6ZTamagJLA8xxE_pqHqCCaBMXC5VIB5_usikvboxofXwtHnzafqphuUIjmnj5aORLmFv_1ngAHXrxu-vyXKweTde44Xzl7sJQ0zaT8CcV5ookqdXvpOAEfEs3pqSxkcn_xaf9ZFTyjvaMmXG6bA1vDoP__7iO7rlkavanuPOLQqXT1FvSvXZYwdxhAuJndPqEMmm8HZPBy4eEmwaS6ECKRbE6_9xFj5NJwFbF22Ynbqm8Z6hucnhzkRJMq9nDfv8FVnh34Cu-mmus-KT93QfXhbZZH7mvit959k9zJ3GhzubUheNWJVy9DEvb51JkMFRDH65VOPCSoZD62D9CHKXPUVMEtDXoIpar5XuJ0YHy5dDTAo_DhuG9x6jyez8zq0-_JHXoJ4wPpy_t4KGh-GIZn6Jt_5NC3SxMiYjLC2ZwJuD4Vi2aXxjsP3NEd90UgynHgyTr7C1ktEGy354dG4xvM6zYIvegZ-2tp4gw3sWf3liHcDsFqHts2C7M_XTFNbZtxr8N72XHkpEbssOMUyQ1vdqc6p4eSNy4mWXA_hdDPcGQImuBL27kto2EqNYqJ3_CQImsoglrxmsblCklG7tfIupIrlrXI-cP4w2fQj_2E14xl1GeDK6kHd4-6DoasdRPNUvuG3Jz1L7b3kCddPp6Cb9lbFEJDUDqpJtZ46dUWGLCcmJZ0BiiXOg5kz0S_k4tvfvgXJV9ocxzLVp_4MoSooBT7NmnyjReClCuTTitAaKQIZqXl68O60mYDiy2nq0KaZF0ST6BOUvoUGaL71Grm0aLjoZMmpgRiOTO12F_LcLGMAbKgXCvQVgEkh1LvJOWoboMEt9lkgPApImEqYxP1cpZc3EZFisjJUaVmLEbdZP4nEU2D25eW7n9Tp3yqIMgxmydYxpPw83K-zaJ5s3J_bDwxpa7XcwcJ0keOaV9S8_ZN8oUmJeJ1rNpowIq72_1hQCuo8c2R0aS6mbCv0HWh5PZ1u6HV9eUH-paAGkjXlp0qtVx8cz5nm92_64bjZPiHxHU24VPTE7drAPO5R1_kTykp9_YSZJANvkN-9t-hHb45LzaxNwZpkRSzcVIP66HRvmKr9wF1JBgQTMaJ1goJR0z5xbnjxgEP1Yo0CjydNvFdb3ugQK1HIV-ym5-PF53mgHJka6gnNJywy1FVsQUfMOv2f5dObELdVkuZ0x4GuPSuRAHgIAkuvNEnnWdXF3XXimQZ2o8ZKrZVchRmntKjBCDfG3DkmEJtmvkxdOMY4XC6r-p_5UfGkFSRGO5bJQMXVO-rLwUENNPnBSm70aX_5hOGxXZjVUg63QqUoOtvptTv-UYy2gDw8K-zWAhXPrDSTk4JNGBAAO0qar0AULyaD0pxuQ2Z4BhNRus5O27GKzXD7msY6BYAn56bT_c1lQJoknXRxpWaiCFx6JrFJlmLHKgG6z0h3g3nkgG9svJN6SW--CI8dFQkGgTA-KPVRPxQYIRHht_WdYLMcpSYTNADCRsAElBO53UteJy6akT7LFMn0ftIsF3SJvzyuNp1IE-j1RaLuDBJqDgMwWpcrUsXz_2glLGuEDFfcBghElAd3SFPFx0gv_byEKsjx6rFXisL6VhvHkCyp9xKX1cNDWncL6CoscnIrziTBPoxJvwuZUzobNH85iaAAY839o3NI1V9ygjtzKu9LuC21qPmPzfWh-aoEEgFsaeLhxfv2ATw-xdb6_Ab4aqEsI5yPGBfMT6wwadPaILxmUds6UZ2dzP2sIcE-YnQk3-KQqwO9qgM7zmyeCh5CcuEzXGxRicOOtdXYyuIjNADJoRkqrKoszjvCgcRCywV9I32e9LbdewPEcmgC-qr-hU8GDqHdw4Vt8rXSHMYAFdXUz5rCMcvdeNmcFNvSc3YUbb8F6Sx-WELHfq7kdpZKfFBWSQqU6oHQiLFTRgYAPzw6j4QeSUtbvmUy0mLvkaCi7MfoK0h9AqT4SOcstjaNj3SJSWrKUfwYhtT_W-1itJSLXFCEzevMNCxmXfYdMqTT5fwXk_4X4DIHY2hpe0ilikQ7U30n9F3u4adh2WeqGkouYPCx9Cd82-Kc3k4N0zIsujgxylJZE9VkLjabD_a5iYUc39WqoeHWLt2uhNkxeLuMQAvvKdDHZEwk4XwmCF9tS1h5GQb0-L5j42Z6ncLPuNNnfJ-826_9ty0ZxUZlSWvn5CbSLn7jh526QGI2xybkB5J0p8Q0lBHBt-M0t9f7t6rusHmOSo2vSxZcsES0wvMCoJCP6YjtWdlWHX_97j0w35oPWdjCJUMSzloZCVbb16TaVAQ7pRdOEUYZ3Ds0LMbGjUlW1jN9u4l6AhJ-u269ywcHOC31jMjk537Er7JURUlVxw02pySTrd4idlRIDDzoxKSDkY3eyBS-c5YIF4QVEGUQEnIggAuzLo2YB0EjgZaJRZEadqNFR9RFTTjZvq4OCnlWYZcGIak92DQhyaaFhQMK-7m-fDEMPSweocOeEnneZ2haMbJuKDX2vVorY-_JjNSNXBzEm5VgxP_hUdVglKAZMFOJFsjwzbfaZg1QaCiMnJaEuHcAlTdOC6Yr7NNsg9GZY84zdrkjBtRk-APfkR4ilTvJR0mrirwUTkgENKYnyRZcYcrtkLfAEe9bMzI_ZZSqds60DAjWIiihJ5dmOWnqx31x1vfiIhfPqYvKqlDgAZY_xD6xHNKr31WQ7zUNV2W2KNSQIVDQyvV6M3Lz0KhFSL-GdN3j3XFENrQ5tqr3qD9bfBQkFxkqpcIuv7sga_99Y7t7HEQE2sQWlcIfh8YzHrzfIT7KF3ovFTB2jyxufdEDoLQi-rwyXWGSsA11Jwu8vQ68L8y_cH5wOvB_zBGk6vpcZxOpG4ptsFfzEIOKptvwq9q9wwSRX1VmTOP3WFFHK4CW99-YXPSs-CV24uJH962h7UdAMXq-Em2Z9b-SiQtoDI9MQvWQ5TFIpLHuZfpWQYx5A4dJKtgowDDCXu22yLMs1nW9dVKEQ7UUCIF-DzD4SHCo_K5oqXhwL9NqLEnnjhS2RAp7PxPsUwPM3q_F2WQ8GAo6-7mQyAbleTT2xqdCt6jaqchjVaNdLzHQqA4LewwN0tv3iY9-unQDXbiF6591OTjHyVWhjM9UEUTGRJLfq-kZV6uXyeI1n_iCkTpLLCWx9_Yt_GCyBLhHPZVADJez2F3WKMQaTyLepY5TcFVvSm6fUPizQQsSaVRkcCGyv0r0W8D4VgEUu2dMHwom2ST-AuaS7lnd1RgKUJ04mLx0UyXg1JL7nf37qp8pEDmFiJBQFT_--dQCfrg3EoIpp5xTGRlxU7IcyY-3kVpzknaZdRgHiNUOikJ8Q2DUwmW4J9Df1qxShLjAtk99JFrJhgxg-RFmRrp6mF6PDQXbGmTztkINm9pHvLcOd0MJNbm91-FV5QSp9feulPBISKUGYIZP20ufmVgOTDNlARxWXD1dd7XAR3kswI91w8Ch3G8nyyuGh-yGQ2ComIG4xXl_ayUwx8Jlp5uOb1EveZi9KLrwA1FuLXFLBWZ8Ld5WC8bm9GNFYk4fmJWr8pOYLoclCbTxgMkxTSZmp3qHm9wP_N3uf13IRcQ9D62v6oOYpYevDx_MdeFNM1Ghc5GrtfGO0Rhx3aOUYLTM-BbjBslsmHhv8JB8RucQFrgvoemHJ8BBklcHGZaFSZPOIIucevxI47AuXrlA3UHpkdYmCvH9j5kVmJJhhn9wqGF67v7q2oIIMiZTUZagH5fiswFiQ8CozAOZSvtfNxNcECdPW5TIuFtfao9FcaEk7k_csXvtoTRcZSj4VOwEj8ySHx-Xh3_UjJ5HXbugStrH_7nFkzPN2lf-6vk8BENidaRUlEu_nUBxs4rRVPyk-dDtBRVhJKFN3rQlXN3DH69xdabZyL0l87O6Fbg5isv_rEOcSweQxEXKQuQn7liBkvWJMFQNHlPiletaJWqYisKVGEfMwgVZynZ9XBaEBrxn","summary":[]},{"id":"ws_0302e6abfc642bb0006a4e1273057c819a9ff22e2a2379db4e","type":"web_search_call","status":"completed","action":{"type":"search","queries":["Hello"],"query":"Hello"}},{"id":"rs_0302e6abfc642bb0006a4e1273f884819aa0a17b7a3e9f0d3c","type":"reasoning","content":[],"encrypted_content":"gAAAAABqThJ4-gdu2wE9dcJExOUXT5ayWw4xaS2tZ8jgqv8Suyn43GfAQAHeHm6sdRdXd0h0kjZBR_ltVG5ndhhLt5KkoZshw6Nwz17TboJI87chhxe0jQVQ7MbFTDKYcEk8mcl8h2GAYpkNN2IPHr_AnyjZnBTLmqRckIiJrhT-9hzSjlCQ33YSG1JKvOK8qiZy1yYjn6GmZZQ0l1JnucVpvrv_bgTF_Q-LnJhO_gSgNTwdHrrgY-o5Jbyz_u0sOenwPEnqgB2l9I1MXYcxm_XJ1wIu3CpW8f7lN6vnQLCkik8aNr2GepJep1PlFxN_EbzeglaSa3of3M-fmZiwwU1k61QFUKaKVn7_bScKBcw1gn2L9DcFaanjjo22Exo4v5FggW9h4VgYuuqU1gLT3kp-GiqG7-36XNHUH_Q9RwNqpfKy42CocHI0X246skpEdnyPJo3vL_yMfADRiOkjKLcdDAe15AVjhjgswfQgMK9GytH4WZ7tR-JMI6P9JlRuObFQwYb0spWWtjHMmIOE6Ujodf12_MVlICmaFHsIvHV-CyTXqOLIrDgovgMCgwu1OP6Pnr1XXujVE_SSJoVE5tnbcnkGrO3yULmVa-xjws3IvpCwGv0rCGOPcNDtoXwZemKhccc7tuIKHygJq6QDauOziLpjRdapfwcWlJ-7GkK5zisZWNofutJNIUcfBQWhBC6l15cgMTwGICydbu7lNO5ORGQ50MNaLTJBhu7ElZTX8KcnCPQFstIzspBA4rI1zRi8sDo65CMZuz7qOHnlPQNNzpaShrnnCDoIpPXlApkB1LMThlPW5zXq3IJ6YgwKlY7b54xjAoTu0P8cTAyI0D9KM5QkXDPyRWAaqoqnSrqc-npHCCUR_jxFHGTbwNyeCE1204HMGrta1MpNqxeM-Eu-i9d6IEfY9KfGgKdqoB4y8m_ggl1gB4YkQny2XhPanF9pQsnD2XbgQ_3qQCQt2YqvwOvxQh9n5iH0vXbomCujUxLb8ZPaKZawMlyLBIvoMIkwRGj4bXK1YhvUV62E_IclcYIvljY9OcfiCvin1DLVyTQaZmYMgkzIB8-4sYuG27eLg9KL9CdqC2kfPVlKze_d1_SSiX3creAgwowv-r_t9bmAXE0A-Z5EglsxjxCIMDsBfScjnAyomQukhHTtUt2qmKoL7Hn2q-fR52wkMb9seBi0G0hmCKyctNOpcklkIWmmqh4ybGEF1O_fBUQeZFSaIqrLdFFl9dXq9n3QQYcTBnBP45uyW3KnDMX0jYRgcgvkQBnJJ8CyJqDFsq8vo7NPzr1nSWhvePI_Quzb7rppK8px_ers54rguI-03SUjh0H7HNSu_lUwm_YbPXT2h3Eae13w1keSWUlyyEOJ-z1yOObv_Zdzbjz5byDSTCNMOInf0Zltv0dFjLWde2wLX4OsbzQOfpmNHEXDBCvfmo3Ruyyd7tHCyaaa-KMQXvZNuHzaCG5L2eV0rjd23d7nmUGVb-yWlSU1IMLFE2sooAsr-8DRJ1EVKVC-gb-ZAGq6Za9CyYJWHbOMk9vqWv8nP2vsUK0sqj34qgwzjmJaKXALULfSdtMHdLWCnF1qegYa4vZmBYf0pRZrAWsKA5VDlAkVAyO-Dj0VEpit_8mGgF0OXhe3OlzGt3Db17RuTF1c9V2vjoEWesFED_PynfFKdar2G87j0UlMXIyQ_ZOaO59OQNxXs8M-xv8UzJGcIqzu4LjuW0GQTXJA1Uyg0z9jozikOm4B8cpeCApKXCMqNU9fl4bMjtyBIcD1_lwWuRpXf3-vd62Q2LEDJLYfLl5w7rCpcI4eKhFR8ddsSX6aEgjuGO6f0zd0c6dj5hveq8HPcK1B_ILwPOD-K-KYIYKEbVB5I2XL7-k1FO2gMm-NNYZ8udG3Jd3xCwm3r9F8wbGlFolyG9B9rii9j4uciHtU4-TwHKopRbwenontqZU8I9o0DRir3ZQi6VW1r9GaBoEOjttndnZ1Ld1vpQVIMZudIH4ac-gfeninhKbtkq1qm2EyRNO7p85jNokJRKvAM7XciwoMDUdWWpfoVAYuBEAUVp8qMApczjvS-wp0XZTecyHxl3Hvn6hRQV1x4S7IEYtbexFFVUV9voYA43nSF-kN7GxAznsgJs1JEp0pcXiIejQ_Sy4VqgEJujjHkc5PSCPr2m6r-fZP1oTOhi4KXtJI4b0PWSxgMbRqTud2xyy1oGOHPSF7eM-sMOeGD_x7pX7A-M_dGNnoQ8ueFtKf3pp7WrrLEDpmH-BgpS5oUvJV8h75ZsKkLB4ZGym-aiD9YS1ESgW8J0fYX2Dm8nmq0xc6wnXkrb9q087zMw8NAH901a9PUEWqRH5xuUeNZzXwgW-5afvDzS7OqKhBHXW9W4K7mYJ3OvzDMECmy0_TCijjR5PhcxIz8gqmbHO2jz3WoG9YIOq7xMI0dKnQDucp0ovSpMP4I3QVyhP1AXm0i3CDtXz6VURCLFS2F39cwecEzCaxhihbyC1wFDZBckI_qR1v5byW4a5e2GEGAN5Advyeqcrej9DyUcSClxGwvgt3Ixj5qDUUQZmxhNEHpI_YJG9gSa5VNLi-aD-e2cfwx8iAGc7QPLmo9DOrDhDf73dhMuosTdFsauW3CfSOZ5dZtamTm2gzn0W5Yabeke36lzJT7U5oxG6xCed6ZA2UOncFZo1BZ9hLg_mN45-06won4dJEF5UV2r_J0LvnjQw3UaVo_oyTjaIw0iobmRdKX_LK0MrVIZX5Xt9DVUS2vR3KVyu6jN-7L7f9DyCSTptmI3hhX43ZfTO1P5NNn7zNhfQ_GMZd858ftm9czH5sjpjNd6t0plHBHh7klZrgfQjZW6Aw1WgRvqcuICEW3GYezJMTgWx4ZZBnZff3CPW0L8jfZF4jZZ9VROF34UguyFvqmnBBJmD-9hOCGjiAWFg0zxyrdUsAhtvsEgnqBsPfpbLYoko1uOQcFk-3y41TkAWTH7UB4fki4jYVmqn8ywiFKgwf1CdGuKNppMy3OO8lopyi3QPq7U2WQnL-cYP7RszCR_7gavtILfHvrqEi-kz1PSRJXVEjuXPyUryL7hx4UJ8iG4jIFt-Yla4YsvOhJpVYxpLHTRpwRt0mRpcDm_z6dbbw74neba10YUdCLNeds0piutuR9mcKLdvE9uRV_B-A1gN0Csw3KG8TejrX5DxmZXzOtqWojGMZCD4hE7qCCUFb7wDI99l5578gyMHrQKO_b-6IfX5aTqrTE3M0BZkwK4u1OgIHYePw5iLpbONXnXdq3d0EoJAM0qjKtHMgg5YzUyayyiq2btRZkf1m6nijG-hOdyxZfXVdX_E7s6YvOvF1VWuU_m6W4oWHVl2-CclOIwIvptb-JtIkVnP9oDJGBEnKlqgaAqzNePLwDyih8DmKjOf4tJ4J605TK2hnu6DLHKKxuHOWNqAWzUxqIq_QP3UaUaiNf2GtZSigR2lhFvFcZWkGWH8L9atT6XB4q_Yxpt8mRvhAx7U2EXsmdlwh8hVEQXQsHMzQgdCQdHeVH9UQYzPR_txlLx42ZXTk49IvBHf6xA9dTuT36F6Lpu1Wsxyl9QRb8IFS97nLyiZG5DBewh_6MHutlOoLdDa9OBrTE7tos97kJHCNCrrL38cadqZg6DmEV089F0nspK9LNVmfdv0jA9Pm4uJH06Irda94NTQRiZWCvCUwrS07A_noOT2Nb6yMKh3O8-3h-tgv-6kw4QnPbiRg79xj320eS8nwfeL5f3wWpBz6uKEqEMpYpi7G2k1z56-OTyGkkzwtC5xJmK1fSzUXmD2GYbBUhV9k7h2zwn3PDgnIK7Y53IpvVqVLIyoFcKQm2SJrpaM83TMRZcM0lKmBAGTTfWTwsHGNnQMjlGPs0HOEjYqb_bBB_oiIwJ1rOx6nyQrY9pADcit3jJl5gANHqUtPWRMjE3iwl48XeR90F9thhZ-4JIlI1DOOdQ8nrB4xQ5lrSO5TUWa8D9KICnf1xFHyTeQlMgZWZKQYxvi0T55oBTP8u1twFPRiMOnzXgKYGabC33DNwcrxl0TgqiTn1VH1Q1XESxIl5-t-MGv7Pj4VCisHmUzd9gt8U9Y5geQTTZAl_ZLH1fjEp4XGd_dgCALfsRrDTAsB2XkuGUeGBafmMGHxxZlmZeNRwgYJMTcFvAKucV6IvRwKj_rE2AocmyKzPMMg42ojLdQr4s330W5c1D38QguUxif_g8fnyF576cYFeMD7usDPscZiYMBvPzdo1MCMYbGnILZ6juzEcDmY_NFyfkcW_XlJi094hXGVj5TOALs8YKV30hxZwbyS3eCVC1WihtL6V1Z5QPBC4m0jtldahv5w9KrWVWaCe3SST-in-SE-juce3iQCTAigHekmAg2Tg-XrSoBgd0_K81eeQL3K_9DfHVT39YR8LJX8SJ30BpERZGG6qjCfKCPchfWYnkl9gJ3oqQD1FJkpoW2Hp2mtqbNBcMIQ8SvoLAia0XJ81fhCngO_znsgtEqN91X_9C3c0A==","summary":[]},{"id":"msg_0302e6abfc642bb0006a4e1277fe58819aa5e1af55ed4cc274","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"Hi - there! Hello—how can I help you today? I can answer questions, help with writing - or planning, assist with code, or look up information. What would you like to - do?"}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":"current_turn","effort":"medium","mode":"standard","summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":1}},"tools":[{"type":"web_search","filters":{"allowed_domains":["wikipedia.org","example.com"]},"return_token_budget":"default","search_content_types":["text"],"search_context_size":"high","user_location":{"type":"approximate","city":"San - Francisco","country":"US","region":"California","timezone":"America/Los_Angeles"}}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":9429,"input_tokens_details":{"cached_tokens":0},"output_tokens":1680,"output_tokens_details":{"reasoning_tokens":1600},"total_tokens":11109},"user":null,"metadata":{}},"sequence_number":22} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream-sse.yaml b/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream-sse.yaml deleted file mode 100644 index 1f81aaa..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream-sse.yaml +++ /dev/null @@ -1,144 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '376' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: true - tool_choice: required - tools: - - type: function - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0819e915c18c8ae2006a4e12687184819b9887f5017eb62e91","object":"response","created_at":1783501416,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0819e915c18c8ae2006a4e12687184819b9887f5017eb62e91","object":"response","created_at":1783501416,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","type":"function_call","status":"in_progress","arguments":"","call_id":"call_F50udXEwPchwJfzStrdgeeqW","name":"guess_number"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","obfuscation":"8LM4MmdeAJG1W8","output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"number","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","obfuscation":"E5gaivoxl7","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"\":","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","obfuscation":"d3lj4yXCyzYsoi","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"50","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","obfuscation":"RLVsOnq4jBDw7J","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"}","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","obfuscation":"ph0TPQT55L6iGQ8","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.function_call_arguments.done - - ' - - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"number\":50}","item_id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","type":"function_call","status":"completed","arguments":"{\"number\":50}","call_id":"call_F50udXEwPchwJfzStrdgeeqW","name":"guess_number"},"output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0819e915c18c8ae2006a4e12687184819b9887f5017eb62e91","object":"response","created_at":1783501416,"status":"completed","background":false,"completed_at":1783501416,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[{"id":"fc_0819e915c18c8ae2006a4e1268c48c819bac09e2c60bad4639","type":"function_call","status":"completed","arguments":"{\"number\":50}","call_id":"call_F50udXEwPchwJfzStrdgeeqW","name":"guess_number"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":57,"input_tokens_details":{"cached_tokens":0},"output_tokens":6,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":63},"user":null,"metadata":{}},"sequence_number":10} - - ' - - ' - - ' diff --git a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream.yaml b/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream.yaml deleted file mode 100644 index 13b9a22..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-non-stream.yaml +++ /dev/null @@ -1,120 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '377' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: false - tool_choice: required - tools: - - type: function - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: application/json - body: - id: resp_0a69e358971465dc006a4e12679768819b90ab80f2823ecf8d - object: response - created_at: 1783501415 - status: completed - background: false - billing: - payer: developer - completed_at: 1783501416 - error: null - frequency_penalty: 0.0 - incomplete_details: null - instructions: null - max_output_tokens: null - max_tool_calls: null - model: gpt-4.1-nano-2025-04-14 - moderation: null - output: - - id: fc_0a69e358971465dc006a4e1267ff34819b90cd90efdcd9cbc4 - type: function_call - status: completed - arguments: '{"number":50}' - call_id: call_AIeNWxKUdw8bFL7pk8xEfV3Q - name: guess_number - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: null - effort: null - summary: null - safety_identifier: null - service_tier: default - store: true - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: required - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: - - type: function - description: Guess a number. - name: guess_number - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 57 - input_tokens_details: - cached_tokens: 0 - output_tokens: 6 - output_tokens_details: - reasoning_tokens: 0 - total_tokens: 63 - user: null - metadata: {} diff --git a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-stream.yaml b/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-stream.yaml deleted file mode 100644 index f95f89d..0000000 --- a/tests/cassettes/openai/responses/test_tools/test_tool_choice_required-stream.yaml +++ /dev/null @@ -1,144 +0,0 @@ -request: - method: POST - path: /v1/responses - query_params: {} - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '376' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.30.0 - body: - input: - - role: user - content: What number am I thinking of? - model: gpt-4.1-nano - stream: true - tool_choice: required - tools: - - type: function - name: guess_number - description: Guess a number. - parameters: - type: object - properties: - number: - type: integer - description: The guessed number. - required: - - number - additionalProperties: false - strict: true -response: - status_code: 200 - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0c30bb1cbf2e92df006a4e12669c64819aa4e87d604f083d99","object":"response","created_at":1783501414,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0c30bb1cbf2e92df006a4e12669c64819aa4e87d604f083d99","object":"response","created_at":1783501414,"status":"in_progress","background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","type":"function_call","status":"in_progress","arguments":"","call_id":"call_OnczRcbDpw6T3H08KZNvoqUl","name":"guess_number"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"{\"","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","obfuscation":"frARQphOBKMIxb","output_index":0,"sequence_number":3} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"number","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","obfuscation":"CYxziXbWJT","output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"\":","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","obfuscation":"XJBFJ2X3RLWgPw","output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"50","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","obfuscation":"eoOhYJbpCv1VSC","output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.function_call_arguments.delta - - ' - - 'data: {"type":"response.function_call_arguments.delta","delta":"}","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","obfuscation":"IWMlK6HqM3DCTH3","output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.function_call_arguments.done - - ' - - 'data: {"type":"response.function_call_arguments.done","arguments":"{\"number\":50}","item_id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","type":"function_call","status":"completed","arguments":"{\"number\":50}","call_id":"call_OnczRcbDpw6T3H08KZNvoqUl","name":"guess_number"},"output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0c30bb1cbf2e92df006a4e12669c64819aa4e87d604f083d99","object":"response","created_at":1783501414,"status":"completed","background":false,"completed_at":1783501415,"error":null,"frequency_penalty":0.0,"incomplete_details":null,"instructions":null,"max_output_tokens":null,"max_tool_calls":null,"model":"gpt-4.1-nano-2025-04-14","moderation":null,"output":[{"id":"fc_0c30bb1cbf2e92df006a4e1266fec4819ab38d81708db1bfb2","type":"function_call","status":"completed","arguments":"{\"number\":50}","call_id":"call_OnczRcbDpw6T3H08KZNvoqUl","name":"guess_number"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":true,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"required","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[{"type":"function","description":"Guess - a number.","name":"guess_number","parameters":{"type":"object","properties":{"number":{"type":"integer","description":"The - guessed number."}},"required":["number"],"additionalProperties":false},"strict":true}],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":57,"input_tokens_details":{"cached_tokens":0},"output_tokens":6,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":63},"user":null,"metadata":{}},"sequence_number":10} - - ' - - ' - - ' diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/README.md b/tests/cassettes/sources/tool_call_image_result_parallel/README.md new file mode 100644 index 0000000..ea7e463 --- /dev/null +++ b/tests/cassettes/sources/tool_call_image_result_parallel/README.md @@ -0,0 +1,19 @@ +# Chat image tool-result recording + +These two files are faithful, sanitized recordings from the official OpenAI Chat Completions API at `https://api.openai.com/v1/chat/completions`. They were recorded on November 3, 2026, outside pytest, using `scripts/recorder_proxy.py` with an in-process `httpx.ASGITransport` driver. The recorder's HTTP client made the live requests. The developer authorized the recording and use of the repository's `.env` credentials; credentials are not included in these files. + +The requested model was `gpt-4.1-mini`; the provider returned `gpt-4.1-mini-2025-04-14`. Both requests stream with `max_completion_tokens: 4096`, usage reporting, and parallel tool calls enabled. OpenAI SDK 2.53.0 parsed the streams. No response fields, tool IDs, timestamps, model names, usage counts, or chunk boundaries were matched to another protocol. + +- `openai-chat_completions-stream-00.yaml` asks for `read_image('a.png')` and `read_image('b.png')` in parallel. It returns two calls, 15 chunks, and `finish_reason: tool_calls`. +- `openai-chat_completions-stream-01.yaml` carries the actual SDK-collected assistant calls. Both text-only tool messages precede the labeled image user messages, which reuse the image data from the existing Responses scenario. The final user asks what the logos are. The response has 36 chunks, no further calls, and `finish_reason: stop`. + +Chat tool messages cannot contain images. This source demonstrates the supported relocation shape: `assistant, tool A, tool B, user image A, user image B, user question`. Portable call IDs remain linked to their tool results and image labels. It establishes acceptance of these exact requests by the recorded OpenAI model; it does not establish acceptance by other providers or models. + +Both streams include one usage chunk and a final `[DONE]` marker. The recorder masks authorization and retains only its configured header whitelist. Recorded `content-length` values describe the original transport and are not recalculated after sanitization. + +The originals are retained separately from deliberately matched fixtures. Matching must operate on companions after the originals have been reviewed and committed. + +| Original | SHA-256 | +| ---------------------------------------- | ------------------------------------------------------------------ | +| `openai-chat_completions-stream-00.yaml` | `1776fa3d366845fa964be447c8d13d1d63d2d67f79be990a581a50b369457e89` | +| `openai-chat_completions-stream-01.yaml` | `9a0ff0d4af27e3d6f7c18f8c3516dcabca10bd94f8cd3e67ab08bbf12692f2a6` | diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml new file mode 100644 index 0000000..c53d4b3 --- /dev/null +++ b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml @@ -0,0 +1,146 @@ +filename: 2026-11-03-01a1a065-d257-7b51-add3-46beaee11c53 +request: + body: + max_completion_tokens: 4096 + messages: + - content: + - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. + type: text + role: user + model: gpt-4.1-mini + parallel_tool_calls: true + stream: true + stream_options: + include_usage: true + tools: + - function: + description: Read an image from a file path. + name: read_image + parameters: + additionalProperties: false + properties: + file_path: + description: Path to the image file. + type: string + required: + - file_path + type: object + strict: false + type: function + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '562' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a065-d257-7b51-add3-46beaee11c53 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"3j07B"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_KrxybpvPfiAtSG14EkBwDSAF","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"OFlkx"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"fi"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"eqsmD6vStWL"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"le_pa"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"w2K9SIIPtjM"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"th\": + \""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"yrnk4GdP"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"a.pn"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"Ua5A81EoeYlu"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"g\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"BiQsxj6r7tQ3"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_1KSIk5BzbchE6ekWlgFAjWhm","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"xblY4"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"fi"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"4LtV3is5ev0"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"le_pa"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"CXYXa6rJ2eP"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"th\": + \""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"nyz0o5Pm"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"b.pn"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"HchiPLAEq0TZ"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"g\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"MDK1DbpnX8WJ"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"HJ3TWN1FE4cNWP"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[],"usage":{"prompt_tokens":74,"completion_tokens":48,"total_tokens":122,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"BgoIf1dL"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-03T07:53:09.975046+00:00' diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml new file mode 100644 index 0000000..77422c9 --- /dev/null +++ b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml @@ -0,0 +1,336 @@ +filename: 2026-11-03-01a1a065-dae9-78a3-8674-02cc2c923294 +request: + body: + max_completion_tokens: 4096 + messages: + - content: + - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. + type: text + role: user + - role: assistant + tool_calls: + - function: + arguments: '{"file_path": "a.png"}' + name: read_image + id: call_KrxybpvPfiAtSG14EkBwDSAF + type: function + - function: + arguments: '{"file_path": "b.png"}' + name: read_image + id: call_1KSIk5BzbchE6ekWlgFAjWhm + type: function + - content: + - text: The image result of tool call 'call_KrxybpvPfiAtSG14EkBwDSAF' will be + attached as user prompt after all tool responses. + type: text + role: tool + tool_call_id: call_KrxybpvPfiAtSG14EkBwDSAF + - content: + - text: The image result of tool call 'call_1KSIk5BzbchE6ekWlgFAjWhm' will be + attached as user prompt after all tool responses. + type: text + role: tool + tool_call_id: call_1KSIk5BzbchE6ekWlgFAjWhm + - content: + - text: 'Image returned by tool call ''call_KrxybpvPfiAtSG14EkBwDSAF'':' + type: text + - image_url: + url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== + type: image_url + role: user + - content: + - text: 'Image returned by tool call ''call_1KSIk5BzbchE6ekWlgFAjWhm'':' + type: text + - image_url: + url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== + type: image_url + role: user + - content: + - text: What are the logos? + type: text + role: user + model: gpt-4.1-mini + parallel_tool_calls: true + stream: true + stream_options: + include_usage: true + tools: + - function: + description: Read an image from a file path. + name: read_image + parameters: + additionalProperties: false + properties: + file_path: + description: Path to the image file. + type: string + required: + - file_path + type: object + strict: false + type: function + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '4693' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a065-dae9-78a3-8674-02cc2c923294 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AW2edIQZ"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Jew5sCR"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + images"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DIz"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3fbOXw"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + provided"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + both"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pWMPI"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + show"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"elZTQ"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0p5C3y"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + Git"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aiALSK"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Hub"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rFvAdve"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + logo"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCavp"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1eeOa5sQB"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + which"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s12L"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Mc0rI0U"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iF0tIY"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + silhouette"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pwFpjp84LSXotXt"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DXjpgKu"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YEG6acEW"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + cat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pbMAS9"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CV5Oz"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + an"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iaaYwAy"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + oct"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7wy2ze"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"opus"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Eg443Z"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"-like"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Yzrrw"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + tail"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YMHz3"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OuaaxF5Hm"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + commonly"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"c"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + known"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dApN"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + as"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RS29CIC"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FG58fe"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" + \""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fTjj2s3"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Oct"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xAGYgdy"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"ocat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4g2m1H"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":".\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4woCKWV"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"F30L"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[],"usage":{"prompt_tokens":1098,"completion_tokens":34,"total_tokens":1132,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ow8Ob"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-03T07:53:12.169336+00:00' diff --git a/tests/conftest.py b/tests/conftest.py index 06b4bc8..0a1bd01 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,51 +3,12 @@ import httpx import pytest -from molto.utils.test import OpenAICassetteManager - - -def pytest_addoption(parser: pytest.Parser) -> None: - """Register the explicit cassette recording option. - - Example: - pytest_addoption(parser) - # parser accepts --record-cassettes as a boolean flag - """ - parser.addoption( - "--record-cassettes", - action="store_true", - default=False, - help="Record OpenAI SDK calls to sanitized YAML cassettes.", - ) - - -@pytest.fixture -def cassette_manager(request: pytest.FixtureRequest) -> OpenAICassetteManager: - """Return the per-test cassette manager fixture. - - Example: - # In tests/test_demo.py::test_demo[stream], cassette_manager.node_slug is: - # "test_demo-stream" - """ - return OpenAICassetteManager.from_pytest_request( - request, - record=request.config.getoption("--record-cassettes"), - ) - @pytest.fixture(autouse=True) def _block_httpx_network_in_playback( - request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch, ) -> None: - """Block default httpx network transport during cassette playback. - - Example: - # Without --record-cassettes, a raw httpx.AsyncHTTPTransport request raises: - # AssertionError("Unexpected real network call during cassette playback: ...") - """ - if request.config.getoption("--record-cassettes"): - return + """Block default httpx network transport during every test run.""" async def blocked_network( self: httpx.AsyncHTTPTransport, diff --git a/tests/core/test_exceptions.py b/tests/core/test_exceptions.py index 2a49b68..ed3eb3a 100644 --- a/tests/core/test_exceptions.py +++ b/tests/core/test_exceptions.py @@ -1,4 +1,3 @@ -from collections.abc import Sequence from copy import deepcopy from dataclasses import dataclass from itertools import product @@ -31,6 +30,12 @@ ResourceNotFoundError, ) from molto.utils.io import json_loads, read_yaml +from tests.cassette_discovery import ( + Mode, + RouteCase, + discover_conversations, + route_cases, +) CASSETTE_DIR = Path(__file__).parents[1] / "cassettes" / "errors" Protocol = Literal["responses", "chat/completions", "messages"] @@ -117,22 +122,18 @@ class ErrorScenario: ) -def scenario_ids(scenarios: Sequence[ErrorScenario]) -> list[str]: - return [scenario.name for scenario in scenarios] - - -def _cassette_path(scenario: str, protocol: Protocol, *, stream: bool = True) -> Path: - prefix = { - "responses": "openai-responses", - "chat/completions": "openai-chat_completions", - "messages": "anthropic-messages", - }[protocol] - filename = f"{prefix}-{'stream' if stream else 'non_stream'}-00.yaml" - return CASSETTE_DIR / scenario / filename +ERROR_CONVERSATIONS = discover_conversations( + CASSETTE_DIR, scenarios=(scenario.name for scenario in ERROR_SCENARIOS) +) -def _read_cassette(scenario: str, protocol: Protocol, *, stream: bool = True) -> dict[str, Any]: - return read_yaml(_cassette_path(scenario, protocol, stream=stream)) +def _error_cases(mode: Mode) -> list[Any]: + return [ + pytest.param(scenario, case, turn, id=f"{case.id}-{turn:02d}") + for scenario in ERROR_SCENARIOS + for case in route_cases(ERROR_CONVERSATIONS, scenario.name, mode, ROUTES) + for turn in case.upstream.turns + ] def _response_body(cassette: dict[str, Any]) -> dict[str, Any]: @@ -181,21 +182,15 @@ async def _replay_sdk_error( cassette: dict[str, Any], protocol: Protocol, error_type: type[OpenAIAPIError | AnthropicAPIError], - *, - base_url: str | None = None, ) -> tuple[OpenAIAPIError | AnthropicAPIError, list[Any]]: http_client, requests = _get_http_client(cassette) events = [] async with http_client: if protocol == "messages": - sdk = AsyncAnthropic( - http_client=http_client, api_key="test-api-key", max_retries=0, base_url=base_url - ) + sdk = AsyncAnthropic(http_client=http_client, api_key="test-api-key", max_retries=0) create = sdk.messages.create else: - sdk = AsyncOpenAI( - http_client=http_client, api_key="test-api-key", max_retries=0, base_url=base_url - ) + sdk = AsyncOpenAI(http_client=http_client, api_key="test-api-key", max_retries=0) create = ( sdk.responses.create if protocol == "responses" else sdk.chat.completions.create ) @@ -213,11 +208,12 @@ async def _replay_sdk_error( return exc_info.value, events -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -@pytest.mark.parametrize("scenario", ERROR_SCENARIOS, ids=scenario_ids(ERROR_SCENARIOS)) -async def test_error_scenario(scenario: ErrorScenario, downstream: Protocol, upstream: Protocol): - downstream_cassette = _read_cassette(scenario.name, downstream) - upstream_cassette = _read_cassette(scenario.name, upstream) +@pytest.mark.parametrize(("scenario", "case", "turn"), _error_cases("stream")) +async def test_error_scenario(scenario: ErrorScenario, case: RouteCase, turn: int): + """Ensures each discovered provider error preserves SDK parity and the full cause chain.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + downstream_cassette = read_yaml(case.downstream.paths[turn]) + upstream_cassette = read_yaml(case.upstream.paths[turn]) expected_response = upstream_cassette["response"] stream_error = "sse" in expected_response sdk_error, sdk_events = await _replay_sdk_error( @@ -249,7 +245,7 @@ async def test_error_scenario(scenario: ErrorScenario, downstream: Protocol, ups stream = await coordinator( body=body, endpoint=upstream, - provider="anthropic" if upstream == "messages" else "openai", + provider=case.upstream.provider, api_key="test-api-key", ) async with stream: @@ -319,15 +315,46 @@ async def test_error_scenario(scenario: ErrorScenario, downstream: Protocol, ups @pytest.mark.parametrize("api_key", [None, ""]) @pytest.mark.parametrize("stream", [False, True]) @pytest.mark.parametrize( - "base_url", + ("base_url", "expected_urls"), [ - None, - "https://gateway.example/api", - "https://gateway.example/api/", - "https://gateway.example/api//", + ( + None, + { + "responses": "https://api.openai.com/v1/responses", + "chat/completions": "https://api.openai.com/v1/chat/completions", + "messages": "https://api.anthropic.com/v1/messages", + }, + ), + ( + "https://gateway.example/api", + { + "responses": "https://gateway.example/api/responses", + "chat/completions": "https://gateway.example/api/chat/completions", + "messages": "https://gateway.example/api/v1/messages", + }, + ), + ( + "https://gateway.example/api/", + { + "responses": "https://gateway.example/api/responses", + "chat/completions": "https://gateway.example/api/chat/completions", + "messages": "https://gateway.example/api/v1/messages", + }, + ), + ( + "https://gateway.example/api//", + { + "responses": "https://gateway.example/api//responses", + "chat/completions": "https://gateway.example/api//chat/completions", + "messages": "https://gateway.example/api//v1/messages", + }, + ), ], ) -async def test_missing_credentials(downstream, upstream, api_key, stream, base_url, monkeypatch): +async def test_missing_credentials( + downstream, upstream, api_key, stream, base_url, expected_urls, monkeypatch +): + """Ensures missing keys fail locally with SDK causes and credential-free intended URLs.""" for name in ( "OPENAI_API_KEY", "OPENAI_ADMIN_KEY", @@ -339,40 +366,54 @@ async def test_missing_credentials(downstream, upstream, api_key, stream, base_u monkeypatch.delenv(name, raising=False) monkeypatch.setattr(ENV_CONFIG, "openai_api_key", SecretStr("")) monkeypatch.setattr(ENV_CONFIG, "anthropic_api_key", SecretStr("")) - upstream_cassette = _read_cassette("invalid_api_key", upstream) - downstream_cassette = _read_cassette("invalid_api_key", downstream) - request_body = deepcopy(downstream_cassette["request"]["body"]) - request_body["stream"] = stream - http_client, requests = _get_http_client(upstream_cassette) + bodies = { + "responses": { + "model": "test-model", + "input": "Hello", + "max_output_tokens": 16, + "stream": stream, + }, + "chat/completions": { + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "max_completion_tokens": 16, + "stream": stream, + }, + "messages": { + "model": "test-model", + "messages": [{"role": "user", "content": "Hello"}], + "max_tokens": 16, + "stream": stream, + }, + } + requests: list[Request] = [] + + def fail_on_request(request: Request) -> Response: + requests.append(request) + raise AssertionError("Missing credentials must fail before HTTP transport") + + http_client = AsyncClient(transport=MockTransport(fail_on_request)) sdk_error_type = TypeError if upstream == "messages" else OpenAIError expected_error_type = ( AnthropicAuthenticationError if downstream == "messages" else OpenAIAuthenticationError ) - origin = base_url or ( - "https://api.anthropic.com" if upstream == "messages" else "https://api.openai.com/v1" - ) - reference_error, _ = await _replay_sdk_error( - upstream_cassette, - upstream, - AnthropicAuthenticationError if upstream == "messages" else OpenAIAuthenticationError, - base_url=origin, - ) async with http_client: - # Missing credentials fail locally; no response cassette should be consumed. with pytest.raises(sdk_error_type) as sdk_exc_info: if upstream == "messages": - sdk = AsyncAnthropic(http_client=http_client, api_key="", max_retries=0) + sdk = AsyncAnthropic( + http_client=http_client, api_key="", max_retries=0, base_url=base_url + ) create = sdk.messages.create else: - sdk = AsyncOpenAI(http_client=http_client, api_key="", max_retries=0) + sdk = AsyncOpenAI( + http_client=http_client, api_key="", max_retries=0, base_url=base_url + ) create = ( sdk.responses.create if upstream == "responses" else sdk.chat.completions.create ) - sdk_body = deepcopy(upstream_cassette["request"]["body"]) - sdk_body["stream"] = stream - await create(**sdk_body) + await create(**bodies[upstream]) assert requests == [] client = Molto(http_client=http_client) @@ -383,7 +424,7 @@ async def test_missing_credentials(downstream, upstream, api_key, stream, base_u }[downstream] with pytest.raises(expected_error_type) as exc_info: await coordinator( - body=request_body, + body=bodies[downstream], endpoint=upstream, api_key=api_key, base_url=base_url, @@ -404,7 +445,7 @@ async def test_missing_credentials(downstream, upstream, api_key, stream, base_u assert error.status_code == error.response.status_code == 401 assert error.request is error.response.request is normalized_error.request assert error.request.method == "POST" - assert error.request.url == reference_error.request.url + assert str(error.request.url) == expected_urls[upstream] assert "authorization" not in error.request.headers assert "x-api-key" not in error.request.headers assert error.request_id is None @@ -412,13 +453,12 @@ async def test_missing_credentials(downstream, upstream, api_key, stream, base_u assert requests == [] -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -@pytest.mark.parametrize("scenario", ERROR_SCENARIOS, ids=scenario_ids(ERROR_SCENARIOS)) -async def test_non_streaming_error_scenario( - scenario: ErrorScenario, downstream: Protocol, upstream: Protocol -): - downstream_cassette = _read_cassette(scenario.name, downstream, stream=False) - upstream_cassette = _read_cassette(scenario.name, upstream, stream=False) +@pytest.mark.parametrize(("scenario", "case", "turn"), _error_cases("non_stream")) +async def test_non_streaming_error_scenario(scenario: ErrorScenario, case: RouteCase, turn: int): + """Ensures discovered complete-response errors retain SDK behavior on every supported route.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + downstream_cassette = read_yaml(case.downstream.paths[turn]) + upstream_cassette = read_yaml(case.upstream.paths[turn]) request_body = deepcopy(downstream_cassette["request"]["body"]) assert request_body["stream"] is False expected_response = upstream_cassette["response"] @@ -467,7 +507,7 @@ async def test_non_streaming_error_scenario( await coordinator( body=request_body, endpoint=upstream, - provider="anthropic" if upstream == "messages" else "openai", + provider=case.upstream.provider, api_key="test-api-key", ) assert exc_info.value.__cause__.response.is_closed diff --git a/tests/core/test_interface.py b/tests/core/test_interface.py index b4e0dab..3a8ac85 100644 --- a/tests/core/test_interface.py +++ b/tests/core/test_interface.py @@ -8,27 +8,23 @@ from anthropic import AsyncAnthropic from anthropic import AsyncStream as AnthropicAsyncStream from anthropic import BadRequestError as AnthropicBadRequestError +from anthropic.lib.streaming._messages import accumulate_event from httpx import AsyncClient, MockTransport, Request, Response from openai import AsyncOpenAI, AsyncStream from openai import BadRequestError as OpenAIBadRequestError +from openai.lib.streaming.chat import ChatCompletionStreamState from pydantic import BaseModel, ValidationError from molto import Molto -from molto.adapters.anthropic import AnthropicMessagesAdapter -from molto.adapters.openai import OpenAIChatCompletionsAdapter, OpenAIResponsesAdapter -from molto.providers import DEFAULT_PROVIDER_BY_ENDPOINT, PROVIDER_CAPABILITIES, Provider +from molto.providers import DEFAULT_PROVIDER_BY_ENDPOINT, Provider from molto.types.anthropic_messages import ( - AnthropicMessagesCreateRequest, AnthropicMessagesResponse, ) from molto.types.exceptions import UnsupportedInput from molto.types.openai_chat_completions import ( - OpenAIChatCompletionsCreateRequest, OpenAIChatCompletionsResponse, ) -from molto.types.openai_responses import OpenAIResponsesCreateRequest, OpenAIResponsesResponse -from molto.upstream.anthropic import AnthropicMessagesClient -from molto.upstream.openai import OpenAIChatCompletionsClient, OpenAIResponsesClient +from molto.types.openai_responses import OpenAIResponsesResponse from molto.utils.io import dumps_sse, json_loads, load_sse, read_yaml from molto.utils.test import ( assert_contains_expected, @@ -36,6 +32,17 @@ reconstructable_chat_completions_chunks, reconstructable_responses_event, ) +from tests.cassette_discovery import ( + MATCHED_CONVERSATIONS, + NATIVE_CONVERSATIONS, + Conversation, + Mode, + RouteCase, + parse_cassette, + public_conversations, + route_cases, + select_conversation, +) CASSETTE_DIR = Path(__file__).parents[1] / "cassettes" MATCHED_CASSETTE_DIR = CASSETTE_DIR / "matched" @@ -65,9 +72,6 @@ "prompt_cache_implicit", "prompt_cache_explicit", ) -PROMPT_CACHE_CASES: tuple[tuple[str, str], ...] = tuple( - product(PROMPT_CACHE_SCENARIOS, ("stream-00.yaml", "stream-01.yaml")) -) def _protocol_name(protocol: Protocol) -> str: @@ -79,43 +83,78 @@ def _protocol_name(protocol: Protocol) -> str: def _provider_from_cassette_path(path: Path) -> Provider: - provider, separator, _ = path.name.partition("-") - if not separator or provider not in PROVIDER_CAPABILITIES: - raise ValueError(f"Cannot determine provider from matched cassette: {path}") - return cast(Provider, provider) + return parse_cassette(path).provider -def _recorded_cassette_path(protocol: Protocol, cassette_name: str) -> Path: - return CASSETTE_DIR / "openai" / _protocol_name(protocol) / "test_interface" / cassette_name +def _matched_cassette_path( + scenario: str, protocol: Protocol, variant: str, *, provider: Provider | None = None +) -> Path: + mode, turn = variant.removesuffix(".yaml").rsplit("-", 1) + conversation = select_conversation( + MATCHED_CONVERSATIONS, scenario, protocol, cast(Mode, mode), provider=provider + ) + for cassette in conversation.cassettes: + if cassette.turn == int(turn): + return cassette.path + raise ValueError(f"Missing turn {turn} in {conversation.id}") + + +def _scenario_routes(scenario: str) -> tuple[tuple[Protocol, Protocol], ...]: + if scenario in ENCRYPTED_REASONING_SCENARIOS: + return RESPONSES_MESSAGES_ROUTES + if scenario == "tool_call_image_result_parallel": + return ( + *RESPONSES_MESSAGES_ROUTES, + ("responses", "chat/completions"), + ("messages", "chat/completions"), + ) + return ROUTES -def _matched_cassette_paths( - scenario: str, - protocol: Protocol, - mode: Literal["stream", "non_stream"] = "stream", -) -> dict[str, Path]: - protocol_name = _protocol_name(protocol) - filename_marker = f"-{protocol_name}-" - cassette_paths: dict[str, Path] = {} - for path in sorted((MATCHED_CASSETTE_DIR / scenario).glob(f"*{filename_marker}{mode}-*.yaml")): - variant = path.name.partition(filename_marker)[2] - if variant in cassette_paths: - raise ValueError( - f"Expected one matched {protocol!r} cassette for {scenario!r}/{variant!r}" - ) - cassette_paths[variant] = path - return cassette_paths +def _stream_cases(scenario: str) -> list[Any]: + return [ + pytest.param(case, id=case.id) + for case in route_cases( + MATCHED_CONVERSATIONS, scenario, "stream", _scenario_routes(scenario) + ) + ] -def _matched_cassette_path(scenario: str, protocol: Protocol, variant: str) -> Path: - protocol_name = _protocol_name(protocol) - paths = sorted((MATCHED_CASSETTE_DIR / scenario).glob(f"*-{protocol_name}-{variant}")) - if len(paths) != 1: - raise ValueError( - f"Expected one matched {protocol!r} cassette for {scenario!r}/{variant!r}, " - f"found {len(paths)}." +def _non_stream_cases(scenario: str) -> list[Any]: + return [ + pytest.param(case, id=case.id) + for downstream, upstream in _scenario_routes(scenario) + for case in route_cases( + MATCHED_CONVERSATIONS, + scenario, + "non_stream" if downstream == upstream else "stream", + [(downstream, upstream)], ) - return paths[0] + ] + + +def _default_case( + scenario: str, downstream: Protocol, upstream: Protocol, mode: Mode +) -> RouteCase: + return next( + case + for case in route_cases(MATCHED_CONVERSATIONS, scenario, mode, [(downstream, upstream)]) + if case.upstream == select_conversation(MATCHED_CONVERSATIONS, scenario, upstream, mode) + ) + + +# Retain the existing native SDK baselines. Other matched scenarios already +# exercise native routes; faithful provider-deviation recordings join separately. +NATIVE_SDK_CONVERSATIONS = ( + *( + conversation + for conversation in MATCHED_CONVERSATIONS + if conversation.scenario + in {"simple_text", "tool_call", "tool_call_image_result_parallel", *PROMPT_CACHE_SCENARIOS} + or conversation.mode == "non_stream" + ), + *NATIVE_CONVERSATIONS, +) @lru_cache(maxsize=5) @@ -133,14 +172,15 @@ def _get_http_client( expected_extra_body: dict[str, Any] | None = None, requests: list[Request] | None = None, response_headers: dict[str, str] | None = None, + continued: bool = False, ) -> AsyncClient: """Replay `cassette_paths`, optionally asserting one exact outgoing request body.""" - cassette_paths = cassette_paths.copy() + cassette_turns = iter(enumerate(cassette_paths)) def cassette_handler(request: Request) -> Response: if requests is not None: requests.append(request) - cassette_path = cassette_paths.pop(0) + turn, cassette_path = next(cassette_turns) cassette = _read_cassette(cassette_path) scenario = cassette_path.parent.name request_body = json_loads(request.content) @@ -157,6 +197,16 @@ def cassette_handler(request: Request) -> Response: expected = {**expected, **(expected_extra_body or {})} if translated and upstream == "responses": expected = _without_reasoning_item_status(expected) + if continued and turn > 0: + key = "input" if upstream == "responses" else "messages" + request_body[key] = _comparable_history( + request_body[key], upstream, translated=translated + ) + expected[key] = _comparable_history( + _without_reasoning_item_status(expected).get(key), + upstream, + translated=translated, + ) if ( translated and upstream == "responses" @@ -211,20 +261,108 @@ def _assert_reconstructable_encrypted_responses_request( actual_body: dict[str, Any], expected_body: dict[str, Any], ) -> None: - adapter = OpenAIResponsesAdapter(PROVIDER_CAPABILITIES["openai"]) - - def normalize(body: dict[str, Any]) -> dict[str, Any]: - request = OpenAIResponsesCreateRequest.model_validate(body) - normalized = adapter.normalize_request(request).model_dump( - exclude={"extra_fields", "stream_options"} - ) - for item in normalized.get("input") or []: - if isinstance(item, dict): + actual = deepcopy(actual_body) + expected = _without_reasoning_item_status(expected_body) + for body in (actual, expected): + # These exact options have no Messages equivalent. Inclusion already + # preserves opaque state, store=false requests no state, and disabling + # obfuscation affects only SSE padding. Other values must still match. + for key, value in ( + ("include", ["reasoning.encrypted_content"]), + ("store", False), + ("stream_options", {"include_obfuscation": False}), + ): + if body.get(key) == value: + body.pop(key) + for item in body["input"]: + item_type = item.get("type", "message") + if item_type in {"message", "reasoning", "function_call"}: + # Messages cannot carry Responses output-item IDs or phase. + # Portable function call_id values remain part of the comparison. item.pop("id", None) - return normalized + if item_type == "message": + item.pop("phase", None) + if item_type == "reasoning": + assert "status" not in item, "Reconstructed reasoning input has output-only status" + # Omitted and empty raw content both mean no raw reasoning. + item.setdefault("content", []) + elif item_type == "message": + item.setdefault("type", "message") + if item["role"] == "assistant": + # Easy assistant text is one completed output_text part, not + # a license to join multiple parts or separate messages. + item.setdefault("status", "completed") + if isinstance(item["content"], str): + item["content"] = [ + { + "type": "output_text", + "text": item["content"], + "annotations": [], + "logprobs": [], + } + ] + assert actual == expected - # Messages has no equivalents for Responses include/stream options or item IDs. - assert normalize(actual_body) == normalize(expected_body) + +@pytest.mark.parametrize( + "defect", + [ + "token-limit", + "call-id", + "encrypted-content", + "input-order", + "cache-key", + "cache-lifetime", + "reasoning-status", + "part-order", + "part-boundaries", + ], +) +def test_encrypted_request_comparison_rejects_semantic_changes(defect: str) -> None: + """Ensures narrow wire equivalences cannot hide changed history or request settings.""" + path = _matched_cassette_path( + "tool_call_with_reasoning_encrypted", "responses", "stream-01.yaml" + ) + expected = deepcopy(_read_cassette(path)["request"]["body"]) + expected.update(prompt_cache_key="conversation", prompt_cache_options={"ttl": "30m"}) + expected["input"][1]["status"] = "completed" + # Two parts with the same joined text must still retain their boundaries. + expected["input"][2]["content"] = [ + {"type": "output_text", "text": "First", "annotations": [], "logprobs": []}, + {"type": "output_text", "text": "Second", "annotations": [], "logprobs": []}, + ] + actual = deepcopy(expected) + for item in actual["input"]: + item.pop("id", None) + item.pop("phase", None) + actual["input"][1].pop("status") + original_expected = deepcopy(expected) + original_actual = deepcopy(actual) + _assert_reconstructable_encrypted_responses_request(actual, expected) + assert actual == original_actual and expected == original_expected + + if defect == "token-limit": + actual.pop("max_output_tokens") + elif defect == "call-id": + actual["input"][3]["call_id"] = "wrong-call" + elif defect == "encrypted-content": + actual["input"][1]["encrypted_content"] = "wrong-opaque-state" + elif defect == "input-order": + actual["input"][1:3] = reversed(actual["input"][1:3]) + elif defect == "cache-key": + actual.pop("prompt_cache_key") + elif defect == "cache-lifetime": + actual["prompt_cache_options"]["ttl"] = "5m" + elif defect == "reasoning-status": + actual["input"][1]["status"] = "completed" + elif defect == "part-order": + actual["input"][2]["content"].reverse() + elif defect == "part-boundaries": + actual["input"][2]["content"] = [ + {"type": "output_text", "text": "FirstSecond", "annotations": [], "logprobs": []} + ] + with pytest.raises(AssertionError): + _assert_reconstructable_encrypted_responses_request(actual, expected) def _assert_reconstructable_tool_responses_request( @@ -334,31 +472,161 @@ def _completed_responses_body(cassette_path: Path) -> dict[str, Any]: raise AssertionError("Responses cassette has no terminal response event.") -def _responses_output_text(response: dict[str, Any]) -> str: - return "".join( - part["text"] - for item in response["output"] - if item["type"] == "message" - for part in item["content"] - if part["type"] == "output_text" - ) - - -def _assert_responses_stream_invariants(sse_events: list[str]) -> None: +def _assert_responses_stream_invariants(sse_events: list[str], *, native: bool = False) -> None: events = [load_sse(sse) for sse in sse_events] sequence_numbers = [event["sequence_number"] for event in events] assert all(current == previous + 1 for previous, current in pairwise(sequence_numbers)), ( f"Non-contiguous sequence numbers: {sequence_numbers}" ) - output_item_ids = [ - event["item"]["id"] - for event in events - if event.get("type") == "response.output_item.added" + started: dict[int, dict[str, Any]] = {} + completed: dict[int, dict[str, Any]] = {} + item_ids: set[str] = set() + for event in events: + event_type = event["type"] + if "output_index" in event or "item_id" in event: + index = event["output_index"] + if event_type == "response.output_item.added": + assert index not in started, f"Output item {index} started twice" + item = event["item"] + assert item["id"] and item["id"] not in item_ids, "Duplicate or empty item ID" + item_ids.add(item["id"]) + started[index] = item + else: + assert index in started, f"Update before output item {index} started" + assert index not in completed, f"Update after output item {index} completed" + if event_type == "response.output_item.done": + item = event["item"] + assert item["id"] == started[index]["id"], "Completed item ID changed" + assert item["type"] == started[index]["type"], "Completed item type changed" + if item["type"] == "function_call": + assert item["call_id"] == started[index]["call_id"] + completed[index] = item + else: + assert event["item_id"] == started[index]["id"], "Update targets another item" + elif event_type in {"response.completed", "response.incomplete"}: + assert event is events[-1], "Events after terminal response" + output = event["response"]["output"] + assert started.keys() == completed.keys() == set(range(len(output))), ( + "Unbalanced output item starts, completions, or terminal output" + ) + for index, item in enumerate(output): + done = completed[index] + if ( + native + and item["type"] == "reasoning" + and done.get("encrypted_content") + and item.get("encrypted_content") + ): + # Native Responses may expose a third opaque snapshot. A + # translated terminal item must reuse its done snapshot. + done = {**done, "encrypted_content": item["encrypted_content"]} + assert item == done, f"Terminal output differs from completed item {index}" + assert events[-1]["type"] in {"response.completed", "response.incomplete"}, ( + "Missing terminal response" + ) + + +@pytest.mark.parametrize( + "scenario", ["reasoning_raw", "reasoning_encrypted", "tool_call_with_reasoning_encrypted"] +) +def test_responses_stream_updates_require_the_started_item_id(scenario: str) -> None: + """Ensures every text, reasoning, summary, and argument update retains its item's identity.""" + path = _matched_cassette_path(scenario, "responses", "stream-00.yaml") + records = _sse_records(_read_cassette(path), "responses") + _assert_responses_stream_invariants(records) + events = [load_sse(record) for record in records] + item_ids = [ + event["item"]["id"] for event in events if event["type"] == "response.output_item.added" ] - assert len(output_item_ids) == len(set(output_item_ids)), ( - f"Duplicate output item IDs: {output_item_ids}" + # One representative of every update type covers each wire shape without + # repeating the same assertion for every text token in the recording. + for event_type in {event["type"] for event in events if "item_id" in event}: + changed = deepcopy(events) + update = next(event for event in changed if event["type"] == event_type) + update["item_id"] = next(item_id for item_id in item_ids if item_id != update["item_id"]) + with pytest.raises(AssertionError, match="Update targets another item"): + _assert_responses_stream_invariants([dumps_sse(event) for event in changed]) + + +@pytest.mark.parametrize( + "defect", + [ + "before-start", + "after-completion", + "wrong-index", + "done-id", + "duplicate-start", + "missing-completion", + "terminal-order", + "terminal-content", + ], +) +def test_responses_stream_invariants_reject_invalid_item_lifecycles(defect: str) -> None: + """Ensures balanced item lifecycles and ordered terminal output are checked before ID removal.""" + path = _matched_cassette_path( + "tool_call_with_reasoning_encrypted", "responses", "stream-00.yaml" + ) + records = _sse_records(_read_cassette(path), "responses") + _assert_responses_stream_invariants(records) + events = [load_sse(record) for record in records] + update_index = next(i for i, event in enumerate(events) if "item_id" in event) + output_index = events[update_index]["output_index"] + start_index = next( + i + for i, event in enumerate(events) + if event["type"] == "response.output_item.added" and event["output_index"] == output_index + ) + done_index = next( + i + for i, event in enumerate(events) + if event["type"] == "response.output_item.done" and event["output_index"] == output_index ) + if defect == "before-start": + events.insert(start_index, events.pop(update_index)) + elif defect == "after-completion": + events.insert(done_index, events.pop(update_index)) + elif defect == "wrong-index": + events[update_index]["output_index"] = 0 + elif defect == "done-id": + events[done_index]["item"]["id"] = "wrong-id" + elif defect == "duplicate-start": + events.insert(start_index, deepcopy(events[start_index])) + elif defect == "missing-completion": + events.pop(done_index) + elif defect == "terminal-order": + events[-1]["response"]["output"].reverse() + elif defect == "terminal-content": + events[-1]["response"]["output"][1]["content"][0]["text"] = "wrong-text" + # Keep sequence numbers valid so a failure demonstrates the item check. + for index, event in enumerate(events): + event["sequence_number"] = index + with pytest.raises(AssertionError): + _assert_responses_stream_invariants([dumps_sse(event) for event in events]) + + +def test_incomplete_responses_stream_requires_completed_items() -> None: + """Ensures incomplete terminal responses also require a done event for each partial item.""" + path = CASSETTE_DIR / "errors/incomplete_response/openai-responses-stream-00.yaml" + records = _sse_records(_read_cassette(path), "responses") + _assert_responses_stream_invariants(records) + events = [load_sse(record) for record in records] + events = [event for event in events if event["type"] != "response.output_item.done"] + for index, event in enumerate(events): + event["sequence_number"] = index + with pytest.raises(AssertionError, match="Unbalanced output item"): + _assert_responses_stream_invariants([dumps_sse(event) for event in events]) + + +def test_responses_terminal_encrypted_snapshot_policy() -> None: + """Ensures only native streams may expose a separate terminal encrypted snapshot.""" + path = _matched_cassette_path("reasoning_encrypted", "responses", "stream-00.yaml") + events = [load_sse(record) for record in _sse_records(_read_cassette(path), "responses")] + events[-1]["response"]["output"][0]["encrypted_content"] = "separate-terminal-snapshot" + records = [dumps_sse(event) for event in events] + _assert_responses_stream_invariants(records, native=True) + with pytest.raises(AssertionError, match="Terminal output differs"): + _assert_responses_stream_invariants(records) async def test_extra_inputs(): @@ -487,23 +755,18 @@ async def test_responses_translation_ignores_disabled_store(upstream: Protocol): assert [event async for event in stream] -@pytest.mark.parametrize("protocol", PROTOCOLS) @pytest.mark.parametrize( - ("scenario", "variant"), - [ - ("simple_text", "stream-00.yaml"), - ("tool_call", "stream-00.yaml"), - ("tool_call", "stream-01.yaml"), - ("tool_call", "stream-02.yaml"), - *PROMPT_CACHE_CASES, - ], + "conversation", + [c for c in NATIVE_SDK_CONVERSATIONS if c.mode == "stream"], + ids=lambda c: f"{c.paths[0].parent.parent.name}-{c.id}", ) -async def test_native_stream_matches_provider_sdk( - protocol: Protocol, - scenario: str, - variant: str, -): - cassette_path = _matched_cassette_path(scenario, protocol, variant) +async def test_native_stream_matches_provider_sdk(conversation: Conversation): + """Ensures every discovered native turn preserves parsed SDK events and provider selection.""" + for cassette_path in conversation.paths: + await _assert_native_stream_matches_provider_sdk(cassette_path, conversation.endpoint) + + +async def _assert_native_stream_matches_provider_sdk(cassette_path: Path, protocol: Protocol): cassette = _read_cassette(cassette_path) request_body = deepcopy(cassette["request"]["body"]) @@ -538,7 +801,10 @@ async def test_native_stream_matches_provider_sdk( "messages": client.messages, }[protocol] molto_stream = await coordinator( - body=request_body, endpoint=protocol, api_key="test-api-key" + body=request_body, + endpoint=protocol, + provider=_provider_from_cassette_path(cassette_path), + api_key="test-api-key", ) molto_events = [event async for event in molto_stream] @@ -549,23 +815,14 @@ async def test_native_stream_matches_provider_sdk( @pytest.mark.parametrize( - ("scenario", "protocol"), - [ - ("simple_text", "responses"), - ("simple_text", "chat/completions"), - ("simple_text", "messages"), - ("reasoning_encrypted", "responses"), - ("reasoning_encrypted", "messages"), - ], + "conversation", + [c for c in NATIVE_SDK_CONVERSATIONS if c.mode == "non_stream"], + ids=lambda c: f"{c.paths[0].parent.parent.name}-{c.id}", ) -async def test_native_non_streaming_responses_match_provider_sdk( - scenario: str, - protocol: Protocol, -): - cassette_paths = [ - _matched_cassette_path(scenario, protocol, variant) - for variant in ("non_stream-00.yaml", "non_stream-01.yaml") - ] +async def test_native_non_streaming_responses_match_provider_sdk(conversation: Conversation): + """Ensures discovered complete native responses retain SDK parity and provider selection.""" + protocol = conversation.endpoint + cassette_paths = conversation.paths request_bodies = [ deepcopy(_read_cassette(cassette_path)["request"]["body"]) for cassette_path in cassette_paths @@ -608,6 +865,7 @@ async def test_native_non_streaming_responses_match_provider_sdk( await coordinator( body=request_body, endpoint=protocol, + provider=conversation.provider, api_key="test-api-key", ) for request_body in request_bodies @@ -626,76 +884,244 @@ async def test_native_non_streaming_responses_match_provider_sdk( ) == sdk_response.model_dump(mode="json", exclude_unset=True) +@pytest.mark.parametrize("mode", ["stream", "non_stream"]) +async def test_discovered_native_runners_forward_provider( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, mode: Mode +) -> None: + """Ensures both native runners pass a discovered non-default provider to the coordinator.""" + path = tmp_path / "native" / "simple_text" / f"vllm-chat_completions-{mode}-00.yaml" + path.parent.mkdir(parents=True) + path.write_bytes( + _matched_cassette_path("simple_text", "chat/completions", f"{mode}-00.yaml").read_bytes() + ) + (conversation,) = public_conversations(tmp_path / "native") + providers = [] + original = Molto.chat_completions + + async def capture_provider(self, **kwargs): + providers.append(kwargs.get("provider")) + return await original(self, **kwargs) + + monkeypatch.setattr(Molto, "chat_completions", capture_provider) + if mode == "stream": + await test_native_stream_matches_provider_sdk(conversation) + else: + await test_native_non_streaming_responses_match_provider_sdk(conversation) + assert providers == ["vllm"] + + def _assert_matched_response( response: BaseModel, downstream: Protocol, - expected: dict[str, Any], + expected: dict[str, Any] | OpenAIResponsesResponse, ) -> None: - expected_text = _responses_output_text(expected) - expected_usage = expected["usage"] + # Parse the reference with the SDK, independently of Molto's translators and + # collectors. These scenarios contain ordered text and encrypted reasoning. + expected_response = ( + expected + if isinstance(expected, OpenAIResponsesResponse) + else OpenAIResponsesResponse.model_validate(expected) + ) + expected_usage = expected_response.usage + assert expected_usage is not None + expected_input_details = expected_usage.input_tokens_details + expected_output_details = expected_usage.output_tokens_details + cache_write_tokens = expected_input_details.cache_write_tokens or 0 + cached_tokens = expected_input_details.cached_tokens + reasoning_tokens = expected_output_details.reasoning_tokens response_type = { "responses": OpenAIResponsesResponse, "chat/completions": OpenAIChatCompletionsResponse, "messages": AnthropicMessagesResponse, }[downstream] assert type(response) is response_type - assert response.id == expected["id"] - assert response.model == expected["model"] + assert response.id == expected_response.id + assert response.model == expected_response.model if downstream == "responses": assert isinstance(response, OpenAIResponsesResponse) - assert response.output_text == expected_text - assert response.status == expected["status"] + assert [item.type for item in response.output] == [ + item.type for item in expected_response.output + ] + for item, reference in zip(response.output, expected_response.output, strict=True): + if item.type == "message": + assert item.role == reference.role == "assistant" + assert item.status == reference.status + assert all(part.type == "output_text" for part in item.content) + assert all(part.type == "output_text" for part in reference.content) + assert [part.text for part in item.content] == [ + part.text for part in reference.content + ] + elif item.type == "reasoning": + assert (item.content or []) == (reference.content or []) + assert item.summary == reference.summary + assert item.encrypted_content == reference.encrypted_content + else: + raise AssertionError(f"Unsupported matched response item: {item.type}") + assert response.status == expected_response.status + assert response.incomplete_details == expected_response.incomplete_details assert response.usage is not None - assert response.usage.input_tokens == expected_usage["input_tokens"] - assert response.usage.output_tokens == expected_usage["output_tokens"] - assert response.usage.total_tokens == expected_usage["total_tokens"] + assert response.usage.input_tokens == expected_usage.input_tokens + assert response.usage.output_tokens == expected_usage.output_tokens + assert response.usage.total_tokens == expected_usage.total_tokens + assert response.usage.input_tokens_details.cached_tokens == cached_tokens + assert (response.usage.input_tokens_details.cache_write_tokens or 0) == cache_write_tokens + assert response.usage.output_tokens_details.reasoning_tokens == reasoning_tokens elif downstream == "chat/completions": assert isinstance(response, OpenAIChatCompletionsResponse) + # Chat has only one scalar text field. Require the fixture's single text + # item/part instead of silently flattening unsupported output boundaries. + assert len(expected_response.output) == 1 + reference = expected_response.output[0] + assert reference.type == "message" + assert len(reference.content) == 1 + assert reference.content[0].type == "output_text" assert len(response.choices) == 1 - assert response.choices[0].message.content == expected_text - assert response.choices[0].finish_reason == "stop" + choice = response.choices[0] + assert choice.index == 0 + assert choice.message.role == reference.role == "assistant" + assert choice.message.content == reference.content[0].text + assert not choice.message.tool_calls + assert choice.message.refusal is None + assert not getattr(choice.message, "reasoning_content", None) + if expected_response.status == "incomplete": + assert expected_response.incomplete_details.reason == "max_output_tokens" + assert choice.finish_reason == "length" + else: + assert expected_response.status == "completed" + assert choice.finish_reason == "stop" assert response.usage is not None - assert response.usage.prompt_tokens == expected_usage["input_tokens"] - assert response.usage.completion_tokens == expected_usage["output_tokens"] - assert response.usage.total_tokens == expected_usage["total_tokens"] + assert response.usage.prompt_tokens == expected_usage.input_tokens + assert response.usage.completion_tokens == expected_usage.output_tokens + assert response.usage.total_tokens == expected_usage.total_tokens + assert response.usage.prompt_tokens_details.cached_tokens == cached_tokens + assert (response.usage.prompt_tokens_details.cache_write_tokens or 0) == cache_write_tokens + assert response.usage.completion_tokens_details.reasoning_tokens == reasoning_tokens else: assert isinstance(response, AnthropicMessagesResponse) - assert "".join(block.text for block in response.content if block.type == "text") == ( - expected_text + expected_content = [] + for item in expected_response.output: + if item.type == "message": + assert item.role == "assistant" + for part in item.content: + assert part.type == "output_text" + expected_content.append({"type": "text", "text": part.text}) + elif item.type == "reasoning": + assert not item.content + # The retained encrypted fixtures have at most one summary part; + # Messages cannot expose separate summary-part boundaries. + assert len(item.summary) <= 1 + expected_content.append( + { + "type": "thinking", + "thinking": item.summary[0].text if item.summary else "", + "signature": item.encrypted_content, + } + ) + else: + raise AssertionError(f"Unsupported matched response item: {item.type}") + assert [block.model_dump(exclude_none=True) for block in response.content] == ( + expected_content ) + assert response.role == "assistant" + assert expected_response.status == "completed" assert response.stop_reason == "end_turn" - input_details = expected_usage["input_tokens_details"] - cache_write_tokens = input_details.get("cache_write_tokens", 0) - cached_tokens = input_details.get("cached_tokens", 0) + assert response.stop_sequence is None assert response.usage.input_tokens == ( - expected_usage["input_tokens"] - cache_write_tokens - cached_tokens + expected_usage.input_tokens - cache_write_tokens - cached_tokens ) assert response.usage.cache_creation_input_tokens == cache_write_tokens assert response.usage.cache_read_input_tokens == cached_tokens - assert response.usage.output_tokens == expected_usage["output_tokens"] + assert response.usage.output_tokens == expected_usage.output_tokens + assert response.usage.output_tokens_details.thinking_tokens == reasoning_tokens + - expected_reasoning = next( - (item for item in expected["output"] if item["type"] == "reasoning"), - None, +@pytest.mark.parametrize("downstream", RESPONSES_MESSAGES_PROTOCOLS) +@pytest.mark.parametrize( + "defect", ["order", "extra_reasoning", "missing_reasoning", "extra_text_part", "encrypted"] +) +def test_matched_response_rejects_changed_output(downstream: Protocol, defect: str) -> None: + """Ensure output comparisons preserve every reasoning item and text-part boundary.""" + expected = _completed_responses_body( + _matched_cassette_path("reasoning_encrypted", "responses", "non_stream-00.yaml") ) - if expected_reasoning is None: - return + response_type = { + "responses": OpenAIResponsesResponse, + "messages": AnthropicMessagesResponse, + }[downstream] + response = response_type.model_validate( + _read_cassette( + _matched_cassette_path("reasoning_encrypted", downstream, "non_stream-00.yaml") + )["response"]["body"] + ) + _assert_matched_response(response, downstream, expected) + response = response.model_copy(deep=True) + items = response.output if downstream == "responses" else response.content + if defect == "order": + items.reverse() + elif defect == "extra_reasoning": + items.append(items[0].model_copy(deep=True)) + elif defect == "missing_reasoning": + items.pop(0) + elif defect == "extra_text_part": + parts = items[-1].content if downstream == "responses" else items + parts.append(parts[-1].model_copy(update={"text": ""})) + elif downstream == "responses": + items[0].encrypted_content = "changed-opaque-state" + else: + items[0].signature = "changed-opaque-state" - expected_summary = "".join(part["text"] for part in expected_reasoning["summary"]) - expected_signature = expected_reasoning["encrypted_content"] - if downstream == "responses": - assert isinstance(response, OpenAIResponsesResponse) - reasoning = next(item for item in response.output if item.type == "reasoning") - assert "".join(part.text for part in reasoning.summary) == expected_summary - assert reasoning.encrypted_content == expected_signature - elif downstream == "messages": - assert isinstance(response, AnthropicMessagesResponse) - thinking = next(block for block in response.content if block.type == "thinking") - assert thinking.thinking == expected_summary - assert thinking.signature == expected_signature + with pytest.raises(AssertionError): + _assert_matched_response(response, downstream, expected) + + +@pytest.mark.parametrize("downstream", PROTOCOLS) +@pytest.mark.parametrize("detail", ["cache_read", "cache_write", "reasoning"]) +def test_matched_response_rejects_changed_usage_details(downstream: Protocol, detail: str) -> None: + """Ensure non-streaming comparisons check semantic cache and reasoning usage.""" + expected = _completed_responses_body( + _matched_cassette_path("simple_text", "responses", "non_stream-00.yaml") + ) + response_type = { + "responses": OpenAIResponsesResponse, + "chat/completions": OpenAIChatCompletionsResponse, + "messages": AnthropicMessagesResponse, + }[downstream] + response = response_type.model_validate( + _read_cassette(_matched_cassette_path("simple_text", downstream, "non_stream-00.yaml"))[ + "response" + ]["body"] + ) + _assert_matched_response(response, downstream, expected) + response = response.model_copy(deep=True) + usage = response.usage + if downstream == "messages": + if detail == "reasoning": + usage.output_tokens_details.thinking_tokens += 1 + elif detail == "cache_read": + usage.cache_read_input_tokens += 1 + else: + usage.cache_creation_input_tokens += 1 else: - raise AssertionError("Chat Completions cannot preserve encrypted reasoning.") + input_details = ( + usage.input_tokens_details + if downstream == "responses" + else usage.prompt_tokens_details + ) + output_details = ( + usage.output_tokens_details + if downstream == "responses" + else usage.completion_tokens_details + ) + if detail == "reasoning": + output_details.reasoning_tokens += 1 + elif detail == "cache_read": + input_details.cached_tokens += 1 + else: + input_details.cache_write_tokens += 1 + + with pytest.raises(AssertionError): + _assert_matched_response(response, downstream, expected) @pytest.mark.parametrize("stream", [False, True], ids=["non_stream", "stream"]) @@ -722,6 +1148,7 @@ async def test_native_incomplete_responses_preserve_text_and_usage(stream: bool) assert [event.model_dump() for event in actual_events] == [ event.model_dump() for event in expected_events ] + _assert_responses_stream_invariants([dumps_sse(event) for event in actual_events]) actual = actual_events[-1].response assert ( "".join( @@ -733,6 +1160,7 @@ async def test_native_incomplete_responses_preserve_text_and_usage(stream: bool) ) assert actual.model_dump() == expected.model_dump() + _assert_matched_response(actual, "responses", expected) assert actual.output_text == expected.output_text != "" assert actual.status == "incomplete" assert actual.incomplete_details.reason == "max_output_tokens" @@ -800,6 +1228,7 @@ async def test_incomplete_responses_translate_to_chat_with_text_and_usage(stream assert len(usages) == 1 usage = usages[0] else: + _assert_matched_response(actual, "chat/completions", expected) assert len(actual.choices) == 1 text = actual.choices[0].message.content finish_reasons = [actual.choices[0].finish_reason] @@ -821,29 +1250,143 @@ async def test_incomplete_responses_translate_to_chat_with_text_and_usage(stream ) +def _response_history(response: BaseModel, protocol: Protocol) -> list[dict[str, Any]]: + """Convert SDK output to the explicit input shapes used by these conversations.""" + if protocol == "responses": + assert isinstance(response, OpenAIResponsesResponse) + history = [item.model_dump(mode="json", exclude_none=True) for item in response.output] + for item in history: + assert item["type"] in {"message", "reasoning", "function_call"} + if item["type"] == "reasoning": + # Reasoning status is output-only, unlike message/call status. + item.pop("status", None) + return history + if protocol == "chat/completions": + assert isinstance(response, OpenAIChatCompletionsResponse) + assert len(response.choices) == 1 and response.choices[0].index == 0 + message = response.choices[0].message.model_dump(mode="json", exclude_none=True) + # The SDK's streaming parser adds these local parsing properties. + message.pop("parsed", None) + if message.get("annotations") == []: + message.pop("annotations") + for call in message.get("tool_calls", []): + call.pop("index", None) + call["function"].pop("parsed_arguments", None) + if message.get("content") == "" and message.get("tool_calls"): + message.pop("content") + return [message] + assert isinstance(response, AnthropicMessagesResponse) + content = [] + for block in response.content: + item = block.model_dump(exclude_none=True) + assert item["type"] in {"text", "thinking", "tool_use"} + if item["type"] == "tool_use": + item.pop("__json_buf", None) + # The SDK supplies the default direct caller even when absent on + # the wire; omitting that default preserves the same tool use. + if item.get("caller") == {"type": "direct"}: + item.pop("caller") + elif item["type"] == "thinking" and item.get("signature") == "": + # Unsigned raw reasoning has no opaque state to send back. + item.pop("signature") + content.append(item) + return [{"role": response.role, "content": content}] + + +def _stream_history(events: list[BaseModel], protocol: Protocol) -> list[dict[str, Any]]: + """Collect returned SDK events independently of Molto's adapters and collectors.""" + if protocol == "responses": + assert events[-1].type in {"response.completed", "response.incomplete"} + return _response_history(events[-1].response, protocol) + if protocol == "chat/completions": + state = ChatCompletionStreamState() + for event in events: + state.handle_chunk(event.model_copy(deep=True)) + return _response_history(state.get_final_completion(), protocol) + snapshot = None + for event in events: + snapshot = accumulate_event(event=event.model_copy(deep=True), current_snapshot=snapshot) + assert events[-1].type == "message_stop" and snapshot is not None + return _response_history(snapshot, protocol) + + +def _comparable_history( + history: list[dict[str, Any]], protocol: Protocol, *, translated: bool +) -> list[dict[str, Any]]: + """Allow only named native input equivalences; keep parts, calls and state ordered.""" + history = deepcopy(history) + if protocol != "responses": + return history + for item in history: + item_type = item.get("type", "message") + if item_type not in {"message", "reasoning", "function_call"}: + continue + # Responses output-item IDs are optional history metadata. The other + # protocols cannot reproduce IDs or phase; portable call_id stays exact. + item.pop("id", None) + if item_type == "reasoning": + assert "status" not in item, "Reasoning history must omit output-only status" + item.setdefault("content", []) + elif item_type == "message": + item.setdefault("type", "message") + # Native fixtures also omit the optional final-answer phase. + # Keep commentary exact on native routes, where it is recorded. + if translated or item.get("phase") == "final_answer": + item.pop("phase", None) + if item["role"] == "assistant": + item.setdefault("status", "completed") + if isinstance(item["content"], str): + item["content"] = [{"type": "output_text", "text": item["content"]}] + for part in item["content"]: + if part["type"] == "output_text": + part.setdefault("annotations", []) + part.setdefault("logprobs", []) + return history + + +def _continued_request( + saved_body: dict[str, Any], + protocol: Protocol, + history: list[dict[str, Any]] | None, + *, + translated: bool, +) -> dict[str, Any]: + """Append only saved new inputs to the cumulative history returned by Molto.""" + body = _without_reasoning_item_status(saved_body) + if history is None: + return body + key = "input" if protocol == "responses" else "messages" + expected_history = body[key][: len(history)] + assert _comparable_history(history, protocol, translated=translated) == _comparable_history( + expected_history, protocol, translated=translated + ), "Returned history differs from the next saved request" + new_inputs = body[key][len(history) :] + assert new_inputs + # Never restore an earlier assistant turn from a fixture, even when it has + # the same length as the actual history. + assert all( + item.get("role") != "assistant" and item.get("type") not in {"reasoning", "function_call"} + for item in new_inputs + ) + body[key] = deepcopy(history) + new_inputs + return body + + async def _assert_matched_non_stream( scenario: str, downstream: Protocol, upstream: Protocol, + *, + case: RouteCase | None = None, ) -> None: translated = downstream != upstream mode: Literal["stream", "non_stream"] = "stream" if translated else "non_stream" - downstream_paths = _matched_cassette_paths(scenario, downstream, mode) - upstream_paths = _matched_cassette_paths(scenario, upstream, mode) - responses_paths = _matched_cassette_paths(scenario, "responses", mode) - assert downstream_paths, f"No matched {downstream!r} {mode} cassettes in {scenario!r}" - assert downstream_paths.keys() == upstream_paths.keys() == responses_paths.keys(), ( - f"Mismatched cassette variants for {scenario!r}: " - f"{downstream!r} has {sorted(downstream_paths)}, " - f"{upstream!r} has {sorted(upstream_paths)}, " - f"'responses' has {sorted(responses_paths)}" - ) - variants = sorted(downstream_paths) - + case = case or _default_case(scenario, downstream, upstream, mode) async with _get_http_client( - [upstream_paths[variant] for variant in variants], + case.upstream.paths, upstream, translated=translated, + continued=True, ) as http_client: client = Molto(http_client=http_client) coordinator = { @@ -851,83 +1394,50 @@ async def _assert_matched_non_stream( "chat/completions": client.chat_completions, "messages": client.messages, }[downstream] - for variant in variants: - request_body = deepcopy(_read_cassette(downstream_paths[variant])["request"]["body"]) + history = None + for downstream_path, reference_path in zip( + case.downstream.paths, case.reference.paths, strict=True + ): + request_body = _continued_request( + _read_cassette(downstream_path)["request"]["body"], + downstream, + history, + translated=translated, + ) if translated: request_body["stream"] = False response = await coordinator( body=request_body, endpoint=upstream, - provider=_provider_from_cassette_path(upstream_paths[variant]), + provider=case.upstream.provider, api_key="test-api-key", ) _assert_matched_response( response, downstream, - _completed_responses_body(responses_paths[variant]), + _completed_responses_body(reference_path), ) - - -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -@pytest.mark.parametrize( - ("scenario", "variant"), - [ - ("simple_text", "stream-00.yaml"), - ("reasoning_raw", "stream-00.yaml"), - ("reasoning_raw", "stream-01.yaml"), - ("tool_call", "stream-00.yaml"), - ("tool_call", "stream-01.yaml"), - ("tool_call", "stream-02.yaml"), - *PROMPT_CACHE_CASES, - ], -) -def test_matched_request_body_matches_across_protocols( - downstream: Protocol, - upstream: Protocol, - scenario: str, - variant: str, -): - downstream_path = _matched_cassette_path(scenario, downstream, variant) - upstream_path = _matched_cassette_path(scenario, upstream, variant) - downstream_body = deepcopy(_read_cassette(downstream_path)["request"]["body"]) - request_type = { - "responses": OpenAIResponsesCreateRequest, - "chat/completions": OpenAIChatCompletionsCreateRequest, - "messages": AnthropicMessagesCreateRequest, - }[downstream] - request = request_type.model_validate(downstream_body) - - if downstream == upstream: - actual_body = request.model_dump() - else: - capabilities = PROVIDER_CAPABILITIES[_provider_from_cassette_path(upstream_path)] - adapter = { - "responses": OpenAIResponsesAdapter(capabilities), - "chat/completions": OpenAIChatCompletionsAdapter(capabilities), - "messages": AnthropicMessagesAdapter(capabilities), - }[downstream] - normalized_request = adapter.normalize_request(request) - project_request = { - "responses": OpenAIResponsesClient._request_body, - "chat/completions": OpenAIChatCompletionsClient._request_body, - "messages": AnthropicMessagesClient._request_body, - }[upstream] - actual_body = project_request(normalized_request) - - expected_body = _read_cassette(upstream_path)["request"]["body"] - if upstream == "responses" and downstream != upstream: - expected_body = _without_reasoning_item_status(expected_body) - if scenario == "tool_call" and upstream == "responses" and downstream != upstream: - _assert_reconstructable_tool_responses_request(actual_body, expected_body) - else: - assert actual_body == expected_body + key = "input" if downstream == "responses" else "messages" + history = request_body[key] + _response_history(response, downstream) async def test_responses_native_stream_normalizes_omitted_cache_write_tokens(): + """Ensures the matched omission parses in the SDK and receives only the documented adjustment.""" cassette_path = _matched_cassette_path("reasoning_raw", "responses", "stream-00.yaml") cassette = _read_cassette(cassette_path) request_body = deepcopy(cassette["request"]["body"]) + # This matched fixture exercises compatibility, but has no faithful provider + # original establishing the omission's provenance. + async with _get_http_client([cassette_path], "responses") as http_client: + sdk = AsyncOpenAI(api_key="test-api-key", http_client=http_client) + async with await sdk.responses.create(**request_body) as sdk_stream: + sdk_events = [event async for event in sdk_stream] + sdk_completed = next(event for event in sdk_events if event.type == "response.completed") + assert sdk_completed.response.usage.input_tokens_details.cache_write_tokens is None + expected = [event.model_dump(mode="json", exclude_unset=True) for event in sdk_events] + expected[-1]["response"]["usage"]["input_tokens_details"]["cache_write_tokens"] = 0 + async with _get_http_client([cassette_path], "responses") as http_client: client = Molto(http_client=http_client) stream = await client.responses( @@ -938,6 +1448,7 @@ async def test_responses_native_stream_normalizes_omitted_cache_write_tokens(): ) events = [event async for event in stream] + assert [event.model_dump(mode="json", exclude_unset=True) for event in events] == expected completed = next(event for event in events if event.type == "response.completed") assert completed.response.usage is not None assert completed.response.usage.input_tokens_details.cache_write_tokens == 0 @@ -947,9 +1458,15 @@ async def _assert_stream_events( cassette_path_pairs: list[tuple[Path, Path]], downstream: Protocol, upstream: Protocol, + *, + requests: list[Request] | None = None, ) -> None: first_downstream_path, first_upstream_path = cassette_path_pairs[0] scenario = first_downstream_path.parent.name + continued = ( + first_downstream_path.is_relative_to(MATCHED_CASSETTE_DIR) + and scenario not in PROMPT_CACHE_SCENARIOS + ) provider = ( _provider_from_cassette_path(first_upstream_path) if first_upstream_path.is_relative_to(MATCHED_CASSETTE_DIR) @@ -959,17 +1476,30 @@ async def _assert_stream_events( [upstream_path for _, upstream_path in cassette_path_pairs], upstream, translated=downstream != upstream, + continued=continued, + requests=requests, ) as http_client: client = Molto(http_client=http_client) + history = None for downstream_path, _ in cassette_path_pairs: cassette = _read_cassette(downstream_path) + request_body = ( + _continued_request( + cassette["request"]["body"], + downstream, + history, + translated=downstream != upstream, + ) + if continued + else deepcopy(cassette["request"]["body"]) + ) coordinator = { "responses": client.responses, "chat/completions": client.chat_completions, "messages": client.messages, }[downstream] response = await coordinator( - body=deepcopy(cassette["request"]["body"]), + body=request_body, endpoint=upstream, provider=provider, api_key="test-api-key", @@ -982,7 +1512,9 @@ async def _assert_stream_events( actual_sse_events.append(dumps_sse(event)) if downstream == "responses": assert len(events) == len(expected_sse_events) - _assert_responses_stream_invariants(actual_sse_events) + _assert_responses_stream_invariants( + actual_sse_events, native=upstream == "responses" + ) if scenario in PROMPT_CACHE_SCENARIOS: usage = events[-1].response.usage assert usage.input_tokens_details.cached_tokens > 0 @@ -1067,60 +1599,123 @@ async def _assert_stream_events( assert actual_events == expected_events else: raise ValueError(f"Unsupported downstream protocol: {downstream}") - - -async def _assert_responses_events( - cassette_names: list[str], - upstream: Protocol = "responses", -) -> None: - cassette_path_pairs = [ - ( - _recorded_cassette_path("responses", cassette_name), - _recorded_cassette_path(upstream, cassette_name), - ) - for cassette_name in cassette_names - ] - await _assert_stream_events( - cassette_path_pairs, - downstream="responses", - upstream=upstream, - ) + if continued: + key = "input" if downstream == "responses" else "messages" + history = request_body[key] + _stream_history(events, downstream) async def _assert_matched_stream_events( scenario: str, downstream: Protocol, upstream: Protocol, + *, + requests: list[Request] | None = None, + case: RouteCase | None = None, ) -> None: - downstream_paths = _matched_cassette_paths(scenario, downstream) - upstream_paths = _matched_cassette_paths(scenario, upstream) - assert downstream_paths, f"No matched {downstream!r} cassettes found in {scenario!r}" - assert downstream_paths.keys() == upstream_paths.keys(), ( - f"Mismatched cassette variants for {scenario!r}: " - f"{downstream!r} has {sorted(downstream_paths)}, " - f"{upstream!r} has {sorted(upstream_paths)}" - ) - cassette_path_pairs = [ - (downstream_paths[variant], upstream_paths[variant]) - for variant in sorted(downstream_paths) - ] - await _assert_stream_events(cassette_path_pairs, downstream, upstream) + case = case or _default_case(scenario, downstream, upstream, "stream") + cassette_path_pairs = list(zip(case.downstream.paths, case.upstream.paths, strict=True)) + await _assert_stream_events(cassette_path_pairs, downstream, upstream, requests=requests) -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_simple_text_non_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_non_stream("simple_text", downstream, upstream) +@pytest.mark.parametrize( + ("downstream", "defect", "stream"), + [(protocol, "call-id", True) for protocol in PROTOCOLS] + + [ + (protocol, "opaque-snapshot", stream) + for protocol in RESPONSES_MESSAGES_PROTOCOLS + for stream in (False, True) + ], +) +async def test_continuation_rejects_changed_returned_history( + monkeypatch: pytest.MonkeyPatch, downstream: Protocol, defect: str, stream: bool +) -> None: + """Ensure public replay continuation rejects corrupted returned calls and opaque state.""" + collect_history = _response_history + def changed_history(response: BaseModel, protocol: Protocol) -> list[dict[str, Any]]: + history = collect_history(response, protocol) + if defect == "call-id": + if protocol == "responses": + next(item for item in history if item["type"] == "function_call")["call_id"] = ( + "changed-call" + ) + elif protocol == "chat/completions": + history[0]["tool_calls"][0]["id"] = "changed-call" + else: + next(block for block in history[0]["content"] if block["type"] == "tool_use")[ + "id" + ] = "changed-call" + elif protocol == "responses": + next(item for item in history if item["type"] == "reasoning")["encrypted_content"] = ( + "changed-snapshot" + ) + else: + next(block for block in history[0]["content"] if block["type"] == "thinking")[ + "signature" + ] = "changed-snapshot" + return history + + monkeypatch.setattr(f"{__name__}._response_history", changed_history) + scenario = "tool_call" if defect == "call-id" else "reasoning_encrypted" + upstream = "messages" if downstream == "responses" else "responses" + runner = _assert_matched_stream_events if stream else _assert_matched_non_stream + with pytest.raises(AssertionError, match="Returned history differs"): + await runner(scenario, downstream, upstream) + + +async def test_continuation_keeps_actual_earlier_turns(monkeypatch: pytest.MonkeyPatch) -> None: + """Ensure the third public call retains the first returned output, including generated IDs.""" + collect_history = _response_history + continue_request = _continued_request + returned_history = [] + sent_bodies = [] + + def remember_history(response: BaseModel, protocol: Protocol) -> list[dict[str, Any]]: + history = collect_history(response, protocol) + returned_history.append(deepcopy(history)) + return history + + def remember_request(*args, **kwargs) -> dict[str, Any]: + body = continue_request(*args, **kwargs) + sent_bodies.append(deepcopy(body)) + return body -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_simple_text_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("simple_text", downstream, upstream) + monkeypatch.setattr(f"{__name__}._response_history", remember_history) + monkeypatch.setattr(f"{__name__}._continued_request", remember_request) + await _assert_matched_stream_events("tool_call", "responses", "chat/completions") + assert len(sent_bodies) == len(returned_history) == 3 + first_history = sent_bodies[0]["input"] + returned_history[0] + assert sent_bodies[1]["input"][: len(first_history)] == first_history + second_history = sent_bodies[1]["input"] + returned_history[1] + assert sent_bodies[2]["input"][: len(second_history)] == second_history + saved_body = _read_cassette( + _matched_cassette_path("tool_call", "responses", "stream-01.yaml") + )["request"]["body"] + assert returned_history[0][0]["id"] != saved_body["input"][1]["id"] -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -@pytest.mark.parametrize("scenario", PROMPT_CACHE_SCENARIOS) -async def test_prompt_cache_stream(scenario: str, downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events(scenario, downstream, upstream) +@pytest.mark.parametrize("case", _non_stream_cases("simple_text")) +async def test_simple_text_non_stream(case: RouteCase): + """Ensure complete text output becomes actual history for the next public request.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_non_stream("simple_text", downstream, upstream, case=case) + + +@pytest.mark.parametrize("case", _stream_cases("simple_text")) +async def test_simple_text_stream(case: RouteCase): + """Ensure streamed text output becomes actual history across every protocol pair.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("simple_text", downstream, upstream, case=case) + + +@pytest.mark.parametrize( + "case", [case for scenario in PROMPT_CACHE_SCENARIOS for case in _stream_cases(scenario)] +) +async def test_prompt_cache_stream(case: RouteCase): + """Ensures discovered cache conversations retain their scenario-specific request and usage assertions.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + scenario = case.upstream.scenario + await _assert_matched_stream_events(scenario, downstream, upstream, case=case) @pytest.mark.parametrize( @@ -1430,71 +2025,161 @@ async def test_interleaved_assistant_history(upstream: Protocol) -> None: await _assert_request_parity("messages", upstream, additions, expected, provider="vllm") -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_reasoning_raw_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("reasoning_raw", downstream, upstream) - +@pytest.mark.parametrize("case", _stream_cases("reasoning_raw")) +async def test_reasoning_raw_stream(case: RouteCase): + """Ensure returned raw reasoning and text survive actual conversation continuation.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("reasoning_raw", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_reasoning_encrypted_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("reasoning_encrypted", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("reasoning_encrypted")) +async def test_reasoning_encrypted_stream(case: RouteCase): + """Ensure streamed summaries and exact opaque snapshots survive the next request.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("reasoning_encrypted", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_reasoning_encrypted_non_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_non_stream("reasoning_encrypted", downstream, upstream) - -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_input_image_base64_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("input_image_base64", downstream, upstream) +@pytest.mark.parametrize("case", _non_stream_cases("reasoning_encrypted")) +async def test_reasoning_encrypted_non_stream(case: RouteCase): + """Ensure complete encrypted reasoning output supplies the next request's history.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_non_stream("reasoning_encrypted", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_input_image_remote_url_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("input_image_remote_url", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("input_image_base64")) +async def test_input_image_base64_stream(case: RouteCase): + """Ensure base64 image conversations retain actual assistant history and image input.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("input_image_base64", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_input_image_with_reasoning_encrypted_stream( - downstream: Protocol, upstream: Protocol -): +@pytest.mark.parametrize("case", _stream_cases("input_image_remote_url")) +async def test_input_image_remote_url_stream(case: RouteCase): + """Ensure every route retains the remote URL after text and in continued history.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + requests: list[Request] = [] + await _assert_matched_stream_events( + "input_image_remote_url", downstream, upstream, requests=requests, case=case + ) + url = "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" + expected_content = { + "responses": [ + {"type": "input_text", "text": "What logo is this?"}, + {"type": "input_image", "image_url": url}, + ], + "chat/completions": [ + {"type": "text", "text": "What logo is this?"}, + {"type": "image_url", "image_url": {"url": url}}, + ], + "messages": [ + {"type": "text", "text": "What logo is this?"}, + {"type": "image", "source": {"type": "url", "url": url}}, + ], + }[upstream] + assert len(requests) == 2 + for request in requests: + body = json_loads(request.content) + history = body["input" if upstream == "responses" else "messages"] + assert history[0] == {"role": "user", "content": expected_content} + + +@pytest.mark.parametrize("case", _stream_cases("input_image_with_reasoning_encrypted")) +async def test_input_image_with_reasoning_encrypted_stream(case: RouteCase): + """Ensure image input and actual encrypted reasoning history survive together.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint await _assert_matched_stream_events( - "input_image_with_reasoning_encrypted", downstream, upstream + "input_image_with_reasoning_encrypted", downstream, upstream, case=case ) -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_tool_call_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("tool_call", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("tool_call")) +async def test_tool_call_stream(case: RouteCase): + """Ensure three public turns reuse returned tool calls and cumulatively linked results.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("tool_call", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_tool_call_choice_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("tool_call_choice", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("tool_call_choice")) +async def test_tool_call_choice_stream(case: RouteCase): + """Ensure tool selection changes retain the actual preceding tool call in history.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("tool_call_choice", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_tool_call_image_result_parallel_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("tool_call_image_result_parallel", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("tool_call_image_result_parallel")) +async def test_tool_call_image_result_parallel_stream(case: RouteCase): + """Ensure linked parallel results precede relocated images in actual conversations.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + requests: list[Request] = [] + await _assert_matched_stream_events( + "tool_call_image_result_parallel", downstream, upstream, requests=requests, case=case + ) + if upstream == "chat/completions": + assert len(requests) == 2 + messages = json_loads(requests[1].content)["messages"] + assert [message["role"] for message in messages] == [ + "user", + "assistant", + "tool", + "tool", + "user", + "user", + "user", + ] + call_ids = [call["id"] for call in messages[1]["tool_calls"]] + assert len(call_ids) == len(set(call_ids)) == 2 + assert [message["tool_call_id"] for message in messages[2:4]] == call_ids + expected_input = _read_cassette(case.reference.paths[1])["request"]["body"]["input"] + image_urls = [ + part["image_url"] + for item in expected_input + if item.get("type") == "function_call_output" + for part in item["output"] + if part["type"] == "input_image" + ] + assert messages[4:6] == [ + { + "role": "user", + "content": [ + {"type": "text", "text": f"Image returned by tool call {call_id!r}:"}, + {"type": "image_url", "image_url": {"url": url}}, + ], + } + for call_id, url in zip(call_ids, image_urls, strict=True) + ] -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_tool_call_parallel_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("tool_call_parallel", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("tool_call_parallel")) +async def test_tool_call_parallel_stream(case: RouteCase): + """Ensure both returned parallel calls survive into the request containing their results.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events("tool_call_parallel", downstream, upstream, case=case) -@pytest.mark.parametrize(("downstream", "upstream"), RESPONSES_MESSAGES_ROUTES) -async def test_tool_call_with_reasoning_encrypted_stream(downstream: Protocol, upstream: Protocol): - await _assert_matched_stream_events("tool_call_with_reasoning_encrypted", downstream, upstream) +@pytest.mark.parametrize("case", _stream_cases("tool_call_with_reasoning_encrypted")) +async def test_tool_call_with_reasoning_encrypted_stream(case: RouteCase): + """Ensure three-turn tool history retains actual call IDs and opaque reasoning snapshots.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + await _assert_matched_stream_events( + "tool_call_with_reasoning_encrypted", downstream, upstream, case=case + ) -@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) -async def test_error_matched(downstream: Protocol, upstream: Protocol): - scenario = "error-invalid_request_error" - variant = "stream-00.yaml" - downstream_path = _matched_cassette_path(scenario, downstream, variant) - upstream_path = _matched_cassette_path(scenario, upstream, variant) +@pytest.mark.parametrize( + ("case", "turn"), + [ + pytest.param(case, turn, id=f"{case.id}-{turn:02d}") + for case in route_cases( + MATCHED_CONVERSATIONS, "error-invalid_request_error", "stream", ROUTES + ) + for turn in range(len(case.upstream.cassettes)) + ], +) +async def test_error_matched(case: RouteCase, turn: int): + """Ensures discovered unknown error fixtures preserve the original upstream SDK exception.""" + downstream, upstream = case.downstream.endpoint, case.upstream.endpoint + downstream_path = case.downstream.paths[turn] + upstream_path = case.upstream.paths[turn] downstream_cassette = _read_cassette(downstream_path) upstream_cassette = _read_cassette(upstream_path) expected_response = upstream_cassette["response"] @@ -1524,12 +2209,167 @@ async def test_error_matched(downstream: Protocol, upstream: Protocol): assert exc_info.value.response.json() == expected_response["body"] -async def test_instructions_stream(): - cassette_names = [ - "instructions-stream-00.yaml", - "instructions-stream-01.yaml", +@pytest.mark.parametrize("upstream", ["chat/completions", "messages"]) +async def test_translated_top_level_instructions(upstream: Protocol) -> None: + """Ensures nonempty top-level instructions precede existing translated instructions.""" + additions = { + "instructions": "Follow the leading instruction.", + "input": [ + {"role": "system", "content": "Keep the second instruction."}, + {"role": "user", "content": "Hello"}, + ], + } + instructions = ["Follow the leading instruction.", "Keep the second instruction."] + user = {"role": "user", "content": [{"type": "text", "text": "Hello"}]} + expected = ( + { + "messages": [ + *[ + {"role": "developer", "content": [{"type": "text", "text": text}]} + for text in instructions + ], + user, + ] + } + if upstream == "chat/completions" + else {"system": "\n\n".join(instructions), "messages": [user]} + ) + await _assert_request_parity("responses", upstream, additions, expected) + + +@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) +@pytest.mark.parametrize("parallel", [False, True]) +async def test_required_tool_choice_request( + downstream: Protocol, upstream: Protocol, parallel: bool +) -> None: + """Ensures required/any tool selection preserves explicit parallel-call control.""" + function = { + "name": "lookup", + "parameters": {"type": "object", "properties": {}}, + "strict": False, + } + additions = { + "responses": { + "tools": [{"type": "function", **function}], + "tool_choice": "required", + "parallel_tool_calls": parallel, + }, + "chat/completions": { + "tools": [{"type": "function", "function": function}], + "tool_choice": "required", + "parallel_tool_calls": parallel, + }, + "messages": { + "tools": [{"name": "lookup", "input_schema": function["parameters"]}], + "tool_choice": {"type": "any", "disable_parallel_tool_use": not parallel}, + }, + } + await _assert_request_parity(downstream, upstream, additions[downstream], additions[upstream]) + + +@pytest.mark.parametrize("downstream", RESPONSES_MESSAGES_PROTOCOLS) +@pytest.mark.parametrize( + "image_names", + [(("a",), ()), ((), ("b",)), (("b", "a"), ("d", "c"))], + ids=["first-result-image", "last-result-image", "multiple-images-in-both-results"], +) +async def test_chat_tool_result_image_order( + downstream: Protocol, image_names: tuple[tuple[str, ...], tuple[str, ...]] +) -> None: + """Ensures linked parallel results precede all relocated images in source order.""" + calls = [ + {"type": "function_call", "call_id": call_id, "name": "lookup", "arguments": "{}"} + for call_id in ("call-a", "call-b") ] - await _assert_responses_events(cassette_names) + results = [] + chat_results = [] + deferred_images = [] + for call, names in zip(calls, image_names, strict=True): + call_id = call["call_id"] + urls = [f"https://example.com/{name}.png" for name in names] + text = f"Result for {call_id}" + results.append( + { + "type": "function_call_output", + "call_id": call_id, + "output": [ + {"type": "input_text", "text": text}, + *[{"type": "input_image", "image_url": url} for url in urls], + ], + } + ) + chat_content = [{"type": "text", "text": text}] + if urls: + chat_content.append( + { + "type": "text", + "text": ( + f"The image result of tool call {call_id!r} will be " + "attached as user prompt after all tool responses." + ), + } + ) + deferred_images.append( + { + "role": "user", + "content": [ + {"type": "text", "text": f"Image returned by tool call {call_id!r}:"}, + *[{"type": "image_url", "image_url": {"url": url}} for url in urls], + ], + } + ) + chat_results.append({"role": "tool", "tool_call_id": call_id, "content": chat_content}) + if downstream == "responses": + additions = {"input": [*calls, *results]} + else: + additions = { + "messages": [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": call["call_id"], "name": "lookup", "input": {}} + for call in calls + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": result["call_id"], + "content": [ + {"type": "text", "text": part["text"]} + if part["type"] == "input_text" + else { + "type": "image", + "source": {"type": "url", "url": part["image_url"]}, + } + for part in result["output"] + ], + } + for result in results + ], + }, + ] + } + expected = { + "messages": [ + { + "role": "assistant", + "tool_calls": [ + { + "type": "function", + "id": call["call_id"], + "function": {"name": "lookup", "arguments": "{}"}, + } + for call in calls + ], + }, + *chat_results, + *deferred_images, + ] + } + await _assert_request_parity(downstream, "chat/completions", additions, expected) # --- Prompt caching --- # diff --git a/tests/test_cassette_discovery.py b/tests/test_cassette_discovery.py new file mode 100644 index 0000000..7dc7440 --- /dev/null +++ b/tests/test_cassette_discovery.py @@ -0,0 +1,373 @@ +from itertools import product +from pathlib import Path + +import pytest + +from tests.cassette_discovery import ( + PROTOCOLS, + discover_conversations, + parse_cassette, + public_conversations, + route_cases, + select_conversation, +) + + +def _recordings(root: Path, scenario: str, prefix: str, turns: tuple[int, ...] = (0, 1)) -> None: + directory = root / scenario + directory.mkdir(parents=True, exist_ok=True) + for turn in turns: + (directory / f"{prefix}-{turn}.yaml").touch() + + +def _matched_text(root: Path) -> None: + for prefix in ( + "openai-responses-stream", + "openai-chat_completions-stream", + "anthropic-messages-stream", + ): + _recordings(root, "simple_text", prefix) + + +@pytest.mark.parametrize("provider", ["vllm", "anthropic"]) +def test_second_provider_adds_cases_without_replacing_existing_conversation( + tmp_path: Path, provider: str +) -> None: + """Ensures a second provider on one endpoint adds distinct native and route cases.""" + root = tmp_path / "matched" + _matched_text(root) + routes = tuple(product(PROTOCOLS, repeat=2)) + original = route_cases(public_conversations(root), "simple_text", "stream", routes) + + _recordings(root, "simple_text", f"{provider}-chat_completions-stream") + conversations = public_conversations(root) + expanded = route_cases(conversations, "simple_text", "stream", routes) + + assert len(conversations) == 4 + assert len({conversation.id for conversation in conversations}) == 4 + assert {case.id for case in original} < {case.id for case in expanded} + assert len(expanded) == len({case.id for case in expanded}) == 12 + extra = [ + case + for case in expanded + if case.upstream.provider == provider and case.upstream.endpoint == "chat/completions" + ] + assert {case.downstream.endpoint for case in extra} == set(PROTOCOLS) + assert all(case.reference.provider == "openai" for case in extra) + native = next(case for case in extra if case.downstream.endpoint == "chat/completions") + assert native.downstream is native.upstream + + +def test_extra_responses_provider_preserves_the_canonical_reference(tmp_path: Path) -> None: + """Ensures adding another Responses provider cannot replace existing parity references.""" + root = tmp_path / "matched" + _matched_text(root) + routes = tuple(product(PROTOCOLS, repeat=2)) + original = route_cases(public_conversations(root), "simple_text", "stream", routes) + + _recordings(root, "simple_text", "anthropic-responses-stream") + expanded = route_cases(public_conversations(root), "simple_text", "stream", routes) + + assert {case.id for case in original} < {case.id for case in expanded} + assert len(expanded) == len({case.id for case in expanded}) == 12 + assert all(case.reference.provider == "openai" for case in expanded) + assert {case.reference.paths[0] for case in expanded} == {original[0].reference.paths[0]} + + +def test_explicit_provider_selection_does_not_fall_back_to_endpoint_default( + tmp_path: Path, +) -> None: + """Ensures provider-qualified selection retains both providers' turn zero.""" + root = tmp_path / "matched" + _matched_text(root) + _recordings(root, "simple_text", "vllm-chat_completions-stream") + conversations = public_conversations(root) + + selected = select_conversation( + conversations, "simple_text", "chat/completions", "stream", provider="vllm" + ) + canonical = select_conversation(conversations, "simple_text", "chat/completions", "stream") + + assert selected.provider == "vllm" + assert canonical.provider == "openai" + assert selected.paths[0] != canonical.paths[0] + with pytest.raises(ValueError, match="counterpart.*anthropic"): + select_conversation( + conversations, "simple_text", "chat/completions", "stream", provider="anthropic" + ) + + +def test_turns_are_ordered_numerically_and_modes_stay_separate(tmp_path: Path) -> None: + """Ensures turn ten follows turn nine and response modes form separate conversations.""" + root = tmp_path / "native" + _recordings(root, "simple_text", "vllm-chat_completions-stream", tuple(range(11))) + _recordings(root, "simple_text", "vllm-chat_completions-non_stream") + + conversations = public_conversations(root) + assert len(conversations) == 2 + streamed = select_conversation(conversations, "simple_text", "chat/completions", "stream") + complete = select_conversation(conversations, "simple_text", "chat/completions", "non_stream") + assert streamed.turns == tuple(range(11)) + assert [path.stem.rsplit("-", 1)[1] for path in streamed.paths] == [ + str(turn) for turn in range(11) + ] + assert complete.turns == (0, 1) + assert streamed.id != complete.id + + +def test_discovery_only_reads_the_requested_root_and_direct_scenarios(tmp_path: Path) -> None: + """Ensures sources, upstream IR, archives, and nested trees cannot become route cases.""" + root = tmp_path / "matched" + _matched_text(root) + for excluded in ( + tmp_path / "sources" / "simple_text", + tmp_path / "upstream_ir" / "simple_text", + tmp_path / "archive" / "simple_text", + root / "archive" / "simple_text", + ): + excluded.mkdir(parents=True, exist_ok=True) + (excluded / "malformed.yaml").touch() + + conversations = public_conversations(root) + assert len(conversations) == 3 + assert all(path.parent.parent == root for c in conversations for path in c.paths) + + +def test_native_conversation_needs_no_matched_counterpart(tmp_path: Path) -> None: + """Ensures a faithful provider recording can join native replay without other protocols.""" + root = tmp_path / "native" + _recordings(root, "tool_call", "vllm-chat_completions-stream", (0, 1, 2)) + + conversations = public_conversations(root) + assert len(conversations) == 1 + assert conversations[0].provider == "vllm" + assert conversations[0].endpoint == "chat/completions" + assert conversations[0].turns == (0, 1, 2) + + +@pytest.mark.parametrize( + "filename", + [ + "openai-responses-stream.yaml", + "openai-responses-stream-negative.yaml", + "openai-responses-non-stream-00.yaml", + "openai-chat-stream-00.yaml", + "responses-stream-00.yaml", + ], +) +def test_malformed_filenames_fail_with_the_expected_format(tmp_path: Path, filename: str) -> None: + """Ensures malformed eligible files raise an actionable error instead of disappearing.""" + directory = tmp_path / "simple_text" + directory.mkdir() + (directory / filename).touch() + + with pytest.raises(ValueError, match="Invalid cassette filename.*provider-endpoint-mode-turn"): + discover_conversations(tmp_path) + + +def test_duplicate_numeric_turn_identity_is_rejected(tmp_path: Path) -> None: + """Ensures zero padding cannot disguise two files for one provider and turn.""" + _recordings(tmp_path, "simple_text", "openai-responses-stream") + duplicate = tmp_path / "simple_text" / "openai-responses-stream-00.yaml" + duplicate.touch() + + with pytest.raises(ValueError, match="Duplicate cassette identity") as error: + discover_conversations(tmp_path) + assert "openai-responses-stream-0.yaml" in str(error.value) + assert duplicate.name in str(error.value) + + +@pytest.mark.parametrize("turns", [(1,), (0, 2)]) +def test_missing_initial_or_intermediate_turn_is_rejected( + tmp_path: Path, turns: tuple[int, ...] +) -> None: + """Ensures conversations cannot omit an initial request or an intervening turn.""" + _recordings(tmp_path, "simple_text", "openai-responses-stream", turns) + + with pytest.raises(ValueError, match="Missing turns.*consecutive turns from 0"): + discover_conversations(tmp_path) + + +def test_missing_matched_protocol_counterpart_is_rejected(tmp_path: Path) -> None: + """Ensures missing matched protocols fail case generation rather than reducing routes.""" + _recordings(tmp_path, "simple_text", "openai-responses-stream") + conversations = discover_conversations(tmp_path) + + with pytest.raises(ValueError, match="Missing.*simple_text/messages/stream"): + route_cases(conversations, "simple_text", "stream", (("responses", "messages"),)) + + +def test_missing_matched_counterpart_turn_is_rejected(tmp_path: Path) -> None: + """Ensures equal scenario names cannot hide a truncated counterpart conversation.""" + _recordings(tmp_path, "simple_text", "openai-responses-stream") + _recordings(tmp_path, "simple_text", "openai-chat_completions-stream", (0,)) + + with pytest.raises(ValueError, match="Mismatched turns"): + route_cases( + discover_conversations(tmp_path), + "simple_text", + "stream", + (("responses", "chat/completions"),), + ) + + +def test_missing_responses_reference_is_rejected(tmp_path: Path) -> None: + """Ensures matched comparisons always have an independent Responses reference.""" + _recordings(tmp_path, "simple_text", "openai-chat_completions-stream") + _recordings(tmp_path, "simple_text", "anthropic-messages-stream") + + with pytest.raises(ValueError, match="Missing or ambiguous simple_text/responses/stream"): + route_cases( + discover_conversations(tmp_path), + "simple_text", + "stream", + (("messages", "chat/completions"),), + ) + + +def test_unknown_provider_requires_a_registered_capability_profile(tmp_path: Path) -> None: + """Ensures a new filename cannot silently use the endpoint's default provider profile.""" + with pytest.raises( + ValueError, match="Unsupported provider profile.*unregistered.*PROVIDER_CAPABILITIES" + ): + parse_cassette(tmp_path / "simple_text" / "unregistered-responses-stream-00.yaml") + + +def test_unsupported_scenario_requires_explicit_assertions(tmp_path: Path) -> None: + """Ensures filename discovery does not invent coverage for an unknown scenario.""" + _recordings(tmp_path, "unsupported_feature", "openai-responses-stream") + + with pytest.raises(ValueError, match="Unsupported scenario.*add scenario assertions"): + public_conversations(tmp_path) + + +@pytest.mark.parametrize( + ("scenario", "provider"), + [("reasoning_raw", "openai"), ("reasoning_encrypted", "vllm")], +) +def test_reasoning_profile_must_match_the_scenario( + tmp_path: Path, scenario: str, provider: str +) -> None: + """Ensures discovered reasoning fixtures use the scenario's raw or summary profile.""" + _recordings(tmp_path, scenario, f"{provider}-responses-stream") + + with pytest.raises(ValueError, match="Incompatible provider reasoning profile"): + public_conversations(tmp_path) + + +@pytest.mark.parametrize( + "scenario", + [ + "reasoning_encrypted", + "input_image_with_reasoning_encrypted", + "tool_call_with_reasoning_encrypted", + ], +) +def test_encrypted_messages_alias_preserves_the_single_issuer_contract( + tmp_path: Path, scenario: str +) -> None: + """Ensures curated anthropic-labelled Messages fixtures retain OpenAI-issued history.""" + root = tmp_path / "matched" + turns = (0, 1, 2) if scenario == "tool_call_with_reasoning_encrypted" else (0, 1) + _recordings(root, scenario, "openai-responses-stream", turns) + _recordings(root, scenario, "anthropic-messages-stream", turns) + + cases = route_cases( + public_conversations(root), + scenario, + "stream", + tuple(product(("responses", "messages"), repeat=2)), + ) + + assert len(cases) == 4 + assert all(case.reference.provider == "openai" for case in cases) + assert {case.upstream.provider for case in cases} == {"openai", "anthropic"} + + +def test_encrypted_history_rejects_other_cross_provider_issuer_pairs(tmp_path: Path) -> None: + """Ensures matching summary profiles cannot authorize opaque state from another issuer.""" + root = tmp_path / "matched" + _recordings(root, "reasoning_encrypted", "anthropic-responses-stream") + _recordings(root, "reasoning_encrypted", "openai-messages-stream") + + with pytest.raises(ValueError, match="Incompatible encrypted-state issuers"): + route_cases( + public_conversations(root), + "reasoning_encrypted", + "stream", + (("responses", "messages"),), + ) + + +def test_scenario_endpoint_restrictions_are_not_inferred_from_filename(tmp_path: Path) -> None: + """Ensures correctly named Chat fixtures cannot bypass encrypted-scenario restrictions.""" + root = tmp_path / "matched" + _recordings(root, "reasoning_encrypted", "openai-chat_completions-stream") + + with pytest.raises(ValueError, match="Unsupported endpoint.*reasoning_encrypted"): + public_conversations(root) + + +@pytest.mark.parametrize( + ("scenario", "turns"), + [ + ("simple_text", (0,)), + ("tool_call", (0, 1)), + ("tool_call_with_reasoning_encrypted", (0, 1)), + ], +) +def test_matched_conversation_preserves_required_scenario_turns( + tmp_path: Path, scenario: str, turns: tuple[int, ...] +) -> None: + """Ensures equally truncated protocol files cannot erase required continuation coverage.""" + root = tmp_path / "matched" + _recordings(root, scenario, "openai-responses-stream", turns) + + with pytest.raises(ValueError, match="Missing required turns"): + public_conversations(root) + + +def test_native_deviation_can_reproduce_in_a_single_turn(tmp_path: Path) -> None: + """Ensures native SDK evidence does not require unrelated continuation recordings.""" + root = tmp_path / "native" + _recordings(root, "simple_text", "vllm-chat_completions-stream", (0,)) + + conversations = public_conversations(root) + assert len(conversations) == 1 + assert conversations[0].turns == (0,) + + +def test_unsupported_matched_response_mode_requires_scenario_assertions(tmp_path: Path) -> None: + """Ensures an unhandled complete-response scenario does not join unrelated tests.""" + root = tmp_path / "matched" + _recordings(root, "tool_call", "openai-responses-non_stream", (0, 1, 2)) + + with pytest.raises( + ValueError, match="Unsupported matched response mode.*add scenario assertions" + ): + public_conversations(root) + + +def test_incomplete_results_are_excluded_from_registered_exception_cases(tmp_path: Path) -> None: + """Ensures Responses-only incomplete results require no Chat or Messages error fixtures.""" + root = tmp_path / "errors" + for prefix in ( + "openai-responses-stream", + "openai-chat_completions-stream", + "anthropic-messages-stream", + ): + _recordings(root, "model_not_found", prefix, (0,)) + _recordings(root, "incomplete_response", "openai-responses-stream", (0,)) + _recordings(root, "incomplete_response", "openai-responses-non_stream", (0,)) + _recordings(root, "unregistered_error", "unregistered-responses-stream", (0,)) + + conversations = discover_conversations(root, scenarios=("model_not_found",)) + cases = route_cases( + conversations, + "model_not_found", + "stream", + tuple(product(PROTOCOLS, repeat=2)), + ) + + assert len(cases) == 9 + assert {conversation.scenario for conversation in conversations} == {"model_not_found"} diff --git a/tests/test_match_anthropic_cassette_events.py b/tests/test_match_anthropic_cassette_events.py index 83206b8..1482717 100644 --- a/tests/test_match_anthropic_cassette_events.py +++ b/tests/test_match_anthropic_cassette_events.py @@ -16,10 +16,10 @@ main, match_messages_events, ) +from tests.cassette_discovery import matcher_pairs MATCHED_CASSETTES = Path(__file__).parent / "cassettes" / "matched" REASONING_RAW_CASSETTES = MATCHED_CASSETTES / "reasoning_raw" -TOOL_CALL_CASSETTES = MATCHED_CASSETTES / "tool_call" MESSAGE_EVENT_ADAPTER = AnthropicMessagesStreamEventAdapter OPAQUE_STATE_CASSETTES = ( Path(__file__).parent / "cassettes" / "matched" / "input_image_with_reasoning_encrypted" @@ -1282,14 +1282,14 @@ def test_uses_standard_service_tier_for_translated_messages() -> None: assert message["usage"]["service_tier"] == "standard" -@pytest.mark.parametrize("turn", range(3)) -def test_matches_real_tool_call_cassettes(turn: int) -> None: - messages_cassette = read_yaml( - str(TOOL_CALL_CASSETTES / f"anthropic-messages-stream-{turn:02d}.yaml") - ) - responses_cassette = read_yaml( - str(TOOL_CALL_CASSETTES / f"openai-responses-stream-{turn:02d}.yaml") - ) +@pytest.mark.parametrize( + ("messages_path", "responses_path"), + [(messages, responses) for _, messages, responses in matcher_pairs("tool_call", "messages")], +) +def test_matches_real_tool_call_cassettes(messages_path: Path, responses_path: Path) -> None: + """Ensures discovered tool turns retain call identities, arguments, and result history.""" + messages_cassette = read_yaml(messages_path) + responses_cassette = read_yaml(responses_path) match_messages_events(messages_cassette, responses_cassette) @@ -1380,12 +1380,18 @@ def test_matches_real_tool_call_cassettes(turn: int) -> None: ] -@pytest.mark.parametrize("scenario", ["prompt_cache_implicit", "prompt_cache_explicit"]) -@pytest.mark.parametrize("turn", range(2)) -def test_matches_prompt_cache_cassettes(scenario: str, turn: int) -> None: - directory = MATCHED_CASSETTES / scenario - messages_cassette = read_yaml(str(directory / f"anthropic-messages-stream-{turn:02d}.yaml")) - responses_cassette = read_yaml(str(directory / f"openai-responses-stream-{turn:02d}.yaml")) +@pytest.mark.parametrize( + ("messages_path", "responses_path"), + [ + (messages, responses) + for scenario in ("prompt_cache_implicit", "prompt_cache_explicit") + for _, messages, responses in matcher_pairs(scenario, "messages") + ], +) +def test_matches_prompt_cache_cassettes(messages_path: Path, responses_path: Path) -> None: + """Ensures discovered cache turns preserve markers, cache policy, and semantic usage.""" + messages_cassette = read_yaml(messages_path) + responses_cassette = read_yaml(responses_path) original_messages = deepcopy(messages_cassette) original_responses = deepcopy(responses_cassette) messages_cassette["request"]["body"].update( @@ -1568,14 +1574,21 @@ def test_matches_real_two_turn_request_body() -> None: assert message_start["usage"]["output_tokens"] == 0 -@pytest.mark.parametrize("turn", range(2)) -def test_same_provider_opaque_state_cassettes_are_matched(turn: int) -> None: - messages_cassette = read_yaml( - str(OPAQUE_STATE_CASSETTES / f"anthropic-messages-stream-{turn:02d}.yaml") - ) - responses_cassette = read_yaml( - str(OPAQUE_STATE_CASSETTES / f"openai-responses-stream-{turn:02d}.yaml") - ) +@pytest.mark.parametrize( + ("messages_path", "responses_path"), + [ + (messages, responses) + for _, messages, responses in matcher_pairs( + "input_image_with_reasoning_encrypted", "messages" + ) + ], +) +def test_same_provider_opaque_state_cassettes_are_matched( + messages_path: Path, responses_path: Path +) -> None: + """Ensures every discovered encrypted turn retains the same-issuer opaque-state mapping.""" + messages_cassette = read_yaml(messages_path) + responses_cassette = read_yaml(responses_path) original_messages_cassette = deepcopy(messages_cassette) match_messages_events(messages_cassette, responses_cassette) @@ -1583,14 +1596,19 @@ def test_same_provider_opaque_state_cassettes_are_matched(turn: int) -> None: assert messages_cassette == original_messages_cassette -@pytest.mark.parametrize("turn", range(2)) -def test_encrypted_reasoning_cassettes_are_matched(turn: int) -> None: - messages_cassette = read_yaml( - str(ENCRYPTED_REASONING_CASSETTES / f"anthropic-messages-stream-{turn:02d}.yaml") - ) - responses_cassette = read_yaml( - str(ENCRYPTED_REASONING_CASSETTES / f"openai-responses-stream-{turn:02d}.yaml") - ) +@pytest.mark.parametrize( + ("messages_path", "responses_path"), + [ + (messages, responses) + for _, messages, responses in matcher_pairs("reasoning_encrypted", "messages") + ], +) +def test_encrypted_reasoning_cassettes_are_matched( + messages_path: Path, responses_path: Path +) -> None: + """Ensures every discovered encrypted turn retains the same-issuer opaque-state mapping.""" + messages_cassette = read_yaml(messages_path) + responses_cassette = read_yaml(responses_path) original_messages_cassette = deepcopy(messages_cassette) match_messages_events(messages_cassette, responses_cassette) @@ -1602,14 +1620,21 @@ def test_encrypted_reasoning_cassettes_are_matched(turn: int) -> None: MESSAGE_EVENT_ADAPTER.validate_python(event) -@pytest.mark.parametrize("turn", range(3)) -def test_tool_call_encrypted_reasoning_cassettes_are_matched(turn: int) -> None: - messages_cassette = read_yaml( - str(TOOL_CALL_ENCRYPTED_REASONING_CASSETTES / f"anthropic-messages-stream-{turn:02d}.yaml") - ) - responses_cassette = read_yaml( - str(TOOL_CALL_ENCRYPTED_REASONING_CASSETTES / f"openai-responses-stream-{turn:02d}.yaml") - ) +@pytest.mark.parametrize( + ("messages_path", "responses_path"), + [ + (messages, responses) + for _, messages, responses in matcher_pairs( + "tool_call_with_reasoning_encrypted", "messages" + ) + ], +) +def test_tool_call_encrypted_reasoning_cassettes_are_matched( + messages_path: Path, responses_path: Path +) -> None: + """Ensures every discovered encrypted turn retains the same-issuer opaque-state mapping.""" + messages_cassette = read_yaml(messages_path) + responses_cassette = read_yaml(responses_path) original_messages_cassette = deepcopy(messages_cassette) match_messages_events(messages_cassette, responses_cassette) diff --git a/tests/test_match_anthropic_cassette_responses.py b/tests/test_match_anthropic_cassette_responses.py index ef84df4..b0795e7 100644 --- a/tests/test_match_anthropic_cassette_responses.py +++ b/tests/test_match_anthropic_cassette_responses.py @@ -9,6 +9,7 @@ ) from molto.utils.io import dump_yaml, read_yaml from scripts.match_anthropic_cassette_responses import main, match_messages_response +from tests.cassette_discovery import matcher_pairs CASSETTES = Path(__file__).parent / "cassettes" / "matched" / "simple_text" @@ -21,9 +22,16 @@ def _cassettes(turn: int = 0) -> tuple[dict, dict]: return messages, responses -@pytest.mark.parametrize("turn", [0, 1]) -def test_matches_real_non_streaming_cassette_and_is_idempotent(turn: int) -> None: - messages, responses = _cassettes(turn) +@pytest.mark.parametrize( + ("turn", "messages_path", "responses_path"), + matcher_pairs("simple_text", "messages", "non_stream"), +) +def test_matches_real_non_streaming_cassette_and_is_idempotent( + turn: int, messages_path: Path, responses_path: Path +) -> None: + """Ensures every discovered conversation turn matches valid native output idempotently.""" + messages = read_yaml(messages_path) + responses = read_yaml(responses_path) transport = deepcopy(messages["response"]["headers"]) match_messages_response(messages, responses) diff --git a/tests/test_match_openai_cassette_events.py b/tests/test_match_openai_cassette_events.py index fcbec65..983663f 100644 --- a/tests/test_match_openai_cassette_events.py +++ b/tests/test_match_openai_cassette_events.py @@ -11,26 +11,18 @@ _serialize_data_event, main, match_chat_completions_events, + match_chat_completions_request, ) +from tests.cassette_discovery import matcher_pairs CASSETTES = Path(__file__).parent / "cassettes" / "matched" CHAT_CASSETTE = CASSETTES / "simple_text" / "openai-chat_completions-stream-00.yaml" RESPONSES_CASSETTE = CASSETTES / "simple_text" / "openai-responses-stream-00.yaml" REASONING_CASSETTES = [ - ( - CASSETTES / "reasoning_raw" / f"vllm-chat_completions-stream-{index:02d}.yaml", - CASSETTES / "reasoning_raw" / f"vllm-responses-stream-{index:02d}.yaml", - ) - for index in range(2) -] -TOOL_CALL_CASSETTES = [ - ( - index, - CASSETTES / "tool_call" / f"openai-chat_completions-stream-{index:02d}.yaml", - CASSETTES / "tool_call" / f"openai-responses-stream-{index:02d}.yaml", - ) - for index in range(3) + (chat_path, responses_path) + for _, chat_path, responses_path in matcher_pairs("reasoning_raw", "chat/completions") ] +TOOL_CALL_CASSETTES = matcher_pairs("tool_call", "chat/completions") TOOL_CALL_CHOICE_CASSETTES = ( CASSETTES / "tool_call_choice" / "openai-chat_completions-stream-00.yaml", CASSETTES / "tool_call_choice" / "openai-responses-stream-00.yaml", @@ -279,12 +271,18 @@ def test_matches_reasoning_history_with_instruction_parts_and_cache(with_cache: assert responses_cassette == original_responses -@pytest.mark.parametrize("scenario", ["prompt_cache_implicit", "prompt_cache_explicit"]) -@pytest.mark.parametrize("turn", range(2)) -def test_matches_prompt_cache_cassettes(scenario: str, turn: int) -> None: - directory = CASSETTES / scenario - chat_cassette = read_yaml(str(directory / f"openai-chat_completions-stream-{turn:02d}.yaml")) - responses_cassette = read_yaml(str(directory / f"openai-responses-stream-{turn:02d}.yaml")) +@pytest.mark.parametrize( + ("chat_path", "responses_path"), + [ + (chat_path, responses_path) + for scenario in ("prompt_cache_implicit", "prompt_cache_explicit") + for _, chat_path, responses_path in matcher_pairs(scenario, "chat/completions") + ], +) +def test_matches_prompt_cache_cassettes(chat_path: Path, responses_path: Path) -> None: + """Ensures discovered cache turns preserve cache intent and semantic usage when matched.""" + chat_cassette = read_yaml(chat_path) + responses_cassette = read_yaml(responses_path) original_responses = deepcopy(responses_cassette) original_chat = deepcopy(chat_cassette) chat_cassette["request"]["body"].update( @@ -396,6 +394,7 @@ def test_cli_sorts_yaml_mapping_keys(tmp_path: Path) -> None: @pytest.mark.parametrize(("chat_path", "responses_path"), REASONING_CASSETTES) def test_matches_reasoning_text_stream_cassettes(chat_path: Path, responses_path: Path) -> None: + """Ensures every discovered raw-reasoning turn retains reasoning and text deltas.""" chat_cassette = read_yaml(str(chat_path)) responses_cassette = read_yaml(str(responses_path)) @@ -455,6 +454,7 @@ def test_matches_reasoning_text_stream_cassettes(chat_path: Path, responses_path def test_matches_tool_call_stream_cassettes( turn: int, chat_path: Path, responses_path: Path ) -> None: + """Ensures discovered tool turns retain arguments, linked history, and termination.""" chat_cassette = read_yaml(str(chat_path)) responses_cassette = read_yaml(str(responses_path)) original_chat_request = deepcopy(chat_cassette["request"]["body"]) @@ -523,6 +523,199 @@ def test_matches_tool_call_stream_cassettes( assert sum(entry.strip() == "data: [DONE]" for entry in chat_cassette["response"]["sse"]) == 1 +@pytest.mark.parametrize( + ("companion_path", "responses_path"), + [ + (chat_path, responses_path) + for _, chat_path, responses_path in matcher_pairs( + "tool_call_image_result_parallel", "chat/completions" + ) + ], +) +def test_matches_recorded_parallel_tool_images_companion( + tmp_path: Path, companion_path: Path, responses_path: Path +) -> None: + """Ensures discovered source turns reproduce matched companions without changing originals.""" + filename = companion_path.name + # Reuse a faithful original where it lives instead of requiring another copy. + source_paths = [ + CASSETTES.parent / root / companion_path.parent.name / filename + for root in ("native", "upstream_ir", "sources") + ] + source_path = next((path for path in source_paths if path.is_file()), None) + assert source_path is not None, ( + f"Missing approved original for {companion_path}: {source_paths}" + ) + output_path = tmp_path / filename + source_bytes = source_path.read_bytes() + responses_bytes = responses_path.read_bytes() + + assert ( + main( + [ + str(source_path), + str(responses_path), + "--request-only", + "--output", + str(output_path), + ] + ) + == 0 + ) + assert main([str(output_path), str(responses_path)]) == 0 + + matched = read_yaml(str(output_path)) + assert matched == read_yaml(str(companion_path)) + for cassette in (read_yaml(str(source_path)), matched): + OpenAIChatCompletionsCreateRequest.model_validate(cassette["request"]["body"]) + for event in _data_events(cassette): + ChatCompletionChunk.model_validate(event) + first_match = output_path.read_bytes() + assert main([str(output_path), str(responses_path), "--request-only"]) == 0 + assert main([str(output_path), str(responses_path)]) == 0 + assert output_path.read_bytes() == first_match + assert source_path.read_bytes() == source_bytes + assert responses_path.read_bytes() == responses_bytes + + +@pytest.mark.parametrize("image_counts", [(2, 1), (1, 0), (0, 1)]) +@pytest.mark.parametrize("follow_up", [False, True]) +@pytest.mark.parametrize("with_text", [False, True]) +def test_matches_parallel_tool_images_after_all_results( + tmp_path: Path, image_counts: tuple[int, int], follow_up: bool, with_text: bool +) -> None: + """Ensures parallel results stay contiguous before relocated images in source order.""" + responses = read_yaml(str(RESPONSES_CASSETTE)) + response_input = [{"role": "user", "content": "Read both images."}] + response_input.extend( + { + "type": "function_call", + "call_id": f"call_{index}", + "name": "read_image", + "arguments": "{}", + } + for index in range(2) + ) + expected_tools = [] + expected_images = [] + for index, image_count in enumerate(image_counts): + call_id = f"call_{index}" + output = [{"type": "input_text", "text": f"Result {index}."}] if with_text else [] + images = [] + for image_index in range(image_count): + url = ( + f"https://example.com/{index}-{image_index}.png" + if index == 0 + else "data:image/png;base64,aW1hZ2U=" + ) + output.append({"type": "input_image", "image_url": url, "detail": "high"}) + images.append({"type": "image_url", "image_url": {"url": url, "detail": "high"}}) + # Text after an image must remain in its original tool response. + if with_text: + output.append({"type": "input_text", "text": f"End {index}."}) + response_input.append( + {"type": "function_call_output", "call_id": call_id, "output": output} + ) + tool_content = ( + [ + {"type": "text", "text": f"Result {index}."}, + {"type": "text", "text": f"End {index}."}, + ] + if with_text + else [] + ) + if images: + tool_content.append( + { + "type": "text", + "text": ( + f"The image result of tool call {call_id!r} will be " + "attached as user prompt after all tool responses." + ), + } + ) + expected_images.append( + { + "role": "user", + "content": [ + {"type": "text", "text": f"Image returned by tool call {call_id!r}:"}, + *images, + ], + } + ) + expected_tools.append({"role": "tool", "tool_call_id": call_id, "content": tool_content}) + if follow_up: + response_input.append({"role": "user", "content": "Describe the images."}) + responses["request"]["body"]["input"] = response_input + responses_path = tmp_path / "responses.yaml" + output_path = tmp_path / "chat.yaml" + dump_yaml(responses, str(responses_path)) + + assert main([str(CHAT_CASSETTE), str(responses_path), "--output", str(output_path)]) == 0 + + matched = read_yaml(str(output_path)) + request = matched["request"]["body"] + OpenAIChatCompletionsCreateRequest.model_validate(request) + for event in _data_events(matched): + ChatCompletionChunk.model_validate(event) + messages = request["messages"] + assert messages[1] == { + "role": "assistant", + "tool_calls": [ + { + "id": f"call_{index}", + "type": "function", + "function": {"name": "read_image", "arguments": "{}"}, + } + for index in range(2) + ], + } + assert messages[2:] == expected_tools + expected_images + ( + [{"role": "user", "content": [{"type": "text", "text": "Describe the images."}]}] + if follow_up + else [] + ) + assert read_yaml(str(responses_path)) == responses + first_match = output_path.read_bytes() + assert main([str(output_path), str(responses_path)]) == 0 + assert output_path.read_bytes() == first_match + + +@pytest.mark.parametrize("invalid_part", ["marked_image", "marked_later_text", "original_detail"]) +def test_rejects_unrepresentable_relocated_tool_images(invalid_part: str) -> None: + """Ensures image relocation preserves cache prefixes and rejects unsupported fidelity.""" + chat = read_yaml(str(CHAT_CASSETTE)) + responses = read_yaml(str(RESPONSES_CASSETTE)) + image = {"type": "input_image", "image_url": "https://example.com/image.png"} + later_text = {"type": "input_text", "text": "Second result."} + if invalid_part == "original_detail": + image["detail"] = "original" + else: + marked_part = image if invalid_part == "marked_image" else later_text + marked_part["prompt_cache_breakpoint"] = {"mode": "explicit"} + responses["request"]["body"]["input"] = [ + { + "type": "function_call", + "call_id": f"call_{index}", + "name": "read_image", + "arguments": "{}", + } + for index in range(2) + ] + [ + {"type": "function_call_output", "call_id": "call_0", "output": [image]}, + {"type": "function_call_output", "call_id": "call_1", "output": [later_text]}, + ] + original_responses = deepcopy(responses) + original_chat = deepcopy(chat) + expected_error = "image detail" if invalid_part == "original_detail" else "cache breakpoints" + + with pytest.raises(ValueError, match=expected_error): + match_chat_completions_request(chat, responses) + + assert responses == original_responses + assert chat == original_chat + + @pytest.mark.parametrize("adjustment", ["extra", "missing"]) def test_rebuilds_unequal_chat_content_delta_stream(adjustment: str) -> None: chat_cassette = read_yaml(str(CHAT_CASSETTE)) diff --git a/tests/test_match_openai_cassette_responses.py b/tests/test_match_openai_cassette_responses.py index 3eb0bd1..fb7127d 100644 --- a/tests/test_match_openai_cassette_responses.py +++ b/tests/test_match_openai_cassette_responses.py @@ -12,6 +12,7 @@ main, match_chat_completions_response, ) +from tests.cassette_discovery import matcher_pairs CASSETTES = Path(__file__).parent / "cassettes" / "matched" / "simple_text" @@ -24,9 +25,16 @@ def _cassettes(turn: int = 0) -> tuple[dict, dict]: return chat, responses -@pytest.mark.parametrize("turn", [0, 1]) -def test_matches_real_non_streaming_cassette_and_is_idempotent(turn: int) -> None: - chat, responses = _cassettes(turn) +@pytest.mark.parametrize( + ("turn", "chat_path", "responses_path"), + matcher_pairs("simple_text", "chat/completions", "non_stream"), +) +def test_matches_real_non_streaming_cassette_and_is_idempotent( + turn: int, chat_path: Path, responses_path: Path +) -> None: + """Ensures every discovered conversation turn matches valid native output idempotently.""" + chat = read_yaml(chat_path) + responses = read_yaml(responses_path) transport = deepcopy(chat["response"]["headers"]) match_chat_completions_response(chat, responses) diff --git a/tests/test_network.py b/tests/test_network.py new file mode 100644 index 0000000..4421d53 --- /dev/null +++ b/tests/test_network.py @@ -0,0 +1,9 @@ +import httpx +import pytest + + +async def test_default_transport_cannot_reach_the_network() -> None: + """Ensures an unmocked HTTP request fails before any network access during tests.""" + async with httpx.AsyncClient() as client: + with pytest.raises(AssertionError, match="Unexpected real network call"): + await client.get("https://example.test/") diff --git a/tests/upstream/test_anthropic.py b/tests/upstream/test_anthropic.py index 043a5d8..f986e26 100644 --- a/tests/upstream/test_anthropic.py +++ b/tests/upstream/test_anthropic.py @@ -764,7 +764,8 @@ def test_client_selects_model_supported_thinking_configuration( thinking: dict, output_config: dict | None, ): - body = AnthropicMessagesClient._request_body( + """Ensures thinking mode and effort follow the target model capabilities.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[UserInput(content=[TextInput(content="Hello")])], max_output_tokens=40_000, @@ -772,7 +773,7 @@ def test_client_selects_model_supported_thinking_configuration( reasoning=Reasoning(effort=effort), stream=True, ) - ) + ).model_dump() assert body["thinking"] == thinking assert body.get("output_config") == output_config @@ -780,7 +781,7 @@ def test_client_selects_model_supported_thinking_configuration( def test_client_projects_user_text_as_content_block_list(): """Ensures Messages projection retains user parts and assistant message boundaries.""" - body = AnthropicMessagesClient._request_body( + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[ UserInput(content=[TextInput(content="Part one"), TextInput(content="Part two")]), @@ -791,7 +792,7 @@ def test_client_projects_user_text_as_content_block_list(): model="compatible-model", stream=True, ) - ) + ).model_dump() assert body["messages"] == [ { @@ -810,14 +811,14 @@ def test_client_projects_prompt_cache_as_automatic_cache_control(): """Ensures automatic caching follows mode and lifetime intent, never a caller key.""" def body(prompt_cache: PromptCache) -> dict[str, object]: - return AnthropicMessagesClient._request_body( + return AnthropicMessagesClient._native_request( NormalizedRequest( max_output_tokens=2048, model="compatible-model", stream=True, prompt_cache=prompt_cache, ) - ) + ).model_dump() assert body(PromptCache(mode="implicit"))["cache_control"] == {"type": "ephemeral"} assert body(PromptCache(ttl="1h"))["cache_control"] == {"type": "ephemeral", "ttl": "1h"} @@ -856,7 +857,7 @@ def test_client_preserves_assistant_message_boundaries_and_ordered_blocks(): ], ) - assert AnthropicMessagesClient._request_body(request)["messages"] == [ + assert AnthropicMessagesClient._native_request(request).model_dump()["messages"] == [ {"role": "assistant", "content": []}, { "role": "assistant", @@ -960,7 +961,8 @@ def test_request_rejects_file_image_source(): def test_client_projects_image_parts_as_image_blocks(): - body = AnthropicMessagesClient._request_body( + """Ensures Messages image projection preserves the source URL or base64 data.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[ UserInput( @@ -976,7 +978,7 @@ def test_client_projects_image_parts_as_image_blocks(): model="compatible-model", stream=True, ) - ) + ).model_dump() assert body["messages"] == [ { @@ -999,6 +1001,7 @@ def test_client_projects_image_parts_as_image_blocks(): @pytest.mark.parametrize("detail", ["low", "high", "original"]) def test_client_rejects_unrepresentable_image_detail(detail: str): + """Ensures Messages rejects image fidelity controls it cannot represent.""" request = NormalizedRequest( input=[ UserInput(content=[ImageUrlInput(url="data:image/png;base64,AA==", detail=detail)]) @@ -1009,10 +1012,11 @@ def test_client_rejects_unrepresentable_image_detail(detail: str): ) with pytest.raises(UnsupportedInput, match="cannot represent image detail"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) def test_client_rejects_non_base64_data_url_image(): + """Ensures Messages rejects image data URLs without base64 encoding.""" request = NormalizedRequest( input=[UserInput(content=[ImageUrlInput(url="data:image/png,%89NP")])], max_output_tokens=2048, @@ -1021,7 +1025,7 @@ def test_client_rejects_non_base64_data_url_image(): ) with pytest.raises(UnsupportedInput, match="base64 data URL"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) @pytest.mark.parametrize( @@ -1039,7 +1043,8 @@ def test_client_maps_effort_to_extended_thinking_budget( effort: str, budget_tokens: int, ): - body = AnthropicMessagesClient._request_body( + """Ensures manual thinking uses the documented effort token budget.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[UserInput(content=[TextInput(content="Hello")])], max_output_tokens=40_000, @@ -1047,7 +1052,7 @@ def test_client_maps_effort_to_extended_thinking_budget( reasoning=Reasoning(effort=effort), stream=True, ) - ) + ).model_dump() assert body["thinking"] == { "type": "enabled", @@ -1059,7 +1064,7 @@ def test_client_maps_effort_to_extended_thinking_budget( def test_client_enables_adaptive_thinking_for_reasoning_history(): """Ensures nested assistant reasoning enables adaptive thinking for supported models.""" - body = AnthropicMessagesClient._request_body( + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[ AssistantInput( @@ -1073,7 +1078,7 @@ def test_client_enables_adaptive_thinking_for_reasoning_history(): model="compatible-model", stream=True, ) - ) + ).model_dump() assert body["thinking"] == {"type": "adaptive", "display": "summarized"} assert body["output_config"] == {"effort": "high"} @@ -1081,7 +1086,7 @@ def test_client_enables_adaptive_thinking_for_reasoning_history(): def test_client_uses_summary_when_reasoning_history_omits_raw_content(): """Ensures nested signed summaries preserve text and signature in thinking blocks.""" - body = AnthropicMessagesClient._request_body( + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[ AssistantInput( @@ -1095,7 +1100,7 @@ def test_client_uses_summary_when_reasoning_history_omits_raw_content(): model="compatible-model", stream=True, ) - ) + ).model_dump() assert body["messages"][0]["content"][0] == { "type": "thinking", @@ -1105,6 +1110,7 @@ def test_client_uses_summary_when_reasoning_history_omits_raw_content(): def test_client_rejects_reasoning_history_outside_capability() -> None: + """Ensures reasoning history respects the selected provider capability.""" request = NormalizedRequest( input=[Thinking(content="", summary="Summary", signature="opaque-state")], max_output_tokens=100, @@ -1113,11 +1119,12 @@ def test_client_rejects_reasoning_history_outside_capability() -> None: ) with pytest.raises(UnsupportedInput, match="does not match the provider"): - AnthropicMessagesClient._request_body(request, capabilities=VLLM_CAPABILITIES) + AnthropicMessagesClient._native_request(request, capabilities=VLLM_CAPABILITIES) def test_client_disables_thinking_without_output_effort(): - body = AnthropicMessagesClient._request_body( + """Ensures disabled thinking does not send an output effort setting.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[UserInput(content=[TextInput(content="Hello")])], max_output_tokens=2048, @@ -1125,15 +1132,16 @@ def test_client_disables_thinking_without_output_effort(): reasoning=Reasoning(effort="none"), stream=True, ) - ) + ).model_dump() assert body["thinking"] == {"type": "disabled"} assert "output_config" not in body def test_client_rejects_extended_thinking_budget_at_output_limit(): + """Ensures manual thinking leaves room for output within the token limit.""" with pytest.raises(UnsupportedInput, match="must be less than max_output_tokens"): - AnthropicMessagesClient._request_body( + AnthropicMessagesClient._native_request( NormalizedRequest( input=[UserInput(content=[TextInput(content="Hello")])], max_output_tokens=10_000, @@ -1474,7 +1482,7 @@ def test_adapter_rejects_server_generated_tool_history(): def test_client_projects_function_tools_and_tool_history_without_caller(): """Ensures grouped assistant tool history projects without synthesizing caller metadata.""" - body = AnthropicMessagesClient._request_body( + body = AnthropicMessagesClient._native_request( NormalizedRequest( input=[ UserInput(content=[TextInput(content="Run both tools.")]), @@ -1505,7 +1513,7 @@ def test_client_projects_function_tools_and_tool_history_without_caller(): ) ], ) - ) + ).model_dump() assert body["messages"] == [ { @@ -1563,26 +1571,29 @@ def test_client_projects_function_tools_and_tool_history_without_caller(): @pytest.mark.parametrize("tool_choice", ["required", FunctionToolChoice(name="First")]) def test_client_rejects_required_tool_choice_without_tools(tool_choice): + """Ensures required tool selection cannot be sent without tool definitions.""" with pytest.raises(UnsupportedInput, match="needs at least one tool"): - AnthropicMessagesClient._request_body( + AnthropicMessagesClient._native_request( NormalizedRequest(model="model", tool_choice=tool_choice) ) def test_client_omits_parallel_tool_choice_without_tools(): - body = AnthropicMessagesClient._request_body( + """Ensures parallel-call control alone does not enable tool selection.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( max_output_tokens=10, model="model", parallel_tool_calls=False, ) - ) + ).model_dump() assert "tool_choice" not in body @pytest.mark.parametrize("outcome", ["denied", "interrupted"]) def test_client_rejects_unrepresentable_tool_result_outcomes(outcome): + """Ensures Messages rejects tool outcomes it cannot preserve.""" request = NormalizedRequest( input=[ ToolReturn( @@ -1595,18 +1606,19 @@ def test_client_rejects_unrepresentable_tool_result_outcomes(outcome): ) with pytest.raises(UnsupportedInput, match="cannot preserve denied or interrupted"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) def test_client_accepts_disabled_stream_obfuscation(): - body = AnthropicMessagesClient._request_body( + """Ensures disabling obfuscation remains accepted without a Messages field.""" + body = AnthropicMessagesClient._native_request( NormalizedRequest( max_output_tokens=10, model="model", stream=True, stream_options=StreamOptions(include_obfuscation=False), ) - ) + ).model_dump() assert body["stream"] is True @@ -1649,8 +1661,9 @@ def test_client_rejects_unrepresentable_normalized_request_fields( normalized_request: NormalizedRequest, error: str, ): + """Ensures unsupported normalized semantics fail before Messages transport.""" with pytest.raises(UnsupportedInput, match=error): - AnthropicMessagesClient._request_body(normalized_request) + AnthropicMessagesClient._native_request(normalized_request) def test_anthropic_client_ignores_responses_history_item_ids(): @@ -1679,9 +1692,10 @@ def request(item_id: str | None) -> NormalizedRequest: model="model", ) - assert AnthropicMessagesClient._request_body( - request("responses_item_id") - ) == AnthropicMessagesClient._request_body(request(None)) + assert ( + AnthropicMessagesClient._native_request(request("responses_item_id")).model_dump() + == AnthropicMessagesClient._native_request(request(None)).model_dump() + ) async def test_client_normalizes_streamed_tool_call(monkeypatch: pytest.MonkeyPatch): @@ -1938,7 +1952,7 @@ def test_cache_breakpoints_preserve_system_parts_and_inherit_lifetime(mode): ], prompt_cache=PromptCache(mode=mode, ttl="30m"), ) - body = AnthropicMessagesClient._request_body(request) + body = AnthropicMessagesClient._native_request(request).model_dump() control = {"type": "ephemeral", "ttl": "1h"} assert body["system"] == [ {"type": "text", "text": "Cached instructions", "cache_control": control}, @@ -1964,7 +1978,7 @@ def test_rejects_cache_prefix_changes_from_hoisted_instructions(): ], ) with pytest.raises(UnsupportedInput, match="hoisting"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) @pytest.mark.parametrize( @@ -1988,7 +2002,7 @@ def test_cache_breakpoint_count_is_left_to_upstream(count, mode, unmarked_tail): input=[UserInput(content=content)], prompt_cache=PromptCache(mode=mode), ) - body = AnthropicMessagesClient._request_body(request) + body = AnthropicMessagesClient._native_request(request).model_dump() expected = [ {"type": "text", "text": str(i), "cache_control": {"type": "ephemeral"}} for i in range(count) @@ -2016,13 +2030,13 @@ def test_block_lifetimes_must_decrease_in_prompt_order(ttls): prompt_cache=PromptCache(mode="explicit"), ) if ttls == ("1h", "5m"): - body = AnthropicMessagesClient._request_body(request) + body = AnthropicMessagesClient._native_request(request).model_dump() assert [part["cache_control"]["ttl"] for part in body["messages"][0]["content"]] == list( ttls ) else: with pytest.raises(UnsupportedInput, match="must precede"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) def test_automatic_and_final_block_cache_lifetimes_must_match(): @@ -2040,4 +2054,4 @@ def test_automatic_and_final_block_cache_lifetimes_must_match(): prompt_cache=PromptCache(mode="implicit", ttl="5m"), ) with pytest.raises(UnsupportedInput, match="must match"): - AnthropicMessagesClient._request_body(request) + AnthropicMessagesClient._native_request(request) diff --git a/tests/upstream/test_openai.py b/tests/upstream/test_openai.py index e08b332..cd30929 100644 --- a/tests/upstream/test_openai.py +++ b/tests/upstream/test_openai.py @@ -265,7 +265,7 @@ def test_responses_adapter_preserves_user_message_and_part_boundaries(): def test_responses_client_projects_typed_text_history_without_phase(): """Ensures assistant history uses output text without inventing phase metadata.""" - body = OpenAIResponsesClient._request_body( + body = OpenAIResponsesClient._native_request( NormalizedRequest( input=[ UserInput( @@ -279,7 +279,7 @@ def test_responses_client_projects_typed_text_history_without_phase(): ], model="m", ) - ) + ).model_dump() assert body["input"] == [ { @@ -311,7 +311,7 @@ def test_responses_client_projects_typed_text_history_without_phase(): def test_responses_client_preserves_history_item_ids(): """Ensures reasoning item and assistant message identities survive projection.""" - body = OpenAIResponsesClient._request_body( + body = OpenAIResponsesClient._native_request( NormalizedRequest( input=[ Thinking(content="Prior thought", summary="", id="rs_123"), @@ -322,7 +322,7 @@ def test_responses_client_preserves_history_item_ids(): ], model="m", ) - ) + ).model_dump() assert body["input"][0]["id"] == "rs_123" assert body["input"][1]["id"] == "msg_123" @@ -355,9 +355,10 @@ def test_chat_completions_client_preserves_user_message_and_part_boundaries(): @pytest.mark.parametrize("summary", [None, "auto", "detailed"]) def test_chat_completions_client_maps_supported_reasoning_configuration(summary): - body = OpenAIChatCompletionsClient._request_body( + """Ensures supported reasoning controls reach the Chat request unchanged.""" + body = OpenAIChatCompletionsClient._native_request( NormalizedRequest(model="m", reasoning=Reasoning(effort="high", summary=summary)) - ) + ).model_dump() assert body["reasoning_effort"] == "high" @@ -391,11 +392,11 @@ def test_openai_clients_preserve_assistant_message_and_text_part_boundaries(empt ] ) - assert OpenAIChatCompletionsClient._request_body(request)["messages"] == [ + assert OpenAIChatCompletionsClient._native_request(request).model_dump()["messages"] == [ {"role": "assistant", "content": parts}, {"role": "assistant", "content": "Next"}, ] - assert OpenAIResponsesClient._request_body(request)["input"] == [ + assert OpenAIResponsesClient._native_request(request).model_dump()["input"] == [ { "type": "message", "role": "assistant", @@ -437,7 +438,7 @@ def test_chat_client_rejects_unrepresentable_order_within_assistant_message(cont request = NormalizedRequest(model="m", input=[AssistantInput(content=content)]) with pytest.raises(UnsupportedInput): - OpenAIChatCompletionsClient._request_body(request) + OpenAIChatCompletionsClient._native_request(request) def test_chat_client_preserves_adjacent_reasoning_only_assistant_messages(): @@ -451,7 +452,7 @@ def test_chat_client_preserves_adjacent_reasoning_only_assistant_messages(): ], ) - assert OpenAIChatCompletionsClient._request_body(request)["messages"] == [ + assert OpenAIChatCompletionsClient._native_request(request).model_dump()["messages"] == [ {"role": "assistant", "reasoning_content": "First"}, {"role": "assistant", "reasoning_content": "Second"}, {"role": "assistant", "content": "Answer"}, @@ -476,7 +477,7 @@ def test_responses_client_preserves_ordered_assistant_text_runs(): ], ) - items = OpenAIResponsesClient._request_body(request)["input"] + items = OpenAIResponsesClient._native_request(request).model_dump()["input"] assert [item["type"] for item in items] == [ "message", @@ -507,10 +508,11 @@ def test_responses_client_rejects_message_identity_on_mixed_assistant_content(pa ) with pytest.raises(UnsupportedInput, match="message ID"): - OpenAIResponsesClient._request_body(request) + OpenAIResponsesClient._native_request(request) def test_chat_completions_client_remaps_parallel_image_result_after_tool_messages(): + """Ensures deferred tool images follow all linked parallel tool results.""" request = NormalizedRequest( input=[ UserInput(content=[TextInput(content="Call all tools.")]), @@ -555,7 +557,7 @@ def test_chat_completions_client_remaps_parallel_image_result_after_tool_message ], model="m", ) - messages = OpenAIChatCompletionsClient._request_body(request)["messages"] + messages = OpenAIChatCompletionsClient._native_request(request).model_dump()["messages"] assert [message["role"] for message in messages] == [ "user", "assistant", @@ -740,7 +742,7 @@ def test_chat_completions_client_flushes_image_results_before_later_assistant_hi ], model="m", ) - messages = OpenAIChatCompletionsClient._request_body(request)["messages"] + messages = OpenAIChatCompletionsClient._native_request(request).model_dump()["messages"] assert [message["role"] for message in messages] == [ "user", "assistant", @@ -1070,8 +1072,8 @@ def test_openai_clients_project_function_tools_and_history(): tool_choice=FunctionToolChoice(name="lookup"), ) - responses = OpenAIResponsesClient._request_body(request) - chat = OpenAIChatCompletionsClient._request_body(request) + responses = OpenAIResponsesClient._native_request(request).model_dump() + chat = OpenAIChatCompletionsClient._native_request(request).model_dump() assert responses["input"] == [ { @@ -1148,6 +1150,7 @@ def test_openai_clients_project_function_tools_and_history(): [OpenAIResponsesClient, OpenAIChatCompletionsClient], ) def test_openai_clients_reject_failed_tool_results(client): + """Ensures OpenAI projections reject tool outcomes they cannot preserve.""" request = NormalizedRequest( input=[ ToolReturn( @@ -1160,7 +1163,7 @@ def test_openai_clients_reject_failed_tool_results(client): ) with pytest.raises(UnsupportedInput, match="cannot preserve non-successful"): - client._request_body(request) + client._native_request(request) @pytest.mark.parametrize( @@ -1184,8 +1187,8 @@ def test_openai_clients_project_prompt_cache_fields(prompt_cache, expected): request = NormalizedRequest(model="m", stream=True, prompt_cache=prompt_cache) for body in ( - OpenAIResponsesClient._request_body(request), - OpenAIChatCompletionsClient._request_body(request), + OpenAIResponsesClient._native_request(request).model_dump(), + OpenAIChatCompletionsClient._native_request(request).model_dump(), ): assert { field: body[field] for field in body if field.startswith("prompt_cache") @@ -1197,8 +1200,8 @@ def test_openai_clients_omit_unset_prompt_cache(): request = NormalizedRequest(model="m", stream=True) for body in ( - OpenAIResponsesClient._request_body(request), - OpenAIChatCompletionsClient._request_body(request), + OpenAIResponsesClient._native_request(request).model_dump(), + OpenAIChatCompletionsClient._native_request(request).model_dump(), ): assert not [field for field in body if field.startswith("prompt_cache")] @@ -1209,7 +1212,7 @@ def test_openai_clients_map_prompt_cache_ttl(ttl): request = NormalizedRequest(model="m", stream=True, prompt_cache=PromptCache(ttl=ttl)) for client in (OpenAIResponsesClient, OpenAIChatCompletionsClient): - body = client._request_body(request) + body = client._native_request(request).model_dump() assert body["prompt_cache_options"] == {"ttl": "30m"} assert "prompt_cache_retention" not in body @@ -1224,6 +1227,7 @@ def test_openai_clients_map_prompt_cache_ttl(ttl): def test_openai_clients_project_unmarked_instructions_as_text_parts( client, input_field, text_type ): + """Ensures unmarked instructions retain their ordered text-part shape.""" request = NormalizedRequest( model="m", input=[ @@ -1232,7 +1236,7 @@ def test_openai_clients_project_unmarked_instructions_as_text_parts( ], ) - body = client._request_body(request) + body = client._native_request(request).model_dump() assert body[input_field] == [ {"role": "developer", "content": [{"type": text_type, "text": text}]} @@ -1288,7 +1292,7 @@ def test_openai_clients_preserve_content_cache_breakpoints(client, input_field, ], ) - body = client._request_body(request) + body = client._native_request(request).model_dump() assert body[input_field] == [ { @@ -1347,7 +1351,7 @@ def test_openai_clients_map_breakpoint_lifetimes(client, ttl): ], ) - body = client._request_body(request) + body = client._native_request(request).model_dump() assert body["prompt_cache_options"] == {"mode": "explicit", "ttl": "30m"} assert body["prompt_cache_key"] == "turn-1" assert "prompt_cache_retention" not in body @@ -1368,7 +1372,7 @@ def test_openai_clients_preserve_tool_text_cache_breakpoint(): ], ) - assert OpenAIResponsesClient._request_body(request)["input"] == [ + assert OpenAIResponsesClient._native_request(request).model_dump()["input"] == [ { "type": "function_call_output", "call_id": "call_123", @@ -1382,7 +1386,7 @@ def test_openai_clients_preserve_tool_text_cache_breakpoint(): ], } ] - assert OpenAIChatCompletionsClient._request_body(request)["messages"] == [ + assert OpenAIChatCompletionsClient._native_request(request).model_dump()["messages"] == [ { "role": "tool", "tool_call_id": "call_123", @@ -1410,7 +1414,7 @@ def test_responses_client_preserves_tool_image_cache_breakpoint(): ], ) - assert OpenAIResponsesClient._request_body(request)["input"] == [ + assert OpenAIResponsesClient._native_request(request).model_dump()["input"] == [ { "type": "function_call_output", "call_id": "call_123", @@ -1438,7 +1442,7 @@ def test_responses_client_preserves_assistant_marker_and_history_id(item_id): ], ) - assert OpenAIResponsesClient._request_body(request)["input"] == [ + assert OpenAIResponsesClient._native_request(request).model_dump()["input"] == [ { **({"id": item_id} if item_id is not None else {}), "type": "message", @@ -1480,7 +1484,7 @@ def test_chat_client_rejects_cache_breakpoint_after_relocated_tool_image(marker_ with pytest.raises( UnsupportedInput, match="tool-result images must move past the marked part" ): - OpenAIChatCompletionsClient._request_body(request) + OpenAIChatCompletionsClient._native_request(request) @pytest.mark.parametrize( @@ -1523,8 +1527,9 @@ def test_chat_completions_client_rejects_unrepresentable_request_fields( normalized_request: NormalizedRequest, error: str, ): + """Ensures unsupported request semantics fail before Chat transport.""" with pytest.raises(UnsupportedInput, match=error): - OpenAIChatCompletionsClient._request_body(normalized_request) + OpenAIChatCompletionsClient._native_request(normalized_request) def test_chat_completions_client_ignores_responses_history_item_ids(): @@ -1552,9 +1557,10 @@ def request(item_id: str | None) -> NormalizedRequest: model="m", ) - assert OpenAIChatCompletionsClient._request_body( - request("responses_item_id") - ) == OpenAIChatCompletionsClient._request_body(request(None)) + assert ( + OpenAIChatCompletionsClient._native_request(request("responses_item_id")).model_dump() + == OpenAIChatCompletionsClient._native_request(request(None)).model_dump() + ) @pytest.mark.parametrize("termination_reason", ["content_filter", "max_output_tokens"]) @@ -2276,13 +2282,14 @@ async def stub_native_events( def test_responses_client_rejects_unsigned_summary_history() -> None: + """Ensures Responses rejects summaries without required opaque state.""" request = NormalizedRequest( input=[Thinking(content="", summary="Summary")], model="m", ) with pytest.raises(ValueError, match="summary requires a signature"): - OpenAIResponsesClient._request_body(request) + OpenAIResponsesClient._native_request(request) async def test_responses_events_preserve_reasoning_added_snapshot_and_deltas( diff --git a/tests/utils/test_test_utils.py b/tests/utils/test_test_utils.py index bf8f171..793d96f 100644 --- a/tests/utils/test_test_utils.py +++ b/tests/utils/test_test_utils.py @@ -1,10 +1,13 @@ from copy import deepcopy +from pathlib import Path from typing import Any +import httpx import pytest +from openai import AsyncOpenAI from pydantic import ValidationError -from molto.utils.io import dumps_sse +from molto.utils.io import dumps_sse, read_yaml from molto.utils.test import ( assert_contains_expected, reconstructable_anthropic_event, @@ -237,11 +240,14 @@ def _reconstructable(events: list[dict[str, Any]], body: dict[str, Any]) -> list def test_reconstructable_responses_event_preserves_reconstructable_fields(): + """Ensure generated metadata and absent/null incomplete details do not break parity.""" expected_events = _responses_events() expected_events[0]["item"]["phase"] = "final_answer" + expected_events[1]["response"]["incomplete_details"] = None expected_events[1]["response"]["output"][0]["phase"] = "final_answer" actual_events = deepcopy(expected_events) actual_events[0]["item"].pop("phase") + actual_events[1]["response"].pop("incomplete_details") actual_events[1]["response"]["output"][0].pop("phase") actual_events[0]["item"]["id"] = "msg_generated" actual_events[1]["response"].pop("background") @@ -258,9 +264,103 @@ def test_reconstructable_responses_event_preserves_reconstructable_fields(): def test_reconstructable_responses_event_validates_event_and_request(): + """Ensures malformed requests and incomplete events still raise SDK validation errors.""" event = _responses_events()[0] - with pytest.raises(ValidationError): - reconstructable_responses_event(dumps_sse({"type": "invalid"}), {}) + for invalid in ( + {"type": "invalid"}, + {"type": "response.incomplete"}, + {"type": "response.incomplete", "response": {"usage": {}}}, + ): + with pytest.raises(ValidationError): + reconstructable_responses_event(dumps_sse(invalid), {}) with pytest.raises(ValidationError): reconstructable_responses_event(dumps_sse(event), {"invalid": True}) + + +@pytest.fixture +async def incomplete_responses_event() -> tuple[dict[str, Any], dict[str, Any]]: + """Parse the recorded incomplete stream through the OpenAI SDK independently.""" + cassette = read_yaml( + Path(__file__).parents[1] + / "cassettes/errors/incomplete_response/openai-responses-stream-00.yaml" + ) + + def replay(request: httpx.Request) -> httpx.Response: + return httpx.Response( + cassette["response"]["status_code"], + headers={"content-type": "text/event-stream"}, + content="".join(cassette["response"]["sse"]), + ) + + body = cassette["request"]["body"] + async with AsyncOpenAI( + api_key="test-api-key", + http_client=httpx.AsyncClient(transport=httpx.MockTransport(replay)), + ) as sdk: + events = [event async for event in await sdk.responses.create(**body)] + assert events[-1].type == "response.incomplete" + return events[-1].model_dump(mode="json", exclude_unset=True), body + + +def test_reconstructable_responses_event_preserves_incomplete_result( + incomplete_responses_event: tuple[dict[str, Any], dict[str, Any]], +) -> None: + """Ensure incomplete SDK results retain their recorded status, output, and usage.""" + event, body = incomplete_responses_event + expected = event["response"] + actual = reconstructable_responses_event(dumps_sse(event), body) + + assert actual["type"] == "response.incomplete" + response = actual["response"] + assert response["status"] == expected["status"] == "incomplete" + assert ( + response["incomplete_details"] + == expected["incomplete_details"] + == {"reason": "max_output_tokens"} + ) + assert response["output"] == [ + {key: value for key, value in item.items() if key != "id"} for item in expected["output"] + ] + assert response["output"][0]["content"][0]["text"] + assert response["usage"] == expected["usage"] + + +def test_reconstructable_responses_event_requires_recorded_cache_write_count( + incomplete_responses_event: tuple[dict[str, Any], dict[str, Any]], +) -> None: + """Ensure comparison validation cannot invent a missing incomplete cache-write count.""" + event, body = deepcopy(incomplete_responses_event) + event["response"]["usage"]["input_tokens_details"].pop("cache_write_tokens", None) + with pytest.raises(ValidationError, match="cache_write_tokens"): + reconstructable_responses_event(dumps_sse(event), body) + + +@pytest.mark.parametrize( + "mutation", ["incomplete_reason", "status", "partial_text", "usage", "cache_usage"] +) +def test_reconstructable_responses_event_rejects_changed_incomplete_result( + incomplete_responses_event: tuple[dict[str, Any], dict[str, Any]], + mutation: str, +) -> None: + """Ensure an incorrect incomplete reason, partial result, or token count fails parity.""" + event, body = incomplete_responses_event + expected = reconstructable_responses_event(dumps_sse(event), body) + changed = deepcopy(event) + response = changed["response"] + if mutation == "incomplete_reason": + response["incomplete_details"]["reason"] = "content_filter" + elif mutation == "status": + response["status"] = "completed" + elif mutation == "partial_text": + response["output"][0]["content"][0]["text"] += " changed" + elif mutation == "cache_usage": + response["usage"]["input_tokens_details"]["cache_write_tokens"] += 1 + else: + response["usage"]["output_tokens"] += 1 + + with pytest.raises(AssertionError, match="Value mismatch"): + assert_contains_expected( + reconstructable_responses_event(dumps_sse(changed), body), + expected, + ) From 95c3a82bd274b7b7e669420c6024b2f95a0043de Mon Sep 17 00:00:00 2001 From: Amir Balwel Date: Thu, 5 Nov 2026 15:30:38 +0800 Subject: [PATCH 2/4] update Signed-off-by: Amir Balwel --- tests/cassette_discovery.py | 3 +- .../anthropic-messages-non_stream-00.yaml | 55 ++++ .../anthropic-messages-non_stream-01.yaml | 64 +++++ .../anthropic-messages-stream-00.yaml | 261 +++++++++++++++++ .../anthropic-messages-stream-01.yaml | 240 ++++++++++++++++ ...openai-chat_completions-non_stream-00.yaml | 60 ++++ ...openai-chat_completions-non_stream-01.yaml | 66 +++++ .../openai-chat_completions-stream-00.yaml | 180 ++++++++++++ .../openai-chat_completions-stream-01.yaml | 166 +++++++++++ .../openai-responses-non_stream-00.yaml | 107 +++++++ .../openai-responses-non_stream-01.yaml | 121 ++++++++ .../openai-responses-stream-00.yaml | 272 ++++++++++++++++++ .../openai-responses-stream-01.yaml | 259 +++++++++++++++++ .../sources/sampling_tests/README.md | 55 ++++ .../anthropic-messages-non_stream-00.yaml | 54 ++++ .../anthropic-messages-non_stream-01.yaml | 62 ++++ .../anthropic-messages-stream-00.yaml | 184 ++++++++++++ .../anthropic-messages-stream-01.yaml | 164 +++++++++++ ...openai-chat_completions-non_stream-00.yaml | 59 ++++ ...openai-chat_completions-non_stream-01.yaml | 65 +++++ .../openai-chat_completions-stream-00.yaml | 172 +++++++++++ .../openai-chat_completions-stream-01.yaml | 166 +++++++++++ .../openai-responses-non_stream-00.yaml | 107 +++++++ .../openai-responses-non_stream-01.yaml | 121 ++++++++ .../openai-responses-stream-00.yaml | 272 ++++++++++++++++++ .../openai-responses-stream-01.yaml | 259 +++++++++++++++++ .../tool_call_image_result_parallel/README.md | 19 -- tests/core/test_interface.py | 66 ++++- 28 files changed, 3652 insertions(+), 27 deletions(-) create mode 100644 tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-01.yaml create mode 100644 tests/cassettes/matched/sampling_tests/anthropic-messages-stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/anthropic-messages-stream-01.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-01.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-01.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-responses-non_stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-responses-non_stream-01.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-responses-stream-00.yaml create mode 100644 tests/cassettes/matched/sampling_tests/openai-responses-stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/README.md create mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml create mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml delete mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/README.md diff --git a/tests/cassette_discovery.py b/tests/cassette_discovery.py index c0e6b21..fb695d0 100644 --- a/tests/cassette_discovery.py +++ b/tests/cassette_discovery.py @@ -20,6 +20,7 @@ SCENARIO_PROTOCOLS = dict.fromkeys( ( "simple_text", + "sampling_tests", "reasoning_raw", "input_image_base64", "input_image_remote_url", @@ -220,7 +221,7 @@ def public_conversations(root: Path) -> tuple[Conversation, ...]: if ( root.name == "matched" and conversation.mode == "non_stream" - and scenario not in {"simple_text", "reasoning_encrypted"} + and scenario not in {"simple_text", "sampling_tests", "reasoning_encrypted"} ): raise ValueError( f"Unsupported matched response mode in {conversation.id}; add scenario assertions" diff --git a/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-00.yaml b/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-00.yaml new file mode 100644 index 0000000..183b972 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-00.yaml @@ -0,0 +1,55 @@ +filename: 2026-11-04-01a1a54a-e430-7692-8044-94760ee3744c +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '201' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e430-7692-8044-94760ee3744c +response: + body: + container: null + content: + - text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: text + diagnostics: null + id: resp_0ef734a7578a4ef0016aead3a59f3087d2a69ae11b0193eb5b + model: gpt-4.1-mini-2025-04-14 + role: assistant + stop_details: null + stop_reason: end_turn + stop_sequence: null + type: message + usage: + cache_creation: + ephemeral_1h_input_tokens: 0 + ephemeral_5m_input_tokens: 0 + cache_creation_input_tokens: 0 + cache_read_input_tokens: 0 + inference_geo: not_available + input_tokens: 16 + output_tokens: 18 + output_tokens_details: + thinking_tokens: 0 + service_tier: standard + speed: standard + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:51.152097+00:00' diff --git a/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-01.yaml b/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-01.yaml new file mode 100644 index 0000000..77fc4e4 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/anthropic-messages-non_stream-01.yaml @@ -0,0 +1,64 @@ +filename: 2026-11-04-01a1a54a-e75b-7210-a552-2701a09a4dda +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: + - text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: text + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '434' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e75b-7210-a552-2701a09a4dda +response: + body: + container: null + content: + - text: A forest is a dense collection of trees that provides habitat for countless + species. + type: text + diagnostics: null + id: resp_0ef734a7578a4ef0016aead3a67ddc87d28ea66b5473fca14f + model: gpt-4.1-mini-2025-04-14 + role: assistant + stop_details: null + stop_reason: end_turn + stop_sequence: null + type: message + usage: + cache_creation: + ephemeral_1h_input_tokens: 0 + ephemeral_5m_input_tokens: 0 + cache_creation_input_tokens: 0 + cache_read_input_tokens: 0 + inference_geo: not_available + input_tokens: 50 + output_tokens: 16 + output_tokens_details: + thinking_tokens: 0 + service_tier: standard + speed: standard + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:51.963734+00:00' diff --git a/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-00.yaml b/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-00.yaml new file mode 100644 index 0000000..0617b04 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-00.yaml @@ -0,0 +1,261 @@ +filename: 2026-11-04-01a1a54a-dc60-7eb3-a1b1-1247a919ce1e +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: true + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '200' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-dc60-7eb3-a1b1-1247a919ce1e +response: + headers: + cache-control: no-cache + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: message_start + + ' + - 'data: {"type":"message_start","message":{"model":"gpt-4.1-mini-2025-04-14","id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":0,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null}} + + ' + - ' + + ' + - 'event: content_block_start + + ' + - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } + + ' + - ' + + ' + - 'event: ping + + ' + - 'data: {"type": "ping"} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"The"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + ocean"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + covers"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + over"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + "}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"70"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"%"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + of"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + the"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + Earth''s"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + surface"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + and"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + is"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + vital"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + for"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + all"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + life"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"."}} + + ' + - ' + + ' + - 'event: content_block_stop + + ' + - 'data: {"type":"content_block_stop","index":0 } + + ' + - ' + + ' + - 'event: message_delta + + ' + - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":19,"output_tokens_details":{"thinking_tokens":0}}} + + ' + - ' + + ' + - 'event: message_stop + + ' + - 'data: {"type":"message_stop" } + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:49.152947+00:00' diff --git a/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-01.yaml b/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-01.yaml new file mode 100644 index 0000000..85b06b4 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/anthropic-messages-stream-01.yaml @@ -0,0 +1,240 @@ +filename: 2026-11-04-01a1a54a-e0e1-7933-89d1-713ae9de59c5 +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: + - text: The ocean covers over 70% of the Earth's surface and is vital for all + life. + type: text + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: true + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '446' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e0e1-7933-89d1-713ae9de59c5 +response: + headers: + cache-control: no-cache + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: message_start + + ' + - 'data: {"type":"message_start","message":{"model":"gpt-4.1-mini-2025-04-14","id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":51,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":0,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null}} + + ' + - ' + + ' + - 'event: content_block_start + + ' + - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } + + ' + - ' + + ' + - 'event: ping + + ' + - 'data: {"type": "ping"} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"A"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + forest"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + is"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + a"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + diverse"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + ecosystem"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + filled"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + with"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + trees"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + plants"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + and"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + wildlife"}} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"."}} + + ' + - ' + + ' + - 'event: content_block_stop + + ' + - 'data: {"type":"content_block_stop","index":0 } + + ' + - ' + + ' + - 'event: message_delta + + ' + - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null},"usage":{"input_tokens":51,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":16,"output_tokens_details":{"thinking_tokens":0}}} + + ' + - ' + + ' + - 'event: message_stop + + ' + - 'data: {"type":"message_stop" } + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:50.305694+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-00.yaml b/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-00.yaml new file mode 100644 index 0000000..08fc6ef --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-00.yaml @@ -0,0 +1,60 @@ +filename: 2026-11-04-01a1a54a-d074-7601-9520-8b31150f80ab +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '199' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-d074-7601-9520-8b31150f80ab +response: + body: + choices: + - finish_reason: stop + index: 0 + logprobs: null + message: + annotations: [] + content: The ocean covers over 70% of the Earth's surface and is vital for + life. + refusal: null + role: assistant + created: 1793774501 + id: resp_0ef734a7578a4ef0016aead3a59f3087d2a69ae11b0193eb5b + model: gpt-4.1-mini-2025-04-14 + object: chat.completion + service_tier: default + system_fingerprint: fp_678b85ce7d + usage: + completion_tokens: 18 + completion_tokens_details: + accepted_prediction_tokens: 0 + audio_tokens: 0 + reasoning_tokens: 0 + rejected_prediction_tokens: 0 + prompt_tokens: 16 + prompt_tokens_details: + audio_tokens: 0 + cache_write_tokens: 0 + cached_tokens: 0 + total_tokens: 34 + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:46.100496+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-01.yaml b/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-01.yaml new file mode 100644 index 0000000..53a305c --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-chat_completions-non_stream-01.yaml @@ -0,0 +1,66 @@ +filename: 2026-11-04-01a1a54a-d6bd-7542-ab14-f3f7ececf03d +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: The ocean covers over 70% of the Earth's surface and is vital for life. + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '397' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-d6bd-7542-ab14-f3f7ececf03d +response: + body: + choices: + - finish_reason: stop + index: 0 + logprobs: null + message: + annotations: [] + content: A forest is a dense collection of trees that provides habitat for + countless species. + refusal: null + role: assistant + created: 1793774502 + id: resp_0ef734a7578a4ef0016aead3a67ddc87d28ea66b5473fca14f + model: gpt-4.1-mini-2025-04-14 + object: chat.completion + service_tier: default + system_fingerprint: fp_6d6e47cc7e + usage: + completion_tokens: 16 + completion_tokens_details: + accepted_prediction_tokens: 0 + audio_tokens: 0 + reasoning_tokens: 0 + rejected_prediction_tokens: 0 + prompt_tokens: 50 + prompt_tokens_details: + audio_tokens: 0 + cache_write_tokens: 0 + cached_tokens: 0 + total_tokens: 66 + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:47.709625+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-00.yaml b/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-00.yaml new file mode 100644 index 0000000..eb09ed5 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-00.yaml @@ -0,0 +1,180 @@ +filename: 2026-11-04-01a1a54a-c4d8-7352-8024-2902b476983d +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: true + stream_options: + include_obfuscation: false + include_usage: true + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '238' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-c4d8-7352-8024-2902b476983d +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pN68gx0M"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vDkXpoA"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + ocean"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WCFb"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + covers"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XEr"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + over"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1v0VV"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QIuRj0M4i"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"70"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v4oepfJc"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"%"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9aIhv5Hzl"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1lvBbaV"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8PTmwX"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + Earth''s"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m9"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + surface"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gW"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"okEpXL"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jMvrpko"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + vital"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mMq9"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"G1kVDo"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + all"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vbYks"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + life"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2V4sSZywe"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2V4sSZywe"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"cZzF"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"chat.completion.chunk","created":1793774497,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[],"usage":{"prompt_tokens":16,"completion_tokens":19,"total_tokens":35,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"2WIvNFXWD"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:43.128681+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-01.yaml b/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-01.yaml new file mode 100644 index 0000000..ca0cbe6 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-chat_completions-stream-01.yaml @@ -0,0 +1,166 @@ +filename: 2026-11-04-01a1a54a-cc5a-7fd2-83e1-640629a20603 +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: The ocean covers over 70% of the Earth's surface and is vital for all + life. + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: true + stream_options: + include_obfuscation: false + include_usage: true + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '436' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-cc5a-7fd2-83e1-640629a20603 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ba7Y5xK5"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"A"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BiCaGIbJd"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + forest"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7XS"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sJ3AnVM"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3LM6vmD9"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + diverse"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FIAD"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + ecosystem"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aHxZNYfmR1PUCCE"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + filled"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YkTfN0R"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pcwc"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + trees"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CdpnH"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + plants"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AU"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dlu2bt"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + wildlife"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PW"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QLRfBOvrQ"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"1aKn"} + + ' + - ' + + ' + - 'data: {"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"chat.completion.chunk","created":1793774499,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[],"usage":{"prompt_tokens":51,"completion_tokens":16,"total_tokens":67,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"d69BBcUbw"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:45.050327+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-00.yaml b/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-00.yaml new file mode 100644 index 0000000..c059d07 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-00.yaml @@ -0,0 +1,107 @@ +filename: 2026-11-04-01a1a54a-be6b-7291-b427-6e6c407ceba7 +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '212' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-be6b-7291-b427-6e6c407ceba7 +response: + body: + access_programs: null + background: false + billing: + payer: developer + completed_at: 1793774502 + created_at: 1793774501 + error: null + frequency_penalty: 0.0 + id: resp_0ef734a7578a4ef0016aead3a59f3087d2a69ae11b0193eb5b + image: + context_compression: disabled + incomplete_details: null + instructions: null + max_output_tokens: 128 + max_tool_calls: null + metadata: {} + model: gpt-4.1-mini-2025-04-14 + moderation: null + object: response + output: + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: in_memory + reasoning: + context: null + effort: null + summary: null + safety_identifier: null + service_tier: default + status: completed + store: false + temperature: 0.45 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: [] + top_logprobs: 0 + top_p: 1.0 + truncation: disabled + usage: + input_tokens: 16 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 18 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 34 + user: null + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:41.483112+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-01.yaml b/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-01.yaml new file mode 100644 index 0000000..c7a809e --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-responses-non_stream-01.yaml @@ -0,0 +1,121 @@ +filename: 2026-11-04-01a1a54a-c179-7a83-87c3-d5886c219c5a +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 + role: assistant + status: completed + type: message + - content: + - text: Reply with one short sentence about a forest. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '579' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-c179-7a83-87c3-d5886c219c5a +response: + body: + access_programs: null + background: false + billing: + payer: developer + completed_at: 1793774502 + created_at: 1793774502 + error: null + frequency_penalty: 0.0 + id: resp_0ef734a7578a4ef0016aead3a67ddc87d28ea66b5473fca14f + image: + context_compression: disabled + incomplete_details: null + instructions: null + max_output_tokens: 128 + max_tool_calls: null + metadata: {} + model: gpt-4.1-mini-2025-04-14 + moderation: null + object: response + output: + - content: + - annotations: [] + logprobs: [] + text: A forest is a dense collection of trees that provides habitat for countless + species. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a6d57487d2b1b2c2c11d752804 + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: in_memory + reasoning: + context: null + effort: null + summary: null + safety_identifier: null + service_tier: default + status: completed + store: false + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: [] + top_logprobs: 0 + top_p: 0.55 + truncation: disabled + usage: + input_tokens: 50 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 16 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 66 + user: null + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:42.265159+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-responses-stream-00.yaml b/tests/cassettes/matched/sampling_tests/openai-responses-stream-00.yaml new file mode 100644 index 0000000..37a290c --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-responses-stream-00.yaml @@ -0,0 +1,272 @@ +filename: 2026-11-04-01a1a54a-aa00-71b2-a1ed-18e6ca939e16 +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: true + stream_options: + include_obfuscation: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '258' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-aa00-71b2-a1ed-18e6ca939e16 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ocean","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" covers","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" over","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"70","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"%","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Earth''s","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" surface","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" vital","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" all","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" life","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":22,"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."},"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"},"output_index":0,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"completed","access_programs":null,"background":false,"completed_at":1793774498,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":16,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":19,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":35},"user":null,"metadata":{}},"sequence_number":25} + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:36.256290+00:00' diff --git a/tests/cassettes/matched/sampling_tests/openai-responses-stream-01.yaml b/tests/cassettes/matched/sampling_tests/openai-responses-stream-01.yaml new file mode 100644 index 0000000..accabf3 --- /dev/null +++ b/tests/cassettes/matched/sampling_tests/openai-responses-stream-01.yaml @@ -0,0 +1,259 @@ +filename: 2026-11-04-01a1a54a-b593-7321-ac9c-fa920c9c1d4a +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for all + life. + type: output_text + id: msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed + role: assistant + status: completed + type: message + - content: + - text: Reply with one short sentence about a forest. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: true + stream_options: + include_obfuscation: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '629' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-b593-7321-ac9c-fa920c9c1d4a +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"A","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" forest","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" diverse","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ecosystem","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" filled","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" trees","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" plants","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" wildlife","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":19,"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."},"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"},"output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"completed","access_programs":null,"background":false,"completed_at":1793774501,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":{"input_tokens":51,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":67},"user":null,"metadata":{}},"sequence_number":22} + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:39.219537+00:00' diff --git a/tests/cassettes/sources/sampling_tests/README.md b/tests/cassettes/sources/sampling_tests/README.md new file mode 100644 index 0000000..b010ab9 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/README.md @@ -0,0 +1,55 @@ +# Sampling source recordings + +These 12 unchanged sanitized recordings were captured on November 4, 2026 from the official OpenAI and Anthropic APIs. They replace the archived model-settings references with focused sampling evidence compatible with the repository's pinned SDKs. + +| Provider | Protocol | Requested model | SDK / API version | +| --------- | ------------------------------ | --------------------------- | ----------------------------------------------------------- | +| OpenAI | Responses and Chat Completions | `gpt-4.1-mini` | OpenAI Python `2.53.0` | +| Anthropic | Messages | `claude-haiku-4-5-20251001` | Anthropic Python `0.121.0`, `anthropic-version: 2023-06-01` | + +Source hosts are `https://api.openai.com` and `https://api.anthropic.com`. The Anthropic API version is explicit in the recording driver and matches the pinned SDK's default. The recorder's existing header whitelist does not retain that header. Sampling parameters are removed in Anthropic API version `2026-10-21`; these recordings establish acceptance on the documented older version with Haiku 4.5, not on every model or API version. See [Anthropic's parameter deprecation guidance](https://platform.claude.com/docs/en/about-claude/model-deprecations#api-parameter-deprecations). + +## Scenario + +Each protocol has independent SSE and JSON conversations, each with two genuine turns: + +| Turn | Prompt | Sampling controls | +| ---- | ------------------------------------------------ | ----------------------------------- | +| 00 | `Reply with one short sentence about the ocean.` | `temperature: 0.45`; `top_p` absent | +| 01 | `Reply with one short sentence about a forest.` | `top_p: 0.55`; `temperature` absent | + +Turn 01 carries the actual assistant output returned in turn 00. Responses retains native output items; Chat uses the SDK message without local parser properties or empty annotations; Messages retains the returned text blocks. Neither sampling control is inherited from a previous request. The generated answers can differ between protocols and wire modes. + +All requests use an output-token limit of 128, expressed as `max_output_tokens`, `max_completion_tokens`, or `max_tokens`. There are no tools, reasoning options, or structured-output settings. Responses sets `store: false` and disables streaming obfuscation. Chat streaming requests enable usage reporting. Anthropic thinking is omitted so the selected model uses ordinary text generation. + +## Recording and validation + +A standalone SDK driver loaded the two credentials explicitly from the repository root `.env` and called `scripts/recorder_proxy.py` through `httpx.ASGITransport`. The proxy's HTTP client made the live requests to the official hosts. This ran outside pytest. Credentials were never printed; authorization was masked and the existing recorder whitelist excluded Anthropic's API-key header. + +Every request returned HTTP 200 and completed normally. Validation checked: + +- Exact recorded request bodies, sampling values, and absence of the unused control. +- All raw SSE events and JSON responses against the pinned native SDK schemas, without added fields or coercions. +- Normal termination, positive input/output token usage, and actual assistant-history continuation. +- Credential masking and absence of both configured credentials from every recording. +- Native Molto output against SDK-parsed events or responses for all six conversations, using offline mock transports and exact outgoing request assertions. +- SHA-256 hashes before and after replay, confirming that validation did not change any original. + +The recorder-generated files were renamed without changing their bytes. No provider response field, usage count, text, identifier, or chunk boundary was synthesized. These originals are source-only and do not automatically join generic route discovery. Review and commit them before preparing separate matched companions under the [cassette workflow](../../README.md#specifications-and-tooling). + +## Original hashes + +| File | SHA-256 | +| -------------------------------------------- | ------------------------------------------------------------------ | +| `openai-responses-stream-00.yaml` | `8a8f054c9635a555427233b9f9b1d4369782509d2ed6a56af4536764727e3ee7` | +| `openai-responses-stream-01.yaml` | `5a3b8fb67ae4718b629b6e7928056a412bfe1dd52e3aae5feb78ca195ab9076f` | +| `openai-responses-non_stream-00.yaml` | `6e472bcafd07d7c81f4d80d92652f5c009c5745d5053a6ed8589ec6d6c0f610b` | +| `openai-responses-non_stream-01.yaml` | `7f331d43dbed310e23595180aec59b5edf7fdad2790270258699719143fcf0c3` | +| `openai-chat_completions-stream-00.yaml` | `ce772c820f17e93e2742fd9073ad84834b4a67c07936e6b4619d7c0deaa96383` | +| `openai-chat_completions-stream-01.yaml` | `d3ebf013922f125bee0a059392fc6f3bda104a0967d41cfeed1cc889bdaa55cc` | +| `openai-chat_completions-non_stream-00.yaml` | `603eeb95ef052fd9e8dbb12ec6e37d376bbe057eb3a839279292fedcafc2fb6f` | +| `openai-chat_completions-non_stream-01.yaml` | `91bfc7ec8e14c3d2eae02d2da8c8f018107452ccd2df429028fe576c14e568b4` | +| `anthropic-messages-stream-00.yaml` | `76c1fdc8851108132cff36fdd8379f9843e1c3e7d5bfec6a4e4ffcca0d496fd9` | +| `anthropic-messages-stream-01.yaml` | `1521cfaf5ce2560b69a590ac9d9f15ef15f13027f6b94b4e04f3337c7e2f3198` | +| `anthropic-messages-non_stream-00.yaml` | `dd154ee49b9aa880c625cecc07a2a64a33f460e67989d848797aee6ac2793544` | +| `anthropic-messages-non_stream-01.yaml` | `4fc570765f2fd633ab48d90f7708b0e6fbdb102879fa38e073b9f1a9605a5b29` | diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml new file mode 100644 index 0000000..cfe6a40 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml @@ -0,0 +1,54 @@ +filename: 2026-11-04-01a1a54a-e430-7692-8044-94760ee3744c +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: claude-haiku-4-5-20251001 + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '201' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e430-7692-8044-94760ee3744c +response: + body: + container: null + content: + - text: The ocean covers more than 70% of Earth's surface and remains largely + unexplored. + type: text + diagnostics: null + id: msg_011CghS2cKxM4b3KPCTQghei + model: claude-haiku-4-5-20251001 + role: assistant + stop_details: null + stop_reason: end_turn + stop_sequence: null + type: message + usage: + cache_creation: + ephemeral_1h_input_tokens: 0 + ephemeral_5m_input_tokens: 0 + cache_creation_input_tokens: 0 + cache_read_input_tokens: 0 + inference_geo: not_available + input_tokens: 16 + output_tokens: 22 + service_tier: standard + speed: standard + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:51.152097+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml new file mode 100644 index 0000000..509a91a --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml @@ -0,0 +1,62 @@ +filename: 2026-11-04-01a1a54a-e75b-7210-a552-2701a09a4dda +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: + - text: The ocean covers more than 70% of Earth's surface and remains largely + unexplored. + type: text + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: claude-haiku-4-5-20251001 + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '434' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e75b-7210-a552-2701a09a4dda +response: + body: + container: null + content: + - text: Forests are home to about 80% of the world's land animals and plants. + type: text + diagnostics: null + id: msg_011CghS2fjM8uS899xmeqAWd + model: claude-haiku-4-5-20251001 + role: assistant + stop_details: null + stop_reason: end_turn + stop_sequence: null + type: message + usage: + cache_creation: + ephemeral_1h_input_tokens: 0 + ephemeral_5m_input_tokens: 0 + cache_creation_input_tokens: 0 + cache_read_input_tokens: 0 + inference_geo: not_available + input_tokens: 50 + output_tokens: 21 + service_tier: standard + speed: standard + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:51.963734+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml new file mode 100644 index 0000000..d33cb6c --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml @@ -0,0 +1,184 @@ +filename: 2026-11-04-01a1a54a-dc60-7eb3-a1b1-1247a919ce1e +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: claude-haiku-4-5-20251001 + stream: true + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '200' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-dc60-7eb3-a1b1-1247a919ce1e +response: + headers: + cache-control: no-cache + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: message_start + + ' + - 'data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CghS2UUftkJqUAKoS3GMK","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null} } + + ' + - ' + + ' + - 'event: content_block_start + + ' + - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } + + ' + - ' + + ' + - 'event: ping + + ' + - 'data: {"type": "ping"} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"The + ocean covers"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + most"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + of Earth''s surface"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + and contains"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + countless"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + species"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + we"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"''ve"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + yet"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + to discover."} } + + ' + - ' + + ' + - 'event: content_block_stop + + ' + - 'data: {"type":"content_block_stop","index":0 } + + ' + - ' + + ' + - 'event: message_delta + + ' + - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":21} } + + ' + - ' + + ' + - 'event: message_stop + + ' + - 'data: {"type":"message_stop" } + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:49.152947+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml new file mode 100644 index 0000000..73bd0aa --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml @@ -0,0 +1,164 @@ +filename: 2026-11-04-01a1a54a-e0e1-7933-89d1-713ae9de59c5 +request: + body: + max_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: + - text: The ocean covers most of Earth's surface and contains countless species + we've yet to discover. + type: text + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: claude-haiku-4-5-20251001 + stream: true + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + connection: keep-alive + content-length: '446' + content-type: application/json + user-agent: AsyncAnthropic/Python 0.121.0 + method: POST + path: /v1/messages + query_params: {} +request_id: 01a1a54a-e0e1-7933-89d1-713ae9de59c5 +response: + headers: + cache-control: no-cache + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: message_start + + ' + - 'data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CghS2YjejcCgTx4yTpbbR","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":49,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null} } + + ' + - ' + + ' + - 'event: content_block_start + + ' + - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } + + ' + - ' + + ' + - 'event: ping + + ' + - 'data: {"type": "ping"} + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Forests + are vital ecos"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ystems + that produce"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + oxygen, store"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + carbon, and provide"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + homes"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + for millions"} } + + ' + - ' + + ' + - 'event: content_block_delta + + ' + - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + of species."} } + + ' + - ' + + ' + - 'event: content_block_stop + + ' + - 'data: {"type":"content_block_stop","index":0 } + + ' + - ' + + ' + - 'event: message_delta + + ' + - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":49,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":24} } + + ' + - ' + + ' + - 'event: message_stop + + ' + - 'data: {"type":"message_stop" } + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:50.305694+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml new file mode 100644 index 0000000..9f0de17 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml @@ -0,0 +1,59 @@ +filename: 2026-11-04-01a1a54a-d074-7601-9520-8b31150f80ab +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '199' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-d074-7601-9520-8b31150f80ab +response: + body: + choices: + - finish_reason: stop + index: 0 + logprobs: null + message: + annotations: [] + content: The ocean covers over 70% of the Earth's surface and is vital for + life. + refusal: null + role: assistant + created: 1793774507 + id: chatcmpl-EgOyp33YmHEWaAiOaH6Go29rrJT1k + model: gpt-4.1-mini-2025-04-14 + object: chat.completion + service_tier: default + system_fingerprint: fp_678b85ce7d + usage: + completion_tokens: 17 + completion_tokens_details: + accepted_prediction_tokens: 0 + audio_tokens: 0 + reasoning_tokens: 0 + rejected_prediction_tokens: 0 + prompt_tokens: 16 + prompt_tokens_details: + audio_tokens: 0 + cached_tokens: 0 + total_tokens: 33 + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:46.100496+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml new file mode 100644 index 0000000..36da14c --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml @@ -0,0 +1,65 @@ +filename: 2026-11-04-01a1a54a-d6bd-7542-ab14-f3f7ececf03d +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: The ocean covers over 70% of the Earth's surface and is vital for life. + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '397' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-d6bd-7542-ab14-f3f7ececf03d +response: + body: + choices: + - finish_reason: stop + index: 0 + logprobs: null + message: + annotations: [] + content: A forest is a dense collection of trees that provides habitat for + countless species. + refusal: null + role: assistant + created: 1793774508 + id: chatcmpl-EgOyqZXfukrRSSnKIF2AacXmKUryN + model: gpt-4.1-mini-2025-04-14 + object: chat.completion + service_tier: default + system_fingerprint: fp_6d6e47cc7e + usage: + completion_tokens: 15 + completion_tokens_details: + accepted_prediction_tokens: 0 + audio_tokens: 0 + reasoning_tokens: 0 + rejected_prediction_tokens: 0 + prompt_tokens: 50 + prompt_tokens_details: + audio_tokens: 0 + cached_tokens: 0 + total_tokens: 65 + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:47.709625+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml new file mode 100644 index 0000000..2310a01 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml @@ -0,0 +1,172 @@ +filename: 2026-11-04-01a1a54a-c4d8-7352-8024-2902b476983d +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + model: gpt-4.1-mini + stream: true + stream_options: + include_usage: true + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '238' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-c4d8-7352-8024-2902b476983d +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pN68gx0M"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vDkXpoA"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + ocean"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WCFb"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + covers"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XEr"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + over"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1v0VV"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QIuRj0M4i"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"70"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v4oepfJc"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"%"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9aIhv5Hzl"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1lvBbaV"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8PTmwX"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + Earth''s"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m9"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + surface"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gW"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"okEpXL"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jMvrpko"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + vital"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mMq9"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"G1kVDo"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" + life"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vbYks"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2V4sSZywe"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"cZzF"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[],"usage":{"prompt_tokens":16,"completion_tokens":17,"total_tokens":33,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"2WIvNFXWD"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:43.128681+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml new file mode 100644 index 0000000..d0577e9 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml @@ -0,0 +1,166 @@ +filename: 2026-11-04-01a1a54a-cc5a-7fd2-83e1-640629a20603 +request: + body: + max_completion_tokens: 128 + messages: + - content: + - text: Reply with one short sentence about the ocean. + type: text + role: user + - content: The ocean covers over 70% of the Earth's surface and is vital for life. + role: assistant + - content: + - text: Reply with one short sentence about a forest. + type: text + role: user + model: gpt-4.1-mini + stream: true + stream_options: + include_usage: true + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '436' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/chat/completions + query_params: {} +request_id: 01a1a54a-cc5a-7fd2-83e1-640629a20603 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ba7Y5xK5"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"A"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BiCaGIbJd"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + forest"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7XS"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sJ3AnVM"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3LM6vmD9"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + dense"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FIAD"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + collection"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aHxZNYfmR1PUCCE"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YkTfN0R"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + trees"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pcwc"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + that"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CdpnH"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + provides"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + habitat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AU"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dlu2bt"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + countless"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" + species"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PW"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QLRfBOvrQ"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"1aKn"} + + ' + - ' + + ' + - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[],"usage":{"prompt_tokens":50,"completion_tokens":15,"total_tokens":65,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"d69BBcUbw"} + + ' + - ' + + ' + - 'data: [DONE] + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:45.050327+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml new file mode 100644 index 0000000..c059d07 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml @@ -0,0 +1,107 @@ +filename: 2026-11-04-01a1a54a-be6b-7291-b427-6e6c407ceba7 +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '212' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-be6b-7291-b427-6e6c407ceba7 +response: + body: + access_programs: null + background: false + billing: + payer: developer + completed_at: 1793774502 + created_at: 1793774501 + error: null + frequency_penalty: 0.0 + id: resp_0ef734a7578a4ef0016aead3a59f3087d2a69ae11b0193eb5b + image: + context_compression: disabled + incomplete_details: null + instructions: null + max_output_tokens: 128 + max_tool_calls: null + metadata: {} + model: gpt-4.1-mini-2025-04-14 + moderation: null + object: response + output: + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: in_memory + reasoning: + context: null + effort: null + summary: null + safety_identifier: null + service_tier: default + status: completed + store: false + temperature: 0.45 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: [] + top_logprobs: 0 + top_p: 1.0 + truncation: disabled + usage: + input_tokens: 16 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 18 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 34 + user: null + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:41.483112+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml new file mode 100644 index 0000000..c7a809e --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml @@ -0,0 +1,121 @@ +filename: 2026-11-04-01a1a54a-c179-7a83-87c3-d5886c219c5a +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for life. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 + role: assistant + status: completed + type: message + - content: + - text: Reply with one short sentence about a forest. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '579' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-c179-7a83-87c3-d5886c219c5a +response: + body: + access_programs: null + background: false + billing: + payer: developer + completed_at: 1793774502 + created_at: 1793774502 + error: null + frequency_penalty: 0.0 + id: resp_0ef734a7578a4ef0016aead3a67ddc87d28ea66b5473fca14f + image: + context_compression: disabled + incomplete_details: null + instructions: null + max_output_tokens: 128 + max_tool_calls: null + metadata: {} + model: gpt-4.1-mini-2025-04-14 + moderation: null + object: response + output: + - content: + - annotations: [] + logprobs: [] + text: A forest is a dense collection of trees that provides habitat for countless + species. + type: output_text + id: msg_0ef734a7578a4ef0016aead3a6d57487d2b1b2c2c11d752804 + role: assistant + status: completed + type: message + parallel_tool_calls: true + presence_penalty: 0.0 + previous_response_id: null + prompt_cache_key: null + prompt_cache_retention: in_memory + reasoning: + context: null + effort: null + summary: null + safety_identifier: null + service_tier: default + status: completed + store: false + temperature: 1.0 + text: + format: + type: text + verbosity: medium + tool_choice: auto + tool_usage: + image_gen: + input_tokens: 0 + input_tokens_details: + image_tokens: 0 + text_tokens: 0 + output_tokens: 0 + output_tokens_details: + image_tokens: 0 + text_tokens: 0 + total_tokens: 0 + web_search: + num_requests: 0 + tools: [] + top_logprobs: 0 + top_p: 0.55 + truncation: disabled + usage: + input_tokens: 50 + input_tokens_details: + cache_write_tokens: 0 + cached_tokens: 0 + output_tokens: 16 + output_tokens_details: + reasoning_tokens: 0 + total_tokens: 66 + user: null + headers: + connection: keep-alive + content-type: application/json + status_code: 200 +timestamp: '2026-11-04T06:41:42.265159+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml new file mode 100644 index 0000000..37a290c --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml @@ -0,0 +1,272 @@ +filename: 2026-11-04-01a1a54a-aa00-71b2-a1ed-18e6ca939e16 +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: true + stream_options: + include_obfuscation: false + temperature: 0.45 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '258' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-aa00-71b2-a1ed-18e6ca939e16 +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ocean","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" covers","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" over","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"70","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"%","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Earth''s","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" surface","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" vital","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" all","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":19} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" life","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":22,"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."},"sequence_number":23} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"},"output_index":0,"sequence_number":24} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"completed","access_programs":null,"background":false,"completed_at":1793774498,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The + ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":16,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":19,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":35},"user":null,"metadata":{}},"sequence_number":25} + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:36.256290+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml new file mode 100644 index 0000000..accabf3 --- /dev/null +++ b/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml @@ -0,0 +1,259 @@ +filename: 2026-11-04-01a1a54a-b593-7321-ac9c-fa920c9c1d4a +request: + body: + input: + - content: + - text: Reply with one short sentence about the ocean. + type: input_text + role: user + - content: + - annotations: [] + logprobs: [] + text: The ocean covers over 70% of the Earth's surface and is vital for all + life. + type: output_text + id: msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed + role: assistant + status: completed + type: message + - content: + - text: Reply with one short sentence about a forest. + type: input_text + role: user + max_output_tokens: 128 + model: gpt-4.1-mini + store: false + stream: true + stream_options: + include_obfuscation: false + top_p: 0.55 + headers: + accept: application/json + accept-encoding: gzip, deflate + authorization: Bearer *** + connection: keep-alive + content-length: '629' + content-type: application/json + user-agent: AsyncOpenAI/Python 2.53.0 + method: POST + path: /v1/responses + query_params: {} +request_id: 01a1a54a-b593-7321-ac9c-fa920c9c1d4a +response: + headers: + connection: keep-alive + content-type: text/event-stream; charset=utf-8 + sse: + - 'event: response.created + + ' + - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} + + ' + - ' + + ' + - 'event: response.in_progress + + ' + - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} + + ' + - ' + + ' + - 'event: response.output_item.added + + ' + - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} + + ' + - ' + + ' + - 'event: response.content_part.added + + ' + - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"A","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":4} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" forest","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":5} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":6} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":7} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" diverse","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":8} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ecosystem","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":9} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" filled","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":10} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":11} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" trees","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":12} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":13} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" plants","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":14} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":15} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":16} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" wildlife","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":17} + + ' + - ' + + ' + - 'event: response.output_text.delta + + ' + - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":18} + + ' + - ' + + ' + - 'event: response.output_text.done + + ' + - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":19,"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."} + + ' + - ' + + ' + - 'event: response.content_part.done + + ' + - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."},"sequence_number":20} + + ' + - ' + + ' + - 'event: response.output_item.done + + ' + - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"},"output_index":0,"sequence_number":21} + + ' + - ' + + ' + - 'event: response.completed + + ' + - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"completed","access_programs":null,"background":false,"completed_at":1793774501,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A + forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":{"input_tokens":51,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":67},"user":null,"metadata":{}},"sequence_number":22} + + ' + - ' + + ' + status_code: 200 +timestamp: '2026-11-04T06:41:39.219537+00:00' diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/README.md b/tests/cassettes/sources/tool_call_image_result_parallel/README.md deleted file mode 100644 index ea7e463..0000000 --- a/tests/cassettes/sources/tool_call_image_result_parallel/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Chat image tool-result recording - -These two files are faithful, sanitized recordings from the official OpenAI Chat Completions API at `https://api.openai.com/v1/chat/completions`. They were recorded on November 3, 2026, outside pytest, using `scripts/recorder_proxy.py` with an in-process `httpx.ASGITransport` driver. The recorder's HTTP client made the live requests. The developer authorized the recording and use of the repository's `.env` credentials; credentials are not included in these files. - -The requested model was `gpt-4.1-mini`; the provider returned `gpt-4.1-mini-2025-04-14`. Both requests stream with `max_completion_tokens: 4096`, usage reporting, and parallel tool calls enabled. OpenAI SDK 2.53.0 parsed the streams. No response fields, tool IDs, timestamps, model names, usage counts, or chunk boundaries were matched to another protocol. - -- `openai-chat_completions-stream-00.yaml` asks for `read_image('a.png')` and `read_image('b.png')` in parallel. It returns two calls, 15 chunks, and `finish_reason: tool_calls`. -- `openai-chat_completions-stream-01.yaml` carries the actual SDK-collected assistant calls. Both text-only tool messages precede the labeled image user messages, which reuse the image data from the existing Responses scenario. The final user asks what the logos are. The response has 36 chunks, no further calls, and `finish_reason: stop`. - -Chat tool messages cannot contain images. This source demonstrates the supported relocation shape: `assistant, tool A, tool B, user image A, user image B, user question`. Portable call IDs remain linked to their tool results and image labels. It establishes acceptance of these exact requests by the recorded OpenAI model; it does not establish acceptance by other providers or models. - -Both streams include one usage chunk and a final `[DONE]` marker. The recorder masks authorization and retains only its configured header whitelist. Recorded `content-length` values describe the original transport and are not recalculated after sanitization. - -The originals are retained separately from deliberately matched fixtures. Matching must operate on companions after the originals have been reviewed and committed. - -| Original | SHA-256 | -| ---------------------------------------- | ------------------------------------------------------------------ | -| `openai-chat_completions-stream-00.yaml` | `1776fa3d366845fa964be447c8d13d1d63d2d67f79be990a581a50b369457e89` | -| `openai-chat_completions-stream-01.yaml` | `9a0ff0d4af27e3d6f7c18f8c3516dcabca10bd94f8cd3e67ab08bbf12692f2a6` | diff --git a/tests/core/test_interface.py b/tests/core/test_interface.py index 3a8ac85..c926515 100644 --- a/tests/core/test_interface.py +++ b/tests/core/test_interface.py @@ -150,7 +150,13 @@ def _default_case( conversation for conversation in MATCHED_CONVERSATIONS if conversation.scenario - in {"simple_text", "tool_call", "tool_call_image_result_parallel", *PROMPT_CACHE_SCENARIOS} + in { + "simple_text", + "sampling_tests", + "tool_call", + "tool_call_image_result_parallel", + *PROMPT_CACHE_SCENARIOS, + } or conversation.mode == "non_stream" ), *NATIVE_CONVERSATIONS, @@ -2401,12 +2407,20 @@ async def _assert_request_parity( expected_additions: dict[str, Any], *, provider: Provider | None = None, + stream: bool = True, ) -> None: - """Assert the outgoing request and parity with parsed downstream SDK events.""" - downstream_path = _simple_text_cassette(downstream) - upstream_path = _simple_text_cassette(upstream) - body = deepcopy(_read_cassette(downstream_path)["request"]["body"]) | additions + """Assert the outgoing request and parity with independently parsed SDK output.""" + mode = "stream" if stream or downstream != upstream else "non_stream" + downstream_path = _matched_cassette_path("simple_text", downstream, f"{mode}-00.yaml") + upstream_path = _matched_cassette_path("simple_text", upstream, f"{mode}-00.yaml") + body = ( + deepcopy(_read_cassette(downstream_path)["request"]["body"]) + | additions + | {"stream": stream} + ) expected_body = deepcopy(_read_cassette(upstream_path)["request"]["body"]) | expected_additions + if downstream == upstream: + expected_body["stream"] = stream async with _get_http_client( [upstream_path], @@ -2414,13 +2428,24 @@ async def _assert_request_parity( translated=downstream != upstream, expected_body=expected_body, ) as http_client: - stream = await _coordinator(Molto(http_client=http_client), downstream)( + result = await _coordinator(Molto(http_client=http_client), downstream)( body=body, endpoint=upstream, provider=provider or _provider_from_cassette_path(upstream_path), api_key="test-api-key", ) - events = [event async for event in stream] + if stream: + events = [event async for event in result] + + if not stream: + _assert_matched_response( + result, + downstream, + _completed_responses_body( + _matched_cassette_path("simple_text", "responses", f"{mode}-00.yaml") + ), + ) + return # Reuse the recorded response without rewriting fixtures: these tests exercise # request projection and stream fidelity, not the provider's acceptance of the modified input. @@ -2480,6 +2505,33 @@ async def _assert_request_parity( assert actual == expected +@pytest.mark.parametrize(("downstream", "upstream"), ROUTES) +@pytest.mark.parametrize("stream", [False, True], ids=["non_stream", "stream"]) +@pytest.mark.parametrize( + "controls", + [ + {"temperature": 0.45}, + {"top_p": 0.55}, + {"temperature": 0.0}, + {"top_p": 0.0}, + {}, + {"temperature": None, "top_p": None}, + ], + ids=["temperature", "top_p", "zero_temperature", "zero_top_p", "omitted", "explicit_none"], +) +async def test_sampling_controls_preserve_public_request_and_sdk_output( + downstream: Protocol, upstream: Protocol, stream: bool, controls: dict[str, float | None] +) -> None: + """Ensures sampling values and omissions survive every route and downstream response mode.""" + await _assert_request_parity( + downstream, + upstream, + controls, + {key: value for key, value in controls.items() if value is not None}, + stream=stream, + ) + + async def _assert_prompt_cache_rejected( downstream: Protocol, upstream: Protocol, From 177333cf4411a168d74e1bd9dab0f71b016112a8 Mon Sep 17 00:00:00 2001 From: Amir Balwel Date: Thu, 5 Nov 2026 16:43:47 +0800 Subject: [PATCH 3/4] removed sources Signed-off-by: Amir Balwel --- .../sources/sampling_tests/README.md | 55 --- .../anthropic-messages-non_stream-00.yaml | 54 --- .../anthropic-messages-non_stream-01.yaml | 62 ---- .../anthropic-messages-stream-00.yaml | 184 ---------- .../anthropic-messages-stream-01.yaml | 164 --------- ...openai-chat_completions-non_stream-00.yaml | 59 --- ...openai-chat_completions-non_stream-01.yaml | 65 ---- .../openai-chat_completions-stream-00.yaml | 172 --------- .../openai-chat_completions-stream-01.yaml | 166 --------- .../openai-responses-non_stream-00.yaml | 107 ------ .../openai-responses-non_stream-01.yaml | 121 ------- .../openai-responses-stream-00.yaml | 272 -------------- .../openai-responses-stream-01.yaml | 259 -------------- .../openai-chat_completions-stream-00.yaml | 146 -------- .../openai-chat_completions-stream-01.yaml | 336 ------------------ 15 files changed, 2222 deletions(-) delete mode 100644 tests/cassettes/sources/sampling_tests/README.md delete mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml delete mode 100644 tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml delete mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml delete mode 100644 tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml diff --git a/tests/cassettes/sources/sampling_tests/README.md b/tests/cassettes/sources/sampling_tests/README.md deleted file mode 100644 index b010ab9..0000000 --- a/tests/cassettes/sources/sampling_tests/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Sampling source recordings - -These 12 unchanged sanitized recordings were captured on November 4, 2026 from the official OpenAI and Anthropic APIs. They replace the archived model-settings references with focused sampling evidence compatible with the repository's pinned SDKs. - -| Provider | Protocol | Requested model | SDK / API version | -| --------- | ------------------------------ | --------------------------- | ----------------------------------------------------------- | -| OpenAI | Responses and Chat Completions | `gpt-4.1-mini` | OpenAI Python `2.53.0` | -| Anthropic | Messages | `claude-haiku-4-5-20251001` | Anthropic Python `0.121.0`, `anthropic-version: 2023-06-01` | - -Source hosts are `https://api.openai.com` and `https://api.anthropic.com`. The Anthropic API version is explicit in the recording driver and matches the pinned SDK's default. The recorder's existing header whitelist does not retain that header. Sampling parameters are removed in Anthropic API version `2026-10-21`; these recordings establish acceptance on the documented older version with Haiku 4.5, not on every model or API version. See [Anthropic's parameter deprecation guidance](https://platform.claude.com/docs/en/about-claude/model-deprecations#api-parameter-deprecations). - -## Scenario - -Each protocol has independent SSE and JSON conversations, each with two genuine turns: - -| Turn | Prompt | Sampling controls | -| ---- | ------------------------------------------------ | ----------------------------------- | -| 00 | `Reply with one short sentence about the ocean.` | `temperature: 0.45`; `top_p` absent | -| 01 | `Reply with one short sentence about a forest.` | `top_p: 0.55`; `temperature` absent | - -Turn 01 carries the actual assistant output returned in turn 00. Responses retains native output items; Chat uses the SDK message without local parser properties or empty annotations; Messages retains the returned text blocks. Neither sampling control is inherited from a previous request. The generated answers can differ between protocols and wire modes. - -All requests use an output-token limit of 128, expressed as `max_output_tokens`, `max_completion_tokens`, or `max_tokens`. There are no tools, reasoning options, or structured-output settings. Responses sets `store: false` and disables streaming obfuscation. Chat streaming requests enable usage reporting. Anthropic thinking is omitted so the selected model uses ordinary text generation. - -## Recording and validation - -A standalone SDK driver loaded the two credentials explicitly from the repository root `.env` and called `scripts/recorder_proxy.py` through `httpx.ASGITransport`. The proxy's HTTP client made the live requests to the official hosts. This ran outside pytest. Credentials were never printed; authorization was masked and the existing recorder whitelist excluded Anthropic's API-key header. - -Every request returned HTTP 200 and completed normally. Validation checked: - -- Exact recorded request bodies, sampling values, and absence of the unused control. -- All raw SSE events and JSON responses against the pinned native SDK schemas, without added fields or coercions. -- Normal termination, positive input/output token usage, and actual assistant-history continuation. -- Credential masking and absence of both configured credentials from every recording. -- Native Molto output against SDK-parsed events or responses for all six conversations, using offline mock transports and exact outgoing request assertions. -- SHA-256 hashes before and after replay, confirming that validation did not change any original. - -The recorder-generated files were renamed without changing their bytes. No provider response field, usage count, text, identifier, or chunk boundary was synthesized. These originals are source-only and do not automatically join generic route discovery. Review and commit them before preparing separate matched companions under the [cassette workflow](../../README.md#specifications-and-tooling). - -## Original hashes - -| File | SHA-256 | -| -------------------------------------------- | ------------------------------------------------------------------ | -| `openai-responses-stream-00.yaml` | `8a8f054c9635a555427233b9f9b1d4369782509d2ed6a56af4536764727e3ee7` | -| `openai-responses-stream-01.yaml` | `5a3b8fb67ae4718b629b6e7928056a412bfe1dd52e3aae5feb78ca195ab9076f` | -| `openai-responses-non_stream-00.yaml` | `6e472bcafd07d7c81f4d80d92652f5c009c5745d5053a6ed8589ec6d6c0f610b` | -| `openai-responses-non_stream-01.yaml` | `7f331d43dbed310e23595180aec59b5edf7fdad2790270258699719143fcf0c3` | -| `openai-chat_completions-stream-00.yaml` | `ce772c820f17e93e2742fd9073ad84834b4a67c07936e6b4619d7c0deaa96383` | -| `openai-chat_completions-stream-01.yaml` | `d3ebf013922f125bee0a059392fc6f3bda104a0967d41cfeed1cc889bdaa55cc` | -| `openai-chat_completions-non_stream-00.yaml` | `603eeb95ef052fd9e8dbb12ec6e37d376bbe057eb3a839279292fedcafc2fb6f` | -| `openai-chat_completions-non_stream-01.yaml` | `91bfc7ec8e14c3d2eae02d2da8c8f018107452ccd2df429028fe576c14e568b4` | -| `anthropic-messages-stream-00.yaml` | `76c1fdc8851108132cff36fdd8379f9843e1c3e7d5bfec6a4e4ffcca0d496fd9` | -| `anthropic-messages-stream-01.yaml` | `1521cfaf5ce2560b69a590ac9d9f15ef15f13027f6b94b4e04f3337c7e2f3198` | -| `anthropic-messages-non_stream-00.yaml` | `dd154ee49b9aa880c625cecc07a2a64a33f460e67989d848797aee6ac2793544` | -| `anthropic-messages-non_stream-01.yaml` | `4fc570765f2fd633ab48d90f7708b0e6fbdb102879fa38e073b9f1a9605a5b29` | diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml deleted file mode 100644 index cfe6a40..0000000 --- a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-00.yaml +++ /dev/null @@ -1,54 +0,0 @@ -filename: 2026-11-04-01a1a54a-e430-7692-8044-94760ee3744c -request: - body: - max_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - model: claude-haiku-4-5-20251001 - stream: false - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '201' - content-type: application/json - user-agent: AsyncAnthropic/Python 0.121.0 - method: POST - path: /v1/messages - query_params: {} -request_id: 01a1a54a-e430-7692-8044-94760ee3744c -response: - body: - container: null - content: - - text: The ocean covers more than 70% of Earth's surface and remains largely - unexplored. - type: text - diagnostics: null - id: msg_011CghS2cKxM4b3KPCTQghei - model: claude-haiku-4-5-20251001 - role: assistant - stop_details: null - stop_reason: end_turn - stop_sequence: null - type: message - usage: - cache_creation: - ephemeral_1h_input_tokens: 0 - ephemeral_5m_input_tokens: 0 - cache_creation_input_tokens: 0 - cache_read_input_tokens: 0 - inference_geo: not_available - input_tokens: 16 - output_tokens: 22 - service_tier: standard - speed: standard - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:51.152097+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml deleted file mode 100644 index 509a91a..0000000 --- a/tests/cassettes/sources/sampling_tests/anthropic-messages-non_stream-01.yaml +++ /dev/null @@ -1,62 +0,0 @@ -filename: 2026-11-04-01a1a54a-e75b-7210-a552-2701a09a4dda -request: - body: - max_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - - content: - - text: The ocean covers more than 70% of Earth's surface and remains largely - unexplored. - type: text - role: assistant - - content: - - text: Reply with one short sentence about a forest. - type: text - role: user - model: claude-haiku-4-5-20251001 - stream: false - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '434' - content-type: application/json - user-agent: AsyncAnthropic/Python 0.121.0 - method: POST - path: /v1/messages - query_params: {} -request_id: 01a1a54a-e75b-7210-a552-2701a09a4dda -response: - body: - container: null - content: - - text: Forests are home to about 80% of the world's land animals and plants. - type: text - diagnostics: null - id: msg_011CghS2fjM8uS899xmeqAWd - model: claude-haiku-4-5-20251001 - role: assistant - stop_details: null - stop_reason: end_turn - stop_sequence: null - type: message - usage: - cache_creation: - ephemeral_1h_input_tokens: 0 - ephemeral_5m_input_tokens: 0 - cache_creation_input_tokens: 0 - cache_read_input_tokens: 0 - inference_geo: not_available - input_tokens: 50 - output_tokens: 21 - service_tier: standard - speed: standard - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:51.963734+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml deleted file mode 100644 index d33cb6c..0000000 --- a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-00.yaml +++ /dev/null @@ -1,184 +0,0 @@ -filename: 2026-11-04-01a1a54a-dc60-7eb3-a1b1-1247a919ce1e -request: - body: - max_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - model: claude-haiku-4-5-20251001 - stream: true - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '200' - content-type: application/json - user-agent: AsyncAnthropic/Python 0.121.0 - method: POST - path: /v1/messages - query_params: {} -request_id: 01a1a54a-dc60-7eb3-a1b1-1247a919ce1e -response: - headers: - cache-control: no-cache - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: message_start - - ' - - 'data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CghS2UUftkJqUAKoS3GMK","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null} } - - ' - - ' - - ' - - 'event: content_block_start - - ' - - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } - - ' - - ' - - ' - - 'event: ping - - ' - - 'data: {"type": "ping"} - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"The - ocean covers"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - most"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - of Earth''s surface"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - and contains"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - countless"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - species"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - we"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"''ve"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - yet"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - to discover."} } - - ' - - ' - - ' - - 'event: content_block_stop - - ' - - 'data: {"type":"content_block_stop","index":0 } - - ' - - ' - - ' - - 'event: message_delta - - ' - - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":16,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":21} } - - ' - - ' - - ' - - 'event: message_stop - - ' - - 'data: {"type":"message_stop" } - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:49.152947+00:00' diff --git a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml b/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml deleted file mode 100644 index 73bd0aa..0000000 --- a/tests/cassettes/sources/sampling_tests/anthropic-messages-stream-01.yaml +++ /dev/null @@ -1,164 +0,0 @@ -filename: 2026-11-04-01a1a54a-e0e1-7933-89d1-713ae9de59c5 -request: - body: - max_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - - content: - - text: The ocean covers most of Earth's surface and contains countless species - we've yet to discover. - type: text - role: assistant - - content: - - text: Reply with one short sentence about a forest. - type: text - role: user - model: claude-haiku-4-5-20251001 - stream: true - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - connection: keep-alive - content-length: '446' - content-type: application/json - user-agent: AsyncAnthropic/Python 0.121.0 - method: POST - path: /v1/messages - query_params: {} -request_id: 01a1a54a-e0e1-7933-89d1-713ae9de59c5 -response: - headers: - cache-control: no-cache - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: message_start - - ' - - 'data: {"type":"message_start","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CghS2YjejcCgTx4yTpbbR","type":"message","role":"assistant","content":[],"container":null,"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":49,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available","speed":"standard"},"diagnostics":null} } - - ' - - ' - - ' - - 'event: content_block_start - - ' - - 'data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } - - ' - - ' - - ' - - 'event: ping - - ' - - 'data: {"type": "ping"} - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Forests - are vital ecos"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ystems - that produce"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - oxygen, store"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - carbon, and provide"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - homes"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - for millions"} } - - ' - - ' - - ' - - 'event: content_block_delta - - ' - - 'data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" - of species."} } - - ' - - ' - - ' - - 'event: content_block_stop - - ' - - 'data: {"type":"content_block_stop","index":0 } - - ' - - ' - - ' - - 'event: message_delta - - ' - - 'data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null,"stop_details":null,"container":null},"usage":{"input_tokens":49,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":24} } - - ' - - ' - - ' - - 'event: message_stop - - ' - - 'data: {"type":"message_stop" } - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:50.305694+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml deleted file mode 100644 index 9f0de17..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-00.yaml +++ /dev/null @@ -1,59 +0,0 @@ -filename: 2026-11-04-01a1a54a-d074-7601-9520-8b31150f80ab -request: - body: - max_completion_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - model: gpt-4.1-mini - stream: false - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '199' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a54a-d074-7601-9520-8b31150f80ab -response: - body: - choices: - - finish_reason: stop - index: 0 - logprobs: null - message: - annotations: [] - content: The ocean covers over 70% of the Earth's surface and is vital for - life. - refusal: null - role: assistant - created: 1793774507 - id: chatcmpl-EgOyp33YmHEWaAiOaH6Go29rrJT1k - model: gpt-4.1-mini-2025-04-14 - object: chat.completion - service_tier: default - system_fingerprint: fp_678b85ce7d - usage: - completion_tokens: 17 - completion_tokens_details: - accepted_prediction_tokens: 0 - audio_tokens: 0 - reasoning_tokens: 0 - rejected_prediction_tokens: 0 - prompt_tokens: 16 - prompt_tokens_details: - audio_tokens: 0 - cached_tokens: 0 - total_tokens: 33 - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:46.100496+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml deleted file mode 100644 index 36da14c..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-chat_completions-non_stream-01.yaml +++ /dev/null @@ -1,65 +0,0 @@ -filename: 2026-11-04-01a1a54a-d6bd-7542-ab14-f3f7ececf03d -request: - body: - max_completion_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - - content: The ocean covers over 70% of the Earth's surface and is vital for life. - role: assistant - - content: - - text: Reply with one short sentence about a forest. - type: text - role: user - model: gpt-4.1-mini - stream: false - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '397' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a54a-d6bd-7542-ab14-f3f7ececf03d -response: - body: - choices: - - finish_reason: stop - index: 0 - logprobs: null - message: - annotations: [] - content: A forest is a dense collection of trees that provides habitat for - countless species. - refusal: null - role: assistant - created: 1793774508 - id: chatcmpl-EgOyqZXfukrRSSnKIF2AacXmKUryN - model: gpt-4.1-mini-2025-04-14 - object: chat.completion - service_tier: default - system_fingerprint: fp_6d6e47cc7e - usage: - completion_tokens: 15 - completion_tokens_details: - accepted_prediction_tokens: 0 - audio_tokens: 0 - reasoning_tokens: 0 - rejected_prediction_tokens: 0 - prompt_tokens: 50 - prompt_tokens_details: - audio_tokens: 0 - cached_tokens: 0 - total_tokens: 65 - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:47.709625+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml deleted file mode 100644 index 2310a01..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-00.yaml +++ /dev/null @@ -1,172 +0,0 @@ -filename: 2026-11-04-01a1a54a-c4d8-7352-8024-2902b476983d -request: - body: - max_completion_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - model: gpt-4.1-mini - stream: true - stream_options: - include_usage: true - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '238' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a54a-c4d8-7352-8024-2902b476983d -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pN68gx0M"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vDkXpoA"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - ocean"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"WCFb"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - covers"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"XEr"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - over"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1v0VV"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - "},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QIuRj0M4i"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"70"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v4oepfJc"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"%"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"9aIhv5Hzl"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1lvBbaV"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"8PTmwX"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - Earth''s"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"m9"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - surface"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"gW"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - and"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"okEpXL"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"jMvrpko"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - vital"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"mMq9"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"G1kVDo"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":" - life"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"vbYks"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"2V4sSZywe"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"cZzF"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOymPQVSCTSZzW3lM1dmnUPSTNQF","object":"chat.completion.chunk","created":1793774504,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_678b85ce7d","choices":[],"usage":{"prompt_tokens":16,"completion_tokens":17,"total_tokens":33,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"2WIvNFXWD"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:43.128681+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml deleted file mode 100644 index d0577e9..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-chat_completions-stream-01.yaml +++ /dev/null @@ -1,166 +0,0 @@ -filename: 2026-11-04-01a1a54a-cc5a-7fd2-83e1-640629a20603 -request: - body: - max_completion_tokens: 128 - messages: - - content: - - text: Reply with one short sentence about the ocean. - type: text - role: user - - content: The ocean covers over 70% of the Earth's surface and is vital for life. - role: assistant - - content: - - text: Reply with one short sentence about a forest. - type: text - role: user - model: gpt-4.1-mini - stream: true - stream_options: - include_usage: true - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '436' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a54a-cc5a-7fd2-83e1-640629a20603 -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"ba7Y5xK5"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"A"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"BiCaGIbJd"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - forest"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7XS"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"sJ3AnVM"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3LM6vmD9"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - dense"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FIAD"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - collection"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aHxZNYfmR1PUCCE"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YkTfN0R"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - trees"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pcwc"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - that"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CdpnH"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - provides"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Y"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - habitat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AU"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - for"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dlu2bt"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - countless"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":""} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":" - species"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"PW"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{"content":"."},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"QLRfBOvrQ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"1aKn"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-EgOynZC7D2w6kKTQWzbygDK9Bqlcg","object":"chat.completion.chunk","created":1793774505,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_6d6e47cc7e","choices":[],"usage":{"prompt_tokens":50,"completion_tokens":15,"total_tokens":65,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"d69BBcUbw"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:45.050327+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml deleted file mode 100644 index c059d07..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-00.yaml +++ /dev/null @@ -1,107 +0,0 @@ -filename: 2026-11-04-01a1a54a-be6b-7291-b427-6e6c407ceba7 -request: - body: - input: - - content: - - text: Reply with one short sentence about the ocean. - type: input_text - role: user - max_output_tokens: 128 - model: gpt-4.1-mini - store: false - stream: false - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '212' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 01a1a54a-be6b-7291-b427-6e6c407ceba7 -response: - body: - access_programs: null - background: false - billing: - payer: developer - completed_at: 1793774502 - created_at: 1793774501 - error: null - frequency_penalty: 0.0 - id: resp_0ef734a7578a4ef0016aead3a59f3087d2a69ae11b0193eb5b - image: - context_compression: disabled - incomplete_details: null - instructions: null - max_output_tokens: 128 - max_tool_calls: null - metadata: {} - model: gpt-4.1-mini-2025-04-14 - moderation: null - object: response - output: - - content: - - annotations: [] - logprobs: [] - text: The ocean covers over 70% of the Earth's surface and is vital for life. - type: output_text - id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 - role: assistant - status: completed - type: message - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: null - effort: null - summary: null - safety_identifier: null - service_tier: default - status: completed - store: false - temperature: 0.45 - text: - format: - type: text - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 1.0 - truncation: disabled - usage: - input_tokens: 16 - input_tokens_details: - cache_write_tokens: 0 - cached_tokens: 0 - output_tokens: 18 - output_tokens_details: - reasoning_tokens: 0 - total_tokens: 34 - user: null - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:41.483112+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml deleted file mode 100644 index c7a809e..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-responses-non_stream-01.yaml +++ /dev/null @@ -1,121 +0,0 @@ -filename: 2026-11-04-01a1a54a-c179-7a83-87c3-d5886c219c5a -request: - body: - input: - - content: - - text: Reply with one short sentence about the ocean. - type: input_text - role: user - - content: - - annotations: [] - logprobs: [] - text: The ocean covers over 70% of the Earth's surface and is vital for life. - type: output_text - id: msg_0ef734a7578a4ef0016aead3a5dfb087d2a30e0d80088de361 - role: assistant - status: completed - type: message - - content: - - text: Reply with one short sentence about a forest. - type: input_text - role: user - max_output_tokens: 128 - model: gpt-4.1-mini - store: false - stream: false - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '579' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 01a1a54a-c179-7a83-87c3-d5886c219c5a -response: - body: - access_programs: null - background: false - billing: - payer: developer - completed_at: 1793774502 - created_at: 1793774502 - error: null - frequency_penalty: 0.0 - id: resp_0ef734a7578a4ef0016aead3a67ddc87d28ea66b5473fca14f - image: - context_compression: disabled - incomplete_details: null - instructions: null - max_output_tokens: 128 - max_tool_calls: null - metadata: {} - model: gpt-4.1-mini-2025-04-14 - moderation: null - object: response - output: - - content: - - annotations: [] - logprobs: [] - text: A forest is a dense collection of trees that provides habitat for countless - species. - type: output_text - id: msg_0ef734a7578a4ef0016aead3a6d57487d2b1b2c2c11d752804 - role: assistant - status: completed - type: message - parallel_tool_calls: true - presence_penalty: 0.0 - previous_response_id: null - prompt_cache_key: null - prompt_cache_retention: in_memory - reasoning: - context: null - effort: null - summary: null - safety_identifier: null - service_tier: default - status: completed - store: false - temperature: 1.0 - text: - format: - type: text - verbosity: medium - tool_choice: auto - tool_usage: - image_gen: - input_tokens: 0 - input_tokens_details: - image_tokens: 0 - text_tokens: 0 - output_tokens: 0 - output_tokens_details: - image_tokens: 0 - text_tokens: 0 - total_tokens: 0 - web_search: - num_requests: 0 - tools: [] - top_logprobs: 0 - top_p: 0.55 - truncation: disabled - usage: - input_tokens: 50 - input_tokens_details: - cache_write_tokens: 0 - cached_tokens: 0 - output_tokens: 16 - output_tokens_details: - reasoning_tokens: 0 - total_tokens: 66 - user: null - headers: - connection: keep-alive - content-type: application/json - status_code: 200 -timestamp: '2026-11-04T06:41:42.265159+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml deleted file mode 100644 index 37a290c..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-responses-stream-00.yaml +++ /dev/null @@ -1,272 +0,0 @@ -filename: 2026-11-04-01a1a54a-aa00-71b2-a1ed-18e6ca939e16 -request: - body: - input: - - content: - - text: Reply with one short sentence about the ocean. - type: input_text - role: user - max_output_tokens: 128 - model: gpt-4.1-mini - store: false - stream: true - stream_options: - include_obfuscation: false - temperature: 0.45 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '258' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 01a1a54a-aa00-71b2-a1ed-18e6ca939e16 -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"The","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ocean","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" covers","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" over","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"70","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"%","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" of","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" the","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" Earth''s","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" surface","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" vital","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" for","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" all","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":19} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" life","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","logprobs":[],"output_index":0,"sequence_number":22,"text":"The - ocean covers over 70% of the Earth''s surface and is vital for all life."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean covers over 70% of the Earth''s surface and is vital for all life."},"sequence_number":23} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"},"output_index":0,"sequence_number":24} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a153bc87d2b09d4d98db0d240f","object":"response","created_at":1793774497,"status":"completed","access_programs":null,"background":false,"completed_at":1793774498,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"The - ocean covers over 70% of the Earth''s surface and is vital for all life."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":0.45,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":1.0,"truncation":"disabled","usage":{"input_tokens":16,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":19,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":35},"user":null,"metadata":{}},"sequence_number":25} - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:36.256290+00:00' diff --git a/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml b/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml deleted file mode 100644 index accabf3..0000000 --- a/tests/cassettes/sources/sampling_tests/openai-responses-stream-01.yaml +++ /dev/null @@ -1,259 +0,0 @@ -filename: 2026-11-04-01a1a54a-b593-7321-ac9c-fa920c9c1d4a -request: - body: - input: - - content: - - text: Reply with one short sentence about the ocean. - type: input_text - role: user - - content: - - annotations: [] - logprobs: [] - text: The ocean covers over 70% of the Earth's surface and is vital for all - life. - type: output_text - id: msg_0e7b78a0986cd87b016aead3a27a5c87d281a1ad0e8da4b4ed - role: assistant - status: completed - type: message - - content: - - text: Reply with one short sentence about a forest. - type: input_text - role: user - max_output_tokens: 128 - model: gpt-4.1-mini - store: false - stream: true - stream_options: - include_obfuscation: false - top_p: 0.55 - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '629' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/responses - query_params: {} -request_id: 01a1a54a-b593-7321-ac9c-fa920c9c1d4a -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'event: response.created - - ' - - 'data: {"type":"response.created","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":0} - - ' - - ' - - ' - - 'event: response.in_progress - - ' - - 'data: {"type":"response.in_progress","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"in_progress","access_programs":null,"background":false,"completed_at":null,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"auto","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":null,"user":null,"metadata":{}},"sequence_number":1} - - ' - - ' - - ' - - 'event: response.output_item.added - - ' - - 'data: {"type":"response.output_item.added","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"in_progress","content":[],"role":"assistant"},"output_index":0,"sequence_number":2} - - ' - - ' - - ' - - 'event: response.content_part.added - - ' - - 'data: {"type":"response.content_part.added","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""},"sequence_number":3} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":"A","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":4} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" forest","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":5} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" is","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":6} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" a","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":7} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" diverse","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":8} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" ecosystem","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":9} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" filled","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":10} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" with","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":11} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" trees","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":12} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":13} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" plants","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":14} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":",","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":15} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" and","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":16} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":" wildlife","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":17} - - ' - - ' - - ' - - 'event: response.output_text.delta - - ' - - 'data: {"type":"response.output_text.delta","content_index":0,"delta":".","item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":18} - - ' - - ' - - ' - - 'event: response.output_text.done - - ' - - 'data: {"type":"response.output_text.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","logprobs":[],"output_index":0,"sequence_number":19,"text":"A - forest is a diverse ecosystem filled with trees, plants, and wildlife."} - - ' - - ' - - ' - - 'event: response.content_part.done - - ' - - 'data: {"type":"response.content_part.done","content_index":0,"item_id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","output_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":"A - forest is a diverse ecosystem filled with trees, plants, and wildlife."},"sequence_number":20} - - ' - - ' - - ' - - 'event: response.output_item.done - - ' - - 'data: {"type":"response.output_item.done","item":{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A - forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"},"output_index":0,"sequence_number":21} - - ' - - ' - - ' - - 'event: response.completed - - ' - - 'data: {"type":"response.completed","response":{"id":"resp_0e7b78a0986cd87b016aead3a374dc87d298d2c388f8accc52","object":"response","created_at":1793774499,"status":"completed","access_programs":null,"background":false,"completed_at":1793774501,"error":null,"frequency_penalty":0.0,"image":{"context_compression":"disabled"},"incomplete_details":null,"instructions":null,"max_output_tokens":128,"max_tool_calls":null,"model":"gpt-4.1-mini-2025-04-14","moderation":null,"output":[{"id":"msg_0e7b78a0986cd87b016aead3a4f6c487d29838f837d72778b1","type":"message","status":"completed","content":[{"type":"output_text","annotations":[],"logprobs":[],"text":"A - forest is a diverse ecosystem filled with trees, plants, and wildlife."}],"role":"assistant"}],"parallel_tool_calls":true,"presence_penalty":0.0,"previous_response_id":null,"prompt_cache_key":null,"prompt_cache_retention":"in_memory","reasoning":{"context":null,"effort":null,"summary":null},"safety_identifier":null,"service_tier":"default","store":false,"temperature":1.0,"text":{"format":{"type":"text"},"verbosity":"medium"},"tool_choice":"auto","tool_usage":{"image_gen":{"input_tokens":0,"input_tokens_details":{"image_tokens":0,"text_tokens":0},"output_tokens":0,"output_tokens_details":{"image_tokens":0,"text_tokens":0},"total_tokens":0},"web_search":{"num_requests":0}},"tools":[],"top_logprobs":0,"top_p":0.55,"truncation":"disabled","usage":{"input_tokens":51,"input_tokens_details":{"cache_write_tokens":0,"cached_tokens":0},"output_tokens":16,"output_tokens_details":{"reasoning_tokens":0},"total_tokens":67},"user":null,"metadata":{}},"sequence_number":22} - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-04T06:41:39.219537+00:00' diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml deleted file mode 100644 index c53d4b3..0000000 --- a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-00.yaml +++ /dev/null @@ -1,146 +0,0 @@ -filename: 2026-11-03-01a1a065-d257-7b51-add3-46beaee11c53 -request: - body: - max_completion_tokens: 4096 - messages: - - content: - - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. - type: text - role: user - model: gpt-4.1-mini - parallel_tool_calls: true - stream: true - stream_options: - include_usage: true - tools: - - function: - description: Read an image from a file path. - name: read_image - parameters: - additionalProperties: false - properties: - file_path: - description: Path to the image file. - type: string - required: - - file_path - type: object - strict: false - type: function - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '562' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a065-d257-7b51-add3-46beaee11c53 -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"role":"assistant","content":null},"logprobs":null,"finish_reason":null}],"obfuscation":"3j07B"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_KrxybpvPfiAtSG14EkBwDSAF","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"OFlkx"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"{\"fi"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"eqsmD6vStWL"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"le_pa"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"w2K9SIIPtjM"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"th\": - \""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"yrnk4GdP"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"a.pn"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"Ua5A81EoeYlu"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"function":{"arguments":"g\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"BiQsxj6r7tQ3"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"id":"call_1KSIk5BzbchE6ekWlgFAjWhm","type":"function","function":{"name":"read_image","arguments":""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"xblY4"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"{\"fi"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"4LtV3is5ev0"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"le_pa"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"CXYXa6rJ2eP"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"th\": - \""}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"nyz0o5Pm"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"b.pn"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"HchiPLAEq0TZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","usage":null,"choices":[{"index":0,"delta":{"tool_calls":[{"index":1,"function":{"arguments":"g\"}"}}]},"logprobs":null,"finish_reason":null}],"obfuscation":"MDK1DbpnX8WJ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"tool_calls"}],"usage":null,"obfuscation":"HJ3TWN1FE4cNWP"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cNrGXuTn3YFrvHFRg528QfJWpv","object":"chat.completion.chunk","created":1793692391,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_afda30e935","choices":[],"usage":{"prompt_tokens":74,"completion_tokens":48,"total_tokens":122,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"BgoIf1dL"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-03T07:53:09.975046+00:00' diff --git a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml b/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml deleted file mode 100644 index 77422c9..0000000 --- a/tests/cassettes/sources/tool_call_image_result_parallel/openai-chat_completions-stream-01.yaml +++ /dev/null @@ -1,336 +0,0 @@ -filename: 2026-11-03-01a1a065-dae9-78a3-8674-02cc2c923294 -request: - body: - max_completion_tokens: 4096 - messages: - - content: - - text: Call `read_image('a.png')` and `read_image('b.png')` in parallel. - type: text - role: user - - role: assistant - tool_calls: - - function: - arguments: '{"file_path": "a.png"}' - name: read_image - id: call_KrxybpvPfiAtSG14EkBwDSAF - type: function - - function: - arguments: '{"file_path": "b.png"}' - name: read_image - id: call_1KSIk5BzbchE6ekWlgFAjWhm - type: function - - content: - - text: The image result of tool call 'call_KrxybpvPfiAtSG14EkBwDSAF' will be - attached as user prompt after all tool responses. - type: text - role: tool - tool_call_id: call_KrxybpvPfiAtSG14EkBwDSAF - - content: - - text: The image result of tool call 'call_1KSIk5BzbchE6ekWlgFAjWhm' will be - attached as user prompt after all tool responses. - type: text - role: tool - tool_call_id: call_1KSIk5BzbchE6ekWlgFAjWhm - - content: - - text: 'Image returned by tool call ''call_KrxybpvPfiAtSG14EkBwDSAF'':' - type: text - - image_url: - url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== - type: image_url - role: user - - content: - - text: 'Image returned by tool call ''call_1KSIk5BzbchE6ekWlgFAjWhm'':' - type: text - - image_url: - url: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIAAQMAAADOtka5AAAABlBMVEUcGxv9/f2eWfzwAAAECUlEQVR42u3cQZKkIBAFUAgWLD0CR+FocDSOwhFcujDMiVn00HYM/rSzVao6/7aMV5qkYKlRRqPRaDQajUaj0Wg0Go1Go9FoNBqNRqPR/E2kbA5iaQVAovXYxwAV040j2jCwmG4CBuhwEyIiDPSPwTGB2XQyYcDS0TEkIqKMAcrgQwhU89/4Q6CVqTuQgf6mIKBfhMQC+rtpiQ/UTgkw4KlfhNBwCGzdEmCgWwRLfKAdaGp74wDQur2dDq5p+48wsH7sdDugyAVaFelfWg0x0L40NGBpu8MFinFELcV4HhDaZvEzsDZ64QGro11KPAlscQ+siQt082uAeAOwKqCAAgrwgNefVBXAAL5C+RUAuNR9fcBhoAwOWAxkMSA+BPEwis+FwWck8cqUMLAdAsTIpYDlABk0Iky5EvAcoIJOhpmvBAIHWEAnw6xXAokDbFcCxMqFgOUB+TrA8YByHeB5QB0YmHjAfB0QeMAyMBB5wDowkHjANjBANwH0xoDlAlmBLuBuA4oC1wH+FwFVAQUUUEABDLz+0qaAAueAYS+2FTgDDPvD8x2AN7iHchsw8K2w24CB72jeBcwD35ieXv/uPhMoAz9jYQJ54AdVdz2sG/qBZXr8oW2UPncOtwDz4w/vq/j9g8dfocgHgBUDd7zIsh0CSQy8/nuqL/F+4ujv5hkMGCGwASAxGlHWigsAAqOPZJ1UAeARUADghG2AO8mg4DaQjeMKgQBHUTaOFQIejqJsGAwOGAScBAYBJoBBkFWxGhwHzgQcVENJMy8sYAIlgHGgBJJeNLzE75UgVlAEUAJLGzwG1IAFnA4rGrwFHEMFADwG3D75cBwWDNTDM7JgYO7PKngu8bttPGhj/McA6fSJaPffYs/PBF/q5JkV3O907U0LlXkOzjtxNwI409dKgSYE49jKyJ6K7Jdau04Nj6vYW2AKdybLYBTgolg6wMytYt15J1cUt/+meHZZN1YKmP2upvOratp90/eW5a0DEAsInwH7PYB6QOaej71FPnM7KXeAwu2k0rSfBSq3FSsAYCvOnRV65rbi8iwQidbONffCBTYA4F4WA1kCTNQ6KYLLCzCtCoAZAPBkWKTAJgEstXFMe2DjAxkA8DqpioBWRfoW0Db1AIB/AhUFwNzm5NNA/Ng20NecAKgaTwCAP/1fF5geB/zjgJMC9nHAiIH0OBClQJACkxTwUsBJASsFjBhIUiBKgSAFJingpYCVAiZJgSgFJingpIARA0EKeAAwB3IBANwFAwBUhQIAnDcENgUUUOApICmggAIKKKCAAmNdK1vw/gKM+3GgnAQm8DrX+Z/Qi7CGROcrIKlC6LxKI7uJsBrhL/hNCpBoDHAzygF8G6TcB/iLgDom8AflkuIJHUxkLgAAAABJRU5ErkJggg== - type: image_url - role: user - - content: - - text: What are the logos? - type: text - role: user - model: gpt-4.1-mini - parallel_tool_calls: true - stream: true - stream_options: - include_usage: true - tools: - - function: - description: Read an image from a file path. - name: read_image - parameters: - additionalProperties: false - properties: - file_path: - description: Path to the image file. - type: string - required: - - file_path - type: object - strict: false - type: function - headers: - accept: application/json - accept-encoding: gzip, deflate - authorization: Bearer *** - connection: keep-alive - content-length: '4693' - content-type: application/json - user-agent: AsyncOpenAI/Python 2.53.0 - method: POST - path: /v1/chat/completions - query_params: {} -request_id: 01a1a065-dae9-78a3-8674-02cc2c923294 -response: - headers: - connection: keep-alive - content-type: text/event-stream; charset=utf-8 - sse: - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"role":"assistant","content":"","refusal":null},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"AW2edIQZ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"The"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Jew5sCR"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - images"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DIz"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - you"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"3fbOXw"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - provided"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"v"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - both"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pWMPI"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - show"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"elZTQ"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"0p5C3y"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - Git"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"aiALSK"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Hub"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"rFvAdve"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - logo"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DCavp"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"1eeOa5sQB"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - which"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"s12L"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - is"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Mc0rI0U"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iF0tIY"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - silhouette"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pwFpjp84LSXotXt"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - of"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"DXjpgKu"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - a"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YEG6acEW"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - cat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"pbMAS9"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - with"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"CV5Oz"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - an"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"iaaYwAy"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - oct"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"7wy2ze"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"opus"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Eg443Z"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"-like"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"Yzrrw"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - tail"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"YMHz3"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":","},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"OuaaxF5Hm"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - commonly"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"c"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - known"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"dApN"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - as"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"RS29CIC"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - the"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"FG58fe"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":" - \""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"fTjj2s3"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"Oct"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"xAGYgdy"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":"ocat"},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4g2m1H"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{"content":".\""},"logprobs":null,"finish_reason":null}],"usage":null,"obfuscation":"4woCKWV"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null,"obfuscation":"F30L"} - - ' - - ' - - ' - - 'data: {"id":"chatcmpl-Eg3cOOCR1XQeHFXUrWbrGDYxnuG2Y","object":"chat.completion.chunk","created":1793692392,"model":"gpt-4.1-mini-2025-04-14","service_tier":"default","system_fingerprint":"fp_07e815c12d","choices":[],"usage":{"prompt_tokens":1098,"completion_tokens":34,"total_tokens":1132,"prompt_tokens_details":{"cached_tokens":0,"audio_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"obfuscation":"ow8Ob"} - - ' - - ' - - ' - - 'data: [DONE] - - ' - - ' - - ' - status_code: 200 -timestamp: '2026-11-03T07:53:12.169336+00:00' From 22e0de836ead77b5c7b1576910f1e389b47caf7c Mon Sep 17 00:00:00 2001 From: Amir Balwel Date: Thu, 5 Nov 2026 18:12:15 +0800 Subject: [PATCH 4/4] update Signed-off-by: Amir Balwel --- tests/cassettes/README.md | 6 ++--- tests/test_match_openai_cassette_events.py | 29 +++++++--------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/tests/cassettes/README.md b/tests/cassettes/README.md index 06b1681..25ba40f 100644 --- a/tests/cassettes/README.md +++ b/tests/cassettes/README.md @@ -13,7 +13,7 @@ Discovery has separate purposes for each root: - `matched/` supplies compatible protocol conversations and Responses-referenced translation checks. - `native/` optionally holds faithful provider-deviation recordings for native SDK parity in supported scenarios. They do not require matched counterparts or establish translated behavior. - `errors/` supplies only the explicitly registered `ERROR_SCENARIOS`. The Responses-only incomplete-result recordings retain their focused interface tests. -- `sources/` holds source-only originals and does not generate public-route cases. Reuse an original already under `native/` or `upstream_ir/` rather than copying it here. `upstream_ir/` retains its separate projection and continuation runner; archives and legacy provider directories do not join generic discovery. +- `upstream_ir/` retains its separate projection and continuation runner; archives and legacy provider directories do not join generic discovery. Each additional matched upstream provider runs against the canonical downstream companion and Responses reference, preferring the endpoint's default provider or requiring a unique available conversation. Native routes use that upstream provider's own request and SDK result. This preserves the existing routes without taking a cross-product of providers. Both native SDK runners pass the discovered provider explicitly. The existing native SDK baseline scenarios remain selected; other supported matched scenarios retain their native public-route assertions. @@ -21,7 +21,7 @@ Malformed filenames, duplicate numeric identities, missing turns or required cou ## Recorded cassettes -Faithful originals live under `native/`, `sources/`, `upstream_ir/`, or `errors/`, according to their test purpose. Preserve each original separately from any deliberately edited matched companion. Authorization values are masked, and only selected headers are retained so the fixtures remain safe and deterministic. Review request bodies for secrets before retaining recordings. +Faithful originals live under `native/`, `upstream_ir/`, or `errors/`, according to their test purpose. Preserve each original separately from any deliberately edited matched companion. Authorization values are masked, and only selected headers are retained so the fixtures remain safe and deterministic. Review request bodies for secrets before retaining recordings. For each provider deviation, a nearby README must identify the source provider, endpoint, model and server version when available, response mode, purpose, and recording provenance. Retain the complete sanitized conversation. Native tests compare requests and SDK-parsed results with that original, asserting the observed deviation separately from any documented Molto adjustment. If translation is affected, retain the difference in the upstream replay and compare against Responses-referenced expectations; matching must not erase the deviation under test. @@ -165,7 +165,7 @@ The `reasoning_raw` scenario is named with `vllm-*` filenames and its test deriv The Chat streaming matcher converts image-bearing Responses tool results into text-only tool messages followed by labeled user image messages. All parallel tool results stay contiguous before any relocated image, and images retain their source order within and across results. Constructed matcher tests assert contiguous results with multiple images and verify repeat matching on temporary files without rewriting recordings. -The two Chat companions in `matched/tool_call_image_result_parallel/` derive from the unchanged official OpenAI recordings under `sources/`. Request-only matching aligns the model, output-token limit, streaming options, and history; event matching aligns reasoning effort, portable call IDs and their history/labels, response IDs, creation times, response model, target-default service tier, text/tool-argument deltas, finish state, and semantic usage with Responses. The first matched stream has 7 chunks and the second has 23. Transport headers, recording timestamps, and source identifiers remain unchanged. The matched model is a replay value, not evidence that these edited requests were sent live. Matcher tests rebuild both companions on temporary files, validate native SDK schemas, and verify byte idempotence while preserving the originals. +The two Chat companions in `matched/tool_call_image_result_parallel/` are edited replay fixtures aligned with Responses. Request-only matching aligns the model, output-token limit, streaming options, and history; event matching aligns reasoning effort, portable call IDs and their history/labels, response IDs, creation times, response model, target-default service tier, text/tool-argument deltas, finish state, and semantic usage with Responses. The first matched stream has 7 chunks and the second has 23. Matching preserves transport headers, recording timestamps, and source identifiers. The matched model is a replay value, not evidence that these edited requests were sent live. Matcher tests rematch both saved companions into temporary files, validate native SDK schemas, and verify byte idempotence while preserving both input fixtures. These stability checks do not require separate original recordings; transformation behavior is covered by the synthetic cases described above. Focused public request tests check Responses and Messages callers using Chat upstream with images in the first, last, or both parallel results. They compare complete expected requests, including linked call IDs, result order, and image order. These tests reuse SDK-parsed text responses to check output parity; they do not establish live acceptance or replace full Chat image-result conversation replay. diff --git a/tests/test_match_openai_cassette_events.py b/tests/test_match_openai_cassette_events.py index 3909398..d2f4c3c 100644 --- a/tests/test_match_openai_cassette_events.py +++ b/tests/test_match_openai_cassette_events.py @@ -532,28 +532,18 @@ def test_matches_tool_call_stream_cassettes( ) ], ) -def test_matches_recorded_parallel_tool_images_companion( +def test_parallel_tool_image_companions_are_idempotent( tmp_path: Path, companion_path: Path, responses_path: Path ) -> None: - """Ensures discovered source turns reproduce matched companions without changing originals.""" - filename = companion_path.name - # Reuse a faithful original where it lives instead of requiring another copy. - source_paths = [ - CASSETTES.parent / root / companion_path.parent.name / filename - for root in ("native", "upstream_ir", "sources") - ] - source_path = next((path for path in source_paths if path.is_file()), None) - assert source_path is not None, ( - f"Missing approved original for {companion_path}: {source_paths}" - ) - output_path = tmp_path / filename - source_bytes = source_path.read_bytes() + """Ensures rematching preserves valid saved companions without modifying either input.""" + output_path = tmp_path / companion_path.name + companion_bytes = companion_path.read_bytes() responses_bytes = responses_path.read_bytes() assert ( main( [ - str(source_path), + str(companion_path), str(responses_path), "--request-only", "--output", @@ -566,15 +556,14 @@ def test_matches_recorded_parallel_tool_images_companion( matched = read_yaml(str(output_path)) assert matched == read_yaml(str(companion_path)) - for cassette in (read_yaml(str(source_path)), matched): - OpenAIChatCompletionsCreateRequest.model_validate(cassette["request"]["body"]) - for event in _data_events(cassette): - ChatCompletionChunk.model_validate(event) + OpenAIChatCompletionsCreateRequest.model_validate(matched["request"]["body"]) + for event in _data_events(matched): + ChatCompletionChunk.model_validate(event) first_match = output_path.read_bytes() assert main([str(output_path), str(responses_path), "--request-only"]) == 0 assert main([str(output_path), str(responses_path)]) == 0 assert output_path.read_bytes() == first_match - assert source_path.read_bytes() == source_bytes + assert companion_path.read_bytes() == companion_bytes assert responses_path.read_bytes() == responses_bytes