[
  {
    "path": ".github/actions/poetry_setup/action.yml",
    "content": "# An action for setting up poetry install with caching.\n# Using a custom action since the default action does not\n# take poetry install groups into account.\n# Action code from:\n# https://github.com/actions/setup-python/issues/505#issuecomment-1273013236\nname: poetry-install-with-caching\ndescription: Poetry install with support for caching of dependency groups.\n\ninputs:\n  python-version:\n    description: Python version, supporting MAJOR.MINOR only\n    required: true\n\n  poetry-version:\n    description: Poetry version\n    required: true\n\n  cache-key:\n    description: Cache key to use for manual handling of caching\n    required: true\n\n  working-directory:\n    description: Directory whose poetry.lock file should be cached\n    required: true\n\nruns:\n  using: composite\n  steps:\n    - uses: actions/setup-python@v4\n      name: Setup python ${{ inputs.python-version }}\n      with:\n        python-version: ${{ inputs.python-version }}\n\n    - uses: actions/cache@v3\n      id: cache-bin-poetry\n      name: Cache Poetry binary - Python ${{ inputs.python-version }}\n      env:\n        SEGMENT_DOWNLOAD_TIMEOUT_MIN: \"1\"\n      with:\n        path: |\n          /opt/pipx/venvs/poetry\n        # This step caches the poetry installation, so make sure it's keyed on the poetry version as well.\n        key: bin-poetry-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }}-${{ inputs.poetry-version }}\n\n    - name: Refresh shell hashtable and fixup softlinks\n      if: steps.cache-bin-poetry.outputs.cache-hit == 'true'\n      shell: bash\n      env:\n        POETRY_VERSION: ${{ inputs.poetry-version }}\n        PYTHON_VERSION: ${{ inputs.python-version }}\n      run: |\n        set -eux\n\n        # Refresh the shell hashtable, to ensure correct `which` output.\n        hash -r\n\n        # `actions/cache@v3` doesn't always seem able to correctly unpack softlinks.\n        # Delete and recreate the softlinks pipx expects to have.\n        rm /opt/pipx/venvs/poetry/bin/python\n        cd /opt/pipx/venvs/poetry/bin\n        ln -s \"$(which \"python$PYTHON_VERSION\")\" python\n        chmod +x python\n        cd /opt/pipx_bin/\n        ln -s /opt/pipx/venvs/poetry/bin/poetry poetry\n        chmod +x poetry\n\n        # Ensure everything got set up correctly.\n        /opt/pipx/venvs/poetry/bin/python --version\n        /opt/pipx_bin/poetry --version\n\n    - name: Install poetry\n      if: steps.cache-bin-poetry.outputs.cache-hit != 'true'\n      shell: bash\n      env:\n        POETRY_VERSION: ${{ inputs.poetry-version }}\n        PYTHON_VERSION: ${{ inputs.python-version }}\n      run: pipx install \"poetry==$POETRY_VERSION\" --python \"python$PYTHON_VERSION\" --verbose\n\n    - name: Restore pip and poetry cached dependencies\n      uses: actions/cache@v3\n      env:\n        SEGMENT_DOWNLOAD_TIMEOUT_MIN: \"4\"\n        WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }}\n      with:\n        path: |\n          ~/.cache/pip\n          ~/.cache/pypoetry/virtualenvs\n          ~/.cache/pypoetry/cache\n          ~/.cache/pypoetry/artifacts\n          ${{ env.WORKDIR }}/.venv\n        key: py-deps-${{ runner.os }}-${{ runner.arch }}-py-${{ inputs.python-version }}-poetry-${{ inputs.poetry-version }}-${{ inputs.cache-key }}-${{ hashFiles(format('{0}/**/poetry.lock', env.WORKDIR)) }}\n"
  },
  {
    "path": ".github/workflows/_lint.yml",
    "content": "name: lint\n\non:\n  workflow_call:\n    inputs:\n      working-directory:\n        required: true\n        type: string\n        description: \"From which folder this pipeline executes\"\n\nenv:\n  POETRY_VERSION: \"1.5.1\"\n  WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }}\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        # Only lint on the min and max supported Python versions.\n        # It's extremely unlikely that there's a lint issue on any version in between\n        # that doesn't show up on the min or max versions.\n        #\n        # GitHub rate-limits how many jobs can be running at any one time.\n        # Starting new jobs is also relatively slow,\n        # so linting on fewer versions makes CI faster.\n        python-version:\n          - \"3.9\"\n          - \"3.11\"\n    steps:\n      - uses: actions/checkout@v3\n      - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }}\n        uses: \"./.github/actions/poetry_setup\"\n        with:\n          python-version: ${{ matrix.python-version }}\n          poetry-version: ${{ env.POETRY_VERSION }}\n          working-directory: ${{ inputs.working-directory }}\n          cache-key: lint-with-extras\n\n      - name: Check Poetry File\n        shell: bash\n        working-directory: ${{ inputs.working-directory }}\n        run: |\n          poetry check\n\n      - name: Check lock file\n        shell: bash\n        working-directory: ${{ inputs.working-directory }}\n        run: |\n          poetry lock --check\n\n      - name: Install dependencies\n        # Also installs dev/lint/test/typing dependencies, to ensure we have\n        # type hints for as many of our libraries as possible.\n        # This helps catch errors that require dependencies to be spotted, for example:\n        # https://github.com/langchain-ai/langchain/pull/10249/files#diff-935185cd488d015f026dcd9e19616ff62863e8cde8c0bee70318d3ccbca98341\n        #\n        # If you change this configuration, make sure to change the `cache-key`\n        # in the `poetry_setup` action above to stop using the old cache.\n        # It doesn't matter how you change it, any change will cause a cache-bust.\n        working-directory: ${{ inputs.working-directory }}\n        run: |\n          poetry install --with dev,lint,test\n        # Add typing dependencies once we roll out mypy\n        # poetry install --with dev,lint,test,typing\n\n      - name: Analysing the code with our lint\n        working-directory: ${{ inputs.working-directory }}\n        env:\n          BLACK_CACHE_DIR: .black_cache\n        run: |\n          make lint\n"
  },
  {
    "path": ".github/workflows/build_deploy_image.yml",
    "content": "name: Build, Push, and Deploy Open GPTS\n\non:\n  push:\n    branches: [main]\n  workflow_dispatch:\n\njobs:\n  build-and-push:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v3\n\n    - name: Set up Short Hash\n      run: |\n        echo \"GIT_SHORT_SHA=$(git rev-parse --short HEAD)\" >> $GITHUB_ENV\n\n    - name: Set up depot.dev multi-arch runner\n      uses: depot/setup-action@v1\n\n    - name: Login to DockerHub\n      uses: docker/login-action@v2\n      with:\n        username: ${{ secrets.LANGCHAIN_DOCKERHUB_USERNAME }}\n        password: ${{ secrets.LANGCHAIN_DOCKERHUB_PASSWORD }}\n\n    - name: Set up Docker Buildx\n      uses: docker/setup-buildx-action@v3\n\n    - name: Build and push\n      uses: docker/build-push-action@v5\n      with:\n        push: true\n        platforms: linux/amd64,linux/arm64\n        tags: \"docker.io/langchain/open-gpts:${{ env.GIT_SHORT_SHA }}, docker.io/langchain/open-gpts:latest\"\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "---\nname: CI\n\non:\n  push:\n    branches: [main]\n  pull_request: # Trigger on all PRs, ensuring required actions to be run.\n  workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI\n\n# If another push to the same PR or branch happens while this workflow is still running,\n# cancel the earlier run in favor of the next run.\n#\n# There's no point in testing an outdated version of the code. GitHub only allows\n# a limited number of job runners to be active at the same time, so it's better to cancel\n# pointless jobs early so that more useful jobs can run sooner.\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  POETRY_VERSION: \"1.5.1\"\n  WORKDIR: \"./backend\"\n\njobs:\n  lint:\n    uses: ./.github/workflows/_lint.yml\n    with:\n      working-directory: \"./backend\"\n    secrets: inherit\n\n  test:\n    timeout-minutes: 5\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: ${{ env.WORKDIR }}\n    strategy:\n      matrix:\n        python-version:\n          - \"3.9\"\n          - \"3.10\"\n          - \"3.11\"\n    name: Python ${{ matrix.python-version }} tests\n    services:\n      # Label used to access the service container\n      postgres:\n        image: pgvector/pgvector:pg16\n        env:\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: postgres\n        # Set health checks to wait until postgres has started\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - \"5432:5432\"\n    steps:\n      - uses: actions/checkout@v3\n      - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }}\n        uses: \"./.github/actions/poetry_setup\"\n        with:\n          python-version: ${{ matrix.python-version }}\n          poetry-version: ${{ env.POETRY_VERSION }}\n          working-directory: .\n          cache-key: langserve-all\n      - name: Install dependencies\n        run: |\n          poetry install --with test\n      - name: Install golang-migrate\n        run: |\n          wget -O golang-migrate.deb https://github.com/golang-migrate/migrate/releases/download/v4.17.0/migrate.linux-amd64.deb\n          sudo dpkg -i golang-migrate.deb && rm golang-migrate.deb\n      - name: Run tests\n        env:\n          POSTGRES_HOST: localhost\n          POSTGRES_PORT: 5432\n          POSTGRES_DB: postgres\n          POSTGRES_USER: postgres\n          POSTGRES_PASSWORD: postgres\n          SCARF_NO_ANALYTICS: true\n        run: make test\n\n  frontend-lint-and-build:\n      runs-on: ubuntu-latest\n      needs: [lint, test]\n      steps:\n        - uses: actions/checkout@v3\n        - name: Setup Node.js (LTS)\n          uses: actions/setup-node@v3\n          with:\n            node-version: '20'\n            cache: 'yarn'\n            cache-dependency-path: frontend/yarn.lock\n        - name: Install frontend dependencies\n          run: yarn install\n          working-directory: ./frontend\n        - name: Run frontend lint\n          run: yarn lint\n          working-directory: ./frontend\n        - name: Build frontend\n          run: yarn build\n          working-directory: ./frontend\n"
  },
  {
    "path": ".gitignore",
    "content": "*.env\n.env.gcp.yaml\npostgres-volume/\nredis-volume/\nbackend/ui\n\n# Operating System generated files\n.DS_Store\nThumbs.db\nehthumbs.db\nDesktop.ini\n\n# Python artifacts\n__pycache__/\n*.py[cod]\n.venv/\n*.egg-info/\ndist/\n\n# Node.js / frontend artifacts\nnode_modules/\n/dist\n/dist-ssr\n.npm\n.npmrc\n.yarn-cache\n.yarn-integrity\n.yarn.lock\npackage-lock.json\n.pnpm-lock.yaml\n\n# IDEs and editors\n.vscode/*\n!.vscode/extensions.json  # Include recommended extensions for VS Code users\n.idea/\n*.sublime-*\n*.sublime-workspace\n*.atom/\n*.iml\n\n# Microsoft Visual Studio\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n\n# Swap and Temporary Files\n*.swp\n*.swo\n*~\n*.bak\n*.tmp\n*.temp\n\n# Log files\n*.log*\nlogs/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n"
  },
  {
    "path": "API.md",
    "content": "# API Getting Started\n\nThis documentation covers how to get started with the API that backs OpenGPTs.\nThis allows you to easily integrate it with a different frontend of your choice.\n\nFor full API documentation, see [localhost:8100/docs](localhost:8100/docs) after deployment.\n\nIf you want to see the API docs before deployment, check out the [hosted docs here](https://opengpts-example-vz4y4ooboq-uc.a.run.app/docs).\n\nIn the examples below, cookies are used as a mock auth method. For production, we recommend using JWT auth. Refer to the [auth guide for production](auth.md) for more information.\nWhen using JWT auth, you will need to include the JWT in the `Authorization` header as a Bearer token.\n\n## Create an Assistant\n\nFirst, let's use the API to create an assistant. \nThis should look something like:\n\n```python\nimport requests\nrequests.post('http://127.0.0.1:8100/assistants', json={\n  \"name\": \"bar\",\n  \"config\": {\"configurable\": {}},\n  \"public\": True\n}, cookies= {\"opengpts_user_id\": \"foo\"}).content\n```\nThis is creating an assistant with name `\"bar\"`, with default configuration, that is public, and is associated with user `\"foo\"`.\n\nThis should return something like:\n\n```shell\nb'{\"assistant_id\":\"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\",\"name\":\"string\",\"config\":{\"configurable\":{}},\"updated_at\":\"2023-11-20T16:24:30.520340\",\"public\":true,\"user_id\":\"foo\"}'\n```\n\nThe config parameters allows you to set the LLM used, the instructions of the assistant and also the tools used.\n\n\n```\n{\n  \"name\": \"bar\",\n  \"config\": {\n    \"configurable\": {\n      \"type\": \"agent\",\n      \"type==agent/agent_type\": \"GPT 3.5 Turbo\",\n      \"type==agent/system_message\": \"You are a helpful assistant\",\n      \"type==agent/tools\": [\"Wikipedia\"]\n  },\n  \"public\": True\n}\n```\nThis creates an assistant with the name `\"bar\"`, with GPT 3.5 Turbo, with a prompt `\"You are a helpful assistant\"` using the Wikipedia tool , that is public.\n\nAvailable tools names can be found in the AvailableTools class in backend/packages/gizmo-agent/gizmo_agent/tools.py\nAvailable llms can be found in GizmoAgentType in backend/packages/gizmo-agent/gizmo_agent/agent_types/__init__.py\n\nNote: If a RAGBot assistant is created (`type` equals `chat_retrieval`), then subsequent API requests/responses for the threads APIs are slightly modified and noted below.\n\n## Create a thread\n\nWe can now create a thread.\nNotably different from OpenAI's assistant API, we require starting the thread with an assistant ID.\n\n```python\nimport requests\nrequests.post('http://127.0.0.1:8100/threads', cookies= {\"opengpts_user_id\": \"foo\"}, json={\n    \"name\": \"hi\",\n    \"assistant_id\": \"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\"\n}).content\n```\n\nThis is creating a thread, named `\"hi\"`, with the assistant ID that we just created, for the same user.\n\nThis should return something like:\n\n```shell\nb'{\"thread_id\":\"231dc7f3-33ee-4040-98fe-27f6e2aa8b2b\",\"assistant_id\":\"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\",\"name\":\"hi\",\"updated_at\":\"2023-11-20T16:26:39.083817\",\"user_id\":\"foo\"}'\n```\n\n## Add a message\n\nWe can check the thread, and see that it is currently empty:\n\n```python\nimport requests\nrequests.get(\n    'http://127.0.0.1:8100/threads/231dc7f3-33ee-4040-98fe-27f6e2aa8b2b/state', \n    cookies= {\"opengpts_user_id\": \"foo\"}\n).content\n```\n```shell\nb'{\"values\":[]}'\n```\nFor RAGBot:\n```shell\nb'{\"values\":{\"messages\":[]}}'\n```\n\nLet's add a message to the thread!\n\n```python\nimport requests\nrequests.post(\n    'http://127.0.0.1:8100/threads/231dc7f3-33ee-4040-98fe-27f6e2aa8b2b/state', \n    cookies= {\"opengpts_user_id\": \"foo\"}, json={\n        \"values\": [{\n            \"content\": \"hi! my name is bob\",\n            \"type\": \"human\",\n        }]\n    }\n).content\n```\nFor RAGBot:\n```\n{\n    \"values\": {\n        \"messages\": [{\n            \"content\": \"hi! my name is bob\",\n            \"type\": \"human\",\n        }]\n    }\n}\n```\n\nIf we now run the command to see the thread, we can see that there is now a message on that thread\n\n```python\nimport requests\nrequests.get(\n    'http://127.0.0.1:8100/threads/231dc7f3-33ee-4040-98fe-27f6e2aa8b2b/state', \n    cookies= {\"opengpts_user_id\": \"foo\"}\n).content\n```\n```shell\nb'{\"values\":[{\"content\":\"hi! my name is bob\",\"additional_kwargs\":{},\"type\":\"human\",\"example\":false}],\"next\":[]}'\n```\nFor RAGBot:\n```shell\nb'{\"values\":{\"messages\":[...]},\"next\":[]}'\n```\n\n## Run the assistant on that thread\n\nWe can now run the assistant on that thread.\n\n```python\nimport requests\nrequests.post('http://127.0.0.1:8100/runs', cookies= {\"opengpts_user_id\": \"foo\"}, json={\n    \"assistant_id\": \"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\",\n    \"thread_id\": \"231dc7f3-33ee-4040-98fe-27f6e2aa8b2b\",\n    \"input\": {\n        \"messages\": []\n    }\n}).content\n```\nThis runs the thread with the same id that we just created, with the assistant that we created, with no additional input messages (see below for how to add input messages).\n\nIf we now check the thread, we can see (after a bit) that there is a message from the AI.\n\n```python\nimport requests\nrequests.get('http://127.0.0.1:8100/threads/231dc7f3-33ee-4040-98fe-27f6e2aa8b2b/state', cookies= {\"opengpts_user_id\": \"foo\"}).content\n```\n```shell\nb'{\"values\":[{\"content\":\"hi! my name is bob\",\"additional_kwargs\":{},\"type\":\"human\",\"example\":false},{\"content\":\"Hello, Bob! How can I assist you today?\",\"additional_kwargs\":{\"agent\":{\"return_values\":{\"output\":\"Hello, Bob! How can I assist you today?\"},\"log\":\"Hello, Bob! How can I assist you today?\",\"type\":\"AgentFinish\"}},\"type\":\"ai\",\"example\":false}],\"next\":[]}'\n```\nFor RAGBot:\n```shell\nb'{\"values\":{\"messages\":[...]},\"next\":[]}'\n```\n\n## Run the assistant on the thread with new messages\n\nWe can also run the assistant on a thread and add new messages at the same time.\nContinuing the example above, we can run:\n\n```python\nimport requests\nrequests.post('http://127.0.0.1:8100/runs', cookies= {\"opengpts_user_id\": \"foo\"}, json={\n    \"assistant_id\": \"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\",\n    \"thread_id\": \"231dc7f3-33ee-4040-98fe-27f6e2aa8b2b\",\n    \"input\": {\n        \"messages\": [{\n            \"content\": \"whats my name? respond in spanish\",\n            \"type\": \"human\",\n        }]\n    }\n}).content\n```\n\nThen, if we call the threads endpoint after a bit we can see the human message - as well as an AI message - get added to the thread.\n\n```python\nimport requests\nrequests.get('http://127.0.0.1:8100/threads/231dc7f3-33ee-4040-98fe-27f6e2aa8b2b/state', cookies= {\"opengpts_user_id\": \"foo\"}).content\n```\n\n```shell\nb'{\"values\":[{\"content\":\"hi! my name is bob\",\"additional_kwargs\":{},\"type\":\"human\",\"example\":false},{\"content\":\"Hello, Bob! How can I assist you today?\",\"additional_kwargs\":{\"agent\":{\"return_values\":{\"output\":\"Hello, Bob! How can I assist you today?\"},\"log\":\"Hello, Bob! How can I assist you today?\",\"type\":\"AgentFinish\"}},\"type\":\"ai\",\"example\":false},{\"content\":\"whats my name? respond in spanish\",\"additional_kwargs\":{},\"type\":\"human\",\"example\":false},{\"content\":\"Tu nombre es Bob.\",\"additional_kwargs\":{\"agent\":{\"return_values\":{\"output\":\"Tu nombre es Bob.\"},\"log\":\"Tu nombre es Bob.\",\"type\":\"AgentFinish\"}},\"type\":\"ai\",\"example\":false}],\"next\":[]}'\n```\nFor RAGBot:\n```shell\nb'{\"values\":{\"messages\":[...]},\"next\":[]}'\n```\n\n## Stream\nOne thing we can do is stream back responses.\nThis works for both messages as well as tokens.\nBelow is an example of streaming back tokens for a response.\n\n```python\nimport requests\nimport json\nresponse = requests.post(\n    'http://127.0.0.1:8100/runs/stream', \n    cookies= {\"opengpts_user_id\": \"foo\"}, json={\n    \"assistant_id\": \"9c7d7e6e-654b-4eaa-b160-f19f922fc63b\",\n    \"thread_id\": \"231dc7f3-33ee-4040-98fe-27f6e2aa8b2b\",\n    \"input\": {\n        \"messages\": [{\n            \"content\": \"have a good day!\",\n            \"type\": \"human\",\n        }]\n    }\n})\nres = []\nif response.status_code == 200:\n    # Iterate over the response\n    for line in response.iter_lines():\n        if line:  # filter out keep-alive new lines\n            string_line = line.decode(\"utf-8\")\n            # Only look at where data i returned\n            if string_line.startswith('data'):\n                json_string = string_line[len('data: '):]\n                # Get the json response - contains a list of all messages\n                json_value = json.loads(json_string)\n                if \"messages\" in json_value:\n                    # Get the content from the last message\n                    # If you want to display multiple messages (eg if agent takes intermediate steps) you will need to change this logic\n                    print(json_value['messages'][-1]['content'])\nelse:\n    print(f\"Failed to retrieve data: {response.status_code}\")\n```\n\nThis streams the following:\n\n```shell\nYou\nYou too\nYou too!\nYou too! If\nYou too! If you\nYou too! If you have\nYou too! If you have any\nYou too! If you have any other\nYou too! If you have any other questions\nYou too! If you have any other questions,\nYou too! If you have any other questions, feel\nYou too! If you have any other questions, feel free\nYou too! If you have any other questions, feel free to\nYou too! If you have any other questions, feel free to ask\nYou too! If you have any other questions, feel free to ask.\nYou too! If you have any other questions, feel free to ask.\nYou too! If you have any other questions, feel free to ask.\n```\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Contributor License Agreement\n\nWe are grateful to the contributors who help evolve OpenGPTs and dedicate their time to the project. As the primary sponsor of OpenGPTs, LangChain, Inc. aims to build products in the open that benefit thousands of developers while allowing us to build a sustainable business. For all code contributions to OpenGPTs, we ask that contributors complete and sign a Contributor License Agreement (“CLA”). The agreement between contributors and the project is explicit, so OpenGPTs users can be confident in the legal status of the source code and their right to use it.The CLA does not change the terms of the underlying license, OpenGPTs License, used by our software.\n\nBefore you can contribute to OpenGPTs, a bot will comment on the PR asking you to agree to the CLA if you haven't already. Agreeing to the CLA is required before code can be merged and only needs to happen on the first contribution to the project. All subsequent contributions will fall under the same CLA."
  },
  {
    "path": "Dockerfile",
    "content": "FROM node:20 AS builder\n\nWORKDIR /frontend\n\nCOPY ./frontend/package.json ./frontend/yarn.lock ./\n\nRUN yarn --network-timeout 600000 --frozen-lockfile\n\nCOPY ./frontend ./\n\nRUN rm -rf .env\n\nRUN yarn build\n\n# Backend Dockerfile\nFROM python:3.11\n\nARG TARGETOS\nARG TARGETARCH\nARG TARGETVARIANT\n\n# Install system dependencies\nRUN apt-get update && rm -rf /var/lib/apt/lists/*\nRUN wget -O golang-migrate.deb https://github.com/golang-migrate/migrate/releases/download/v4.17.0/migrate.${TARGETOS}-${TARGETARCH}${TARGETVARIANT}.deb \\\n    && dpkg -i golang-migrate.deb \\\n    && rm golang-migrate.deb\n\n# Install Poetry\nRUN pip install poetry\n\n# Set the working directory\nWORKDIR /backend\n\n# Copy only dependencies\nCOPY ./backend/pyproject.toml ./backend/poetry.lock* ./\n\n# Install dependencies\n# --only main: Skip installing packages listed in the [tool.poetry.dev-dependencies] section\nRUN poetry config virtualenvs.create false \\\n    && poetry install --no-interaction --no-ansi --only main\n\n# Copy the rest of backend\nCOPY ./backend .\n\n# Copy the frontend build\nCOPY --from=builder /frontend/dist ./ui\n\nENTRYPOINT [ \"uvicorn\", \"app.server:app\", \"--host\", \"0.0.0.0\", \"--log-config\", \"log_config.json\" ]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) LangChain, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# OpenGPTs\n\nThis is an open source effort to create a similar experience to OpenAI's GPTs and Assistants API.\nIt is powered by [LangGraph](https://github.com/langchain-ai/langgraph) - a framework for creating agent runtimes.\nIt also builds upon [LangChain](https://github.com/langchain-ai/langchain), [LangServe](https://github.com/langchain-ai/langserve) and [LangSmith](https://smith.langchain.com/).\nOpenGPTs gives you more control, allowing you to configure:\n\n- The LLM you use (choose between the 60+ that LangChain offers)\n- The prompts you use (use LangSmith to debug those)\n- The tools you give it (choose from LangChain's 100+ tools, or easily write your own)\n- The vector database you use (choose from LangChain's 60+ vector database integrations)\n- The retrieval algorithm you use\n- The chat history database you use\n\nMost importantly, it gives you full control over the **cognitive architecture** of your application.\nCurrently, there are three different architectures implemented:\n\n- Assistant\n- RAG\n- Chatbot\n\nSee below for more details on those.\nBecause this is open source, if you do not like those architectures or want to modify them, you can easily do that!\n\n<p align=\"center\">\n    <img alt=\"Configure\" src=\"_static/configure.png\" width=\"49%\" />\n    <img alt=\"Chat\" src=\"_static/chat.png\" width=\"49%\" />\n</p>\n\n**Key Links**\n\n- [GPTs: a simple hosted version](https://opengpts-example-vz4y4ooboq-uc.a.run.app/)\n- [Assistants API: a getting started guide](API.md)\n- [Auth: a guide for production](auth.md)\n\n## Quickstart with Docker\n\nThis project supports a Docker-based setup, streamlining installation and execution. It automatically builds images for \nthe frontend and backend and sets up Postgres using docker-compose.\n\n\n1. **Prerequisites:**  \n    Ensure you have Docker and docker-compose installed on your system.\n\n\n2. **Clone the Repository:**  \n   Obtain the project files by cloning the repository.\n\n   ```\n   git clone https://github.com/langchain-ai/opengpts.git\n   cd opengpts\n   ```\n\n3. **Set Up Environment Variables:**  \n   Create a `.env` file in the root directory of the project by copying `.env.example` as a template, and add the \n   following environment variables:\n   ```shell\n   # At least one language model API key is required\n   OPENAI_API_KEY=sk-...\n   # LANGCHAIN_TRACING_V2=true\n   # LANGCHAIN_API_KEY=...\n   \n   # Setup for Postgres. Docker compose will use these values to set up the database.\n   POSTGRES_PORT=5432\n   POSTGRES_DB=opengpts\n   POSTGRES_USER=postgres\n   POSTGRES_PASSWORD=...\n   ```\n\n   Replace `sk-...` with your OpenAI API key and `...` with your LangChain API key.\n\n\n4. **Run with Docker Compose:**  \n   In the root directory of the project, execute:\n\n   ```\n   docker compose up\n   ```\n\n   This command builds the Docker images for the frontend and backend from their respective Dockerfiles and starts all \n   necessary services, including Postgres.\n\n5. **Access the Application:**  \n   With the services running, access the frontend at [http://localhost:5173](http://localhost:5173), substituting `5173` with the \n   designated port number.\n\n\n6. **Rebuilding After Changes:**  \n   If you make changes to either the frontend or backend, rebuild the Docker images to reflect these changes. Run:\n   ```\n   docker compose up --build\n   ```\n   This command rebuilds the images with your latest changes and restarts the services.\n\n\n## Quickstart without Docker\n\n**Prerequisites**\nThe following instructions assume you have Python 3.11+ installed on your system. We strongly recommend using a virtual \nenvironment to manage dependencies.\n\nFor example, if you are using `pyenv`, you can create a new virtual environment with:\n```shell\npyenv install 3.11\npyenv virtualenv 3.11 opengpts\npyenv activate opengpts\n```\n\nOnce your Python environment is set up, you can install the project dependencies:\n\nThe backend service uses [poetry](https://python-poetry.org/docs/#installation) to manage dependencies.\n\n```shell \npip install poetry\npip install langchain-community\n```\n\n**Install Postgres and the Postgres Vector Extension**\n```\nbrew install postgresql pgvector\nbrew services start postgresql\n```\n\n**Configure persistence layer**\n\nThe backend uses Postgres for saving agent configurations and chat message history.\nIn order to use this, you need to set the following environment variables:\n\n```shell\nexport POSTGRES_HOST=localhost\nexport POSTGRES_PORT=5432\nexport POSTGRES_DB=opengpts\nexport POSTGRES_USER=postgres\nexport POSTGRES_PASSWORD=...\n```\n\n**Create the database**\n```shell\ncreatedb opengpts\n```\n\n**Connect to the database and create the `postgres` role**\n```shell\npsql -d opengpts\n```\n\n```sql\nCREATE ROLE postgres WITH LOGIN SUPERUSER CREATEDB CREATEROLE;\n```\n\n**Install Golang Migrate**\n\nDatabase migrations are managed with [golang-migrate](https://github.com/golang-migrate/migrate). \n\nOn MacOS, you can install it with `brew install golang-migrate`. Instructions for other OSs or the Golang toolchain, \ncan be found [here](https://github.com/golang-migrate/migrate/blob/master/cmd/migrate/README.md#installation).\n\nOnce `golang-migrate` is installed, you can run all the migrations with:\n```shell\nmake migrate\n```\n\nThis will enable the backend to use Postgres as a vector database and create the initial tables.\n\n\n**Install backend dependencies**\n```shell\ncd backend\npoetry install\n```\n\n\n**Alternate vector databases**\n\nThe instructions above use Postgres as a vector database,\nalthough you can easily switch this out to use any of the 50+ vector databases in LangChain.\n\n**Set up language models**\n\nBy default, this uses OpenAI, but there are also options for Azure OpenAI and Anthropic.\nIf you are using those, you may need to set different environment variables.\n\n```shell\nexport OPENAI_API_KEY=\"sk-...\"\n```\n\nOther language models can be used, and in order to use them you will need to set more environment variables.\nSee the section below on `LLMs` for how to configure Azure OpenAI, Anthropic, and Amazon Bedrock.\n\n**Set up tools**\n\nBy default this uses a lot of tools.\nSome of these require additional environment variables.\nYou do not need to use any of these tools, and the environment variables are not required to spin up the app\n(they are only required if that tool is called).\n\nFor a full list of environment variables to enable, see the `Tools` section below.\n\n**Set up monitoring**\n\nSet up [LangSmith](https://smith.langchain.com/).\nThis is optional, but it will help with debugging, logging, monitoring.\nSign up at the link above and then set the relevant environment variables\n\n```shell\nexport LANGCHAIN_TRACING_V2=\"true\"\nexport LANGCHAIN_API_KEY=...\n```\n\nStart the backend server\n\n```shell\nmake start\n```\n\n### Start the frontend\n\n```shell\ncd frontend\nnpm install\nnpm run dev\n```\n\nNavigate to [http://localhost:5173/](http://localhost:5173/) and enjoy!\n\n## Migrating data from Redis to Postgres\n\nRefer to this [guide](tools/redis_to_postgres/README.md) for migrating data from Redis to Postgres.\n\n## Breaking Changes\n\n### Migration 5 - Checkpoint Management Update\nVersion 5 of the database migrations introduces a significant change to how thread checkpoints are managed:\n- Transitions from a pickle-based checkpointing system to a new multi-table checkpoint management system (breaking change)\n- Aligns with LangGraph's new checkpoint architecture for better state management and persistence\n- **Important**: Historical threads/checkpoints (created before this migration) will not be accessible in the UI\n- Previous checkpoint data is preserved in the `old_checkpoints` table but cannot be accessed by the new system\n- This architectural change improves how thread state is stored and managed, enabling more reliable state persistence in LangGraph-based agents.\n\n## Features\n\nAs much as possible, we are striving for feature parity with OpenAI.\n\n- [x] Sandbox - Provides an environment to import, test, and modify existing chatbots.\n  - The chatbots used are all in code, so are easily editable\n- [x] Custom Actions - Define additional functionality for your chatbot using OpenAPI specifications\n  - Supported by adding tools\n- [x] Knowledge Files - attach additional files that your chatbot can reference\n  - Upload files from the UI or API, used by Retrieval tool\n- [x] Tools - Provides basic tools for web browsing, image creation, etc.\n  - Basic DuckDuckGo and PythonREPL tools enabled by default\n  - Image creation coming soon\n- [x] Analytics - View and analyze chatbot usage data\n  - Use LangSmith for this\n- [x] Drafts - Save and share drafts of chatbots you're creating\n  - Supports saving of configurations\n- [x] Publishing - publicly distribute your completed chatbot\n  - Can do by deploying via LangServe\n- [x] Sharing - Set up and manage chatbot sharing\n  - Can do by deploying via LangServe\n- [ ] Marketplace - Search and deploy chatbots created by other users\n  - Coming soon\n\n## Repo Structure\n\n- `frontend`: Code for the frontend\n- `backend`: Code for the backend\n  - `app`: LangServe code (for exposing APIs)\n  - `packages`: Core logic\n    - `agent-executor`: Runtime for the agent\n    - `gizmo-agent`: Configuration for the agent\n\n## Customization\n\nThe big appeal of OpenGPTs as compared to using OpenAI directly is that it is more customizable.\nSpecifically, you can choose which language models to use as well as more easily add custom tools.\nYou can also use the underlying APIs directly and build a custom UI yourself should you choose.\n\n### Cognitive Architecture\n\nThis refers to the logic of how the GPT works.\nThere are currently three different architectures supported, but because they are all written in LangGraph, it is very \neasy to modify them or add your own.\n\nThe three different architectures supported are assistants, RAG, and chatbots.\n\n**Assistants**\n\nAssistants can be equipped with arbitrary amount of tools and use an LLM to decide when to use them. This makes them \nthe most flexible choice, but they work well with fewer models and can be less reliable.\n\nWhen creating an assistant, you specify a few things.\n\nFirst, you choose the language model to use. Only a few language models can be used reliably well: GPT-3.5, GPT-4, \nClaude, and Gemini.\n\nSecond, you choose the tools to use. These can be predefined tools OR a retriever constructed from uploaded files. You \ncan choose however many you want.\n\nThe cognitive architecture can then be thought of as a loop. First, the LLM is called to determine what (if any) \nactions to take. If it decides to take actions, then those actions are executed and it loops back. If no actions are \ndecided to take, then the response of the LLM is the final response, and it finishes the loop.\n\n![](_static/agent.png)\n\nThis can be a really powerful and flexible architecture. This is probably closest to how us humans operate. However, \nthese also can be not super reliable, and generally only work with the more performant models (and even then they can \nmess up). Therefore, we introduced a few simpler architecures.\n\nAssistants are implemented with [LangGraph](https://github.com/langchain-ai/langgraph) `MessageGraph`. A `MessageGraph` is a graph that models its state as a `list` of messages.\n\n**RAGBot**\n\nOne of the big use cases of the GPT store is uploading files and giving the bot knowledge of those files. What would it \nmean to make an architecture more focused on that use case?\n\nWe added RAGBot - a retrieval-focused GPT with a straightforward architecture. First, a set of documents are retrieved. \nThen, those documents are passed in the system message to a separate call to the language model so it can respond.\n\nCompared to assistants, it is more structured (but less powerful). It ALWAYS looks up something - which is good if you \nknow you want to look things up, but potentially wasteful if the user is just trying to have a normal conversation. \nAlso importantly, this only looks up things once - so if it doesn't find the right results then it will yield a bad \nresult (compared to an assistant, which could  decide to look things up again).\n\n![](_static/rag.png)\n\nDespite this being a more simple architecture, it is good for a few reasons. First, because it is simpler it can work \npretty well with a wider variety of models (including lots of open source models). Second, if you have a use case where \nyou don't NEED the flexibility of an assistant (eg you know users will be looking up information every time) then it \ncan be more focused. And third, compared to the final architecture below it can use external knowledge.\n\nRAGBot is implemented with [LangGraph](https://github.com/langchain-ai/langgraph) `StateGraph`. A `StateGraph` is a generalized graph that can model arbitrary state (i.e. `dict`), not just a `list` of messages.\n\n**ChatBot**\n\nThe final architecture is dead simple - just a call to a language model, parameterized by a system message. This allows \nthe GPT to take on different personas and characters. This is clearly far less powerful than Assistants or RAGBots \n(which have access to external sources of data/computation) - but it's still valuable! A lot of popular GPTs are just \nsystem messages at the end of the day, and CharacterAI is crushing it despite largely just being system messages as \nwell.\n\n![](_static/chatbot.png)\n\nChatBot is implemented with [LangGraph](https://github.com/langchain-ai/langgraph) `StateGraph`. A `StateGraph` is a generalized graph that can model arbitrary state (i.e. `dict`), not just a `list` of messages.\n\n### LLMs\n\nYou can choose between different LLMs to use.\nThis takes advantage of LangChain's many integrations.\nIt is important to note that depending on which LLM you use, you may need to change how you are prompting it.\n\nWe have exposed four agent types by default:\n\n- \"GPT 3.5 Turbo\"\n- \"GPT 4\"\n- \"Azure OpenAI\"\n- \"Claude 2\"\n\nWe will work to add more when we have confidence they can work well.\n\nIf you want to add your own LLM or agent configuration, or want to edit the existing ones, you can find them in \n`backend/app/agent_types`\n\n#### Claude 2\n\nIf using Claude 2, you will need to set the following environment variable:\n\n```shell\nexport ANTHROPIC_API_KEY=sk-...\n```\n\n#### Azure OpenAI\n\nIf using Azure OpenAI, you will need to set the following environment variables:\n\n```shell\nexport AZURE_OPENAI_API_BASE=...\nexport AZURE_OPENAI_API_VERSION=...\nexport AZURE_OPENAI_API_KEY=...\nexport AZURE_OPENAI_DEPLOYMENT_NAME=...\n```\n\n#### Amazon Bedrock\n\nIf using Amazon Bedrock, you either have valid credentials in `~/.aws/credentials` or set the following environment \nvariables:\n\n```shell\nexport AWS_ACCESS_KEY_ID=...\nexport AWS_SECRET_ACCESS_KEY=...\n```\n\n### Tools\n\nOne of the big benefits of having this be open source is that you can more easily add tools (directly in Python).\n\nIn practice, most teams we see define their own tools.\nThis is easy to do within LangChain.\nSee [this guide](https://python.langchain.com/docs/modules/agents/tools/custom_tools) for details on how to best do \nthis.\n\nIf you want to use some preconfigured tools, these include:\n\n**_Sema4.ai Action Server_**\n\nRun AI Python based actions with [Sema4.ai Action Server](https://github.com/Sema4AI/actions).\nDoes not require a service API key, but it requires the credentials for a running Action Server instance to be defined.\nThese you set while creating an assistant.\n\n**_Connery Actions_**\n\nConnect OpenGPTs to the real world with [Connery](https://github.com/connery-io/connery).\n\nRequires setting an environment variable, which you get during the [Connery Runner setup](https://docs.connery.io/docs/runner/quick-start/):\n\n```shell\nCONNERY_RUNNER_URL=https://your-personal-connery-runner-url\nCONNERY_RUNNER_API_KEY=...\n```\n\n**DuckDuckGo Search**\n\nSearch the web with [DuckDuckGo](https://pypi.org/project/duckduckgo-search/). Does not require any API keys.\n\n**Tavily Search**\n\nUses the [Tavily](https://app.tavily.com/) search engine. Requires setting an environment variable:\n\n```shell\nexport TAVILY_API_KEY=tvly-...\n```\n\nSign up for an API key [here](https://app.tavily.com/).\n\n**Tavily Search (Answer Only)**\n\nUses the [Tavily](https://app.tavily.com/) search engine.\nThis returns only the answer, no supporting evidence.\nGood when you need a short response (small context windows).\nRequires setting an environment variable:\n\n```shell\nexport TAVILY_API_KEY=tvly-...\n```\n\nSign up for an API key [here](https://app.tavily.com/).\n\n**You.com Search**\n\nUses [You.com](https://you.com/) search, optimized responses for LLMs.\nRequires setting an environment variable:\n\n```shell\nexport YDC_API_KEY=...\n```\n\nSign up for an API key [here](https://you.com/)\n\n**SEC Filings (Kay.ai)**\n\nSearches through SEC filings using [Kay.ai](https://www.kay.ai/).\nRequires setting an environment variable:\n\n```shell\nexport KAY_API_KEY=...\n```\n\nSign up for an API key [here](https://www.kay.ai/)\n\n**Press Releases (Kay.ai)**\n\nSearches through press releases using [Kay.ai](https://www.kay.ai/).\nRequires setting an environment variable:\n\n```shell\nexport KAY_API_KEY=...\n```\n\nSign up for an API key [here](https://www.kay.ai/)\n\n**Arxiv**\n\nSearches [Arxiv](https://arxiv.org/). Does not require any API keys.\n\n**PubMed**\n\nSearches [PubMed](https://pubmed.ncbi.nlm.nih.gov/). Does not require any API keys.\n\n**Wikipedia**\n\nSearches [Wikipedia](https://pypi.org/project/wikipedia/). Does not require any API keys.\n\n## Deployment\n\n### Deploy via Cloud Run\n\n**1. Build the frontend**\n\n```shell\ncd frontend\nyarn\nyarn build\n```\n\n**2. Deploy to Google Cloud Run**\n\nYou can deploy to GCP Cloud Run using the following command:\n\nFirst create a `.env.gcp.yaml` file with the contents from `.env.gcp.yaml.example` and fill in the values. Then run:\n\n```shell\ngcloud run deploy opengpts --source . --port 8000 --env-vars-file .env.gcp.yaml --allow-unauthenticated \\\n--region us-central1 --min-instances 1\n```\n\n### Deploy in Kubernetes\n\nWe have a Helm chart for deploying the backend to Kubernetes. You can find more information here: \n[README.md](https://github.com/langchain-ai/helm/blob/main/charts/open-gpts/README.md)\n"
  },
  {
    "path": "auth.md",
    "content": "# Auth\n\nBy default, we're using cookies as a mock auth method. It's for trying out OpenGPTs.\nFor production, we recommend using JWT auth, outlined below.\n\n## JWT Auth: Options\n\nThere are two ways to use JWT: Local and OIDC. The main difference is in how the key\nused to decode the JWT is obtained. For the Local method, you'll provide the decode\nkey as a Base64-encoded string in an environment variable. For the OIDC method, the\nkey is obtained from the OIDC provider automatically.\n\n### JWT OIDC\n\nIf you're looking to integrate with an identity provider, OIDC is the way to go.\nIt will figure out the decode key for you, so you don't have to worry about it.\nJust set `AUTH_TYPE=jwt_oidc` along with the issuer and audience. Audience can\nbe one or many - just separate them with commas.\n\n```bash\nexport AUTH_TYPE=jwt_oidc\nexport JWT_ISS=<issuer>\nexport JWT_AUD=<audience>  # or <audience1>,<audience2>,...\n```\n\n### JWT Local\n\nTo use JWT Local, set `AUTH_TYPE=jwt_local`. Then, set the issuer, audience,\nalgorithm used to sign the JWT, and the decode key in Base64 format.\n\n```bash\nexport AUTH_TYPE=jwt_local\nexport JWT_ISS=<issuer>\nexport JWT_AUD=<audience>\nexport JWT_ALG=<algorithm>  # e.g. ES256\nexport JWT_DECODE_KEY_B64=<base64_decode_key>\n```\n\nBase64 is used for the decode key because handling multiline strings in environment\nvariables is error-prone. Base64 makes it a one-liner, easy to paste in and use.\n\n\n## Making Requests\n\nTo make authenticated requests, include the JWT in the `Authorization` header as a Bearer token:\n\n```\nAuthorization: Bearer <JWT>\n```\n\n\n"
  },
  {
    "path": "backend/.gitignore",
    "content": ".envrc\nui\n"
  },
  {
    "path": "backend/Dockerfile",
    "content": "# Backend Dockerfile\nFROM python:3.11\n\nARG TARGETOS\nARG TARGETARCH\nARG TARGETVARIANT\n\n# Install system dependencies\nRUN apt-get update && rm -rf /var/lib/apt/lists/*\nRUN wget -O golang-migrate.deb https://github.com/golang-migrate/migrate/releases/download/v4.17.0/migrate.${TARGETOS}-${TARGETARCH}${TARGETVARIANT}.deb \\\n    && dpkg -i golang-migrate.deb \\\n    && rm golang-migrate.deb\n\n# Install Poetry\nRUN pip install poetry\n\n# Set the working directory\nWORKDIR /backend\n\n# Copy only dependencies\nCOPY pyproject.toml poetry.lock* ./\n\n# Install all dependencies\nRUN poetry config virtualenvs.create false \\\n    && poetry install --no-interaction --no-ansi\n\n# Copy the rest of application code\nCOPY . .\n\nHEALTHCHECK --interval=30s --timeout=5s --start-period=10s --start-interval=1s --retries=3 CMD [ \"curl\", \"-f\", \"http://localhost:8000/health\" ]\n\nENTRYPOINT [ \"uvicorn\", \"app.server:app\", \"--host\", \"0.0.0.0\", \"--log-config\", \"log_config.json\" ]\n"
  },
  {
    "path": "backend/Makefile",
    "content": ".PHONY: all lint format test help\n\n# Default target executed when no arguments are given to make.\nall: help\n\nbuild_ui:\n\tcd ../frontend && yarn build && cp -r dist/* ../backend/ui\n\n######################\n# TESTING AND COVERAGE\n######################\n\n# Define a variable for the test file path.\nTEST_FILE ?= tests/unit_tests/\n\nstart:\n\tpoetry run uvicorn app.server:app --reload --port 8100 --log-config log_config.json\n\nmigrate:\n\tmigrate -database postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable -path ./migrations up\n\ntest:\n\t# We need to update handling of env variables for tests\n\tYDC_API_KEY=placeholder OPENAI_API_KEY=placeholder poetry run pytest $(TEST_FILE)\n\n\ntest_watch:\n\t# We need to update handling of env variables for tests\n\tYDC_API_KEY=placeholder OPENAI_API_KEY=placeholder poetry run ptw . -- $(TEST_FILE)\n\n######################\n# LINTING AND FORMATTING\n######################\n\n# Define a variable for Python and notebook files.\nPYTHON_FILES=.\nlint format: PYTHON_FILES=.\nlint_diff format_diff: PYTHON_FILES=$(shell git diff --relative=. --name-only --diff-filter=d master | grep -E '\\.py$$|\\.ipynb$$')\n\nlint lint_diff:\n\tpoetry run ruff .\n\tpoetry run ruff format $(PYTHON_FILES) --check\n\nformat format_diff:\n\tpoetry run ruff format $(PYTHON_FILES)\n\tpoetry run ruff --select I --fix $(PYTHON_FILES)\n\nspell_check:\n\tpoetry run codespell --toml pyproject.toml\n\nspell_fix:\n\tpoetry run codespell --toml pyproject.toml -w\n\n######################\n# HELP\n######################\n\nhelp:\n\t@echo '===================='\n\t@echo '-- LINTING --'\n\t@echo 'format                       - run code formatters'\n\t@echo 'lint                         - run linters'\n\t@echo 'spell_check                 \t- run codespell on the project'\n\t@echo 'spell_fix                \t\t- run codespell on the project and fix the errors'\n\t@echo '-- TESTS --'\n\t@echo 'coverage                     - run unit tests and generate coverage report'\n\t@echo 'test                         - run unit tests'\n\t@echo 'test TEST_FILE=<test_file>   - run all tests in file'\n\t@echo '-- DOCUMENTATION tasks are from the top-level Makefile --'\n"
  },
  {
    "path": "backend/README.md",
    "content": "# backend\n\n## Database Migrations\n\n### Migration 5 - Checkpoint Management Update\nThis migration introduces a significant change to thread checkpoint management:\n\n#### Changes\n- Transitions from single-table pickle storage to a robust multi-table checkpoint management system\n- Implements LangGraph's latest checkpoint architecture for improved state persistence\n- Preserves existing checkpoint data by renaming `checkpoints` table to `old_checkpoints`\n- Introduces three new tables for better checkpoint management:\n  - `checkpoints`: Core checkpoint metadata\n  - `checkpoint_blobs`: Actual checkpoint data storage (compatible with LangGraph state serialization)\n  - `checkpoint_writes`: Tracks checkpoint write operations\n- Adds runtime initialization via `ensure_setup()` in the lifespan event\n\n#### Impact\n- **Breaking Change**: Historical threads/checkpoints (pre-migration) will not be accessible in the UI\n- Previous checkpoint data remains preserved but inaccessible in the new system\n- Designed to work seamlessly with LangGraph's state persistence requirements\n\n#### Migration Details\n- **Up Migration**: Safely preserves existing data by renaming the table\n- **Down Migration**: Restores original table structure if needed\n- New checkpoint management tables are automatically created at application startup\n"
  },
  {
    "path": "backend/app/__init__.py",
    "content": ""
  },
  {
    "path": "backend/app/agent.py",
    "content": "from enum import Enum\nfrom typing import Any, Dict, Mapping, Optional, Sequence, Union\n\nfrom langchain_core.messages import AnyMessage\nfrom langchain_core.runnables import (\n    ConfigurableField,\n    RunnableBinding,\n)\nfrom langgraph.graph.message import Messages\nfrom langgraph.pregel import Pregel\n\nfrom app.agent_types.tools_agent import get_tools_agent_executor\nfrom app.agent_types.xml_agent import get_xml_agent_executor\nfrom app.chatbot import get_chatbot_executor\nfrom app.checkpoint import AsyncPostgresCheckpoint\nfrom app.llms import (\n    get_anthropic_llm,\n    get_google_llm,\n    get_mixtral_fireworks,\n    get_ollama_llm,\n    get_openai_llm,\n)\nfrom app.retrieval import get_retrieval_executor\nfrom app.tools import (\n    RETRIEVAL_DESCRIPTION,\n    TOOLS,\n    ActionServer,\n    Arxiv,\n    AvailableTools,\n    Connery,\n    DallE,\n    DDGSearch,\n    PressReleases,\n    PubMed,\n    Retrieval,\n    SecFilings,\n    Tavily,\n    TavilyAnswer,\n    Wikipedia,\n    YouSearch,\n    get_retrieval_tool,\n    get_retriever,\n)\n\nTool = Union[\n    ActionServer,\n    Connery,\n    DDGSearch,\n    Arxiv,\n    YouSearch,\n    SecFilings,\n    PressReleases,\n    PubMed,\n    Wikipedia,\n    Tavily,\n    TavilyAnswer,\n    Retrieval,\n    DallE,\n]\n\n\nclass AgentType(str, Enum):\n    GPT_35_TURBO = \"GPT 3.5 Turbo\"\n    GPT_4 = \"GPT 4 Turbo\"\n    GPT_4O = \"GPT 4o\"\n    AZURE_OPENAI = \"GPT 4 (Azure OpenAI)\"\n    CLAUDE2 = \"Claude 2\"\n    BEDROCK_CLAUDE2 = \"Claude 2 (Amazon Bedrock)\"\n    GEMINI = \"GEMINI\"\n    OLLAMA = \"Ollama\"\n\n\nDEFAULT_SYSTEM_MESSAGE = \"You are a helpful assistant.\"\n\nCHECKPOINTER = AsyncPostgresCheckpoint()\n\n\ndef get_agent_executor(\n    tools: list,\n    agent: AgentType,\n    system_message: str,\n    interrupt_before_action: bool,\n):\n    if agent == AgentType.GPT_35_TURBO:\n        llm = get_openai_llm()\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.GPT_4:\n        llm = get_openai_llm(model=\"gpt-4-turbo\")\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.GPT_4O:\n        llm = get_openai_llm(model=\"gpt-4o\")\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.AZURE_OPENAI:\n        llm = get_openai_llm(azure=True)\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.CLAUDE2:\n        llm = get_anthropic_llm()\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.BEDROCK_CLAUDE2:\n        llm = get_anthropic_llm(bedrock=True)\n        return get_xml_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.GEMINI:\n        llm = get_google_llm()\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    elif agent == AgentType.OLLAMA:\n        llm = get_ollama_llm()\n        return get_tools_agent_executor(\n            tools, llm, system_message, interrupt_before_action, CHECKPOINTER\n        )\n    else:\n        raise ValueError(\"Unexpected agent type\")\n\n\nclass ConfigurableAgent(RunnableBinding):\n    tools: Sequence[Tool]\n    agent: AgentType\n    system_message: str = DEFAULT_SYSTEM_MESSAGE\n    retrieval_description: str = RETRIEVAL_DESCRIPTION\n    interrupt_before_action: bool = False\n    assistant_id: Optional[str] = None\n    thread_id: Optional[str] = \"\"\n    user_id: Optional[str] = None\n\n    def __init__(\n        self,\n        *,\n        tools: Sequence[Tool],\n        agent: AgentType = AgentType.GPT_35_TURBO,\n        system_message: str = DEFAULT_SYSTEM_MESSAGE,\n        assistant_id: Optional[str] = None,\n        thread_id: Optional[str] = \"\",\n        retrieval_description: str = RETRIEVAL_DESCRIPTION,\n        interrupt_before_action: bool = False,\n        kwargs: Optional[Mapping[str, Any]] = None,\n        config: Optional[Mapping[str, Any]] = None,\n        **others: Any,\n    ) -> None:\n        others.pop(\"bound\", None)\n        _tools = []\n        for _tool in tools:\n            if _tool[\"type\"] == AvailableTools.RETRIEVAL:\n                if assistant_id is None or thread_id is None:\n                    raise ValueError(\n                        \"Both assistant_id and thread_id must be provided if Retrieval tool is used\"\n                    )\n                _tools.append(\n                    get_retrieval_tool(assistant_id, thread_id, retrieval_description)\n                )\n            else:\n                tool_config = _tool.get(\"config\", {})\n                _returned_tools = TOOLS[_tool[\"type\"]](**tool_config)\n                if isinstance(_returned_tools, list):\n                    _tools.extend(_returned_tools)\n                else:\n                    _tools.append(_returned_tools)\n        _agent = get_agent_executor(\n            _tools, agent, system_message, interrupt_before_action\n        )\n        agent_executor = _agent.with_config({\"recursion_limit\": 50})\n        super().__init__(\n            tools=tools,\n            agent=agent,\n            system_message=system_message,\n            retrieval_description=retrieval_description,\n            bound=agent_executor,\n            kwargs=kwargs or {},\n            config=config or {},\n        )\n\n\nclass LLMType(str, Enum):\n    GPT_35_TURBO = \"GPT 3.5 Turbo\"\n    GPT_4 = \"GPT 4 Turbo\"\n    GPT_4O = \"GPT 4o\"\n    AZURE_OPENAI = \"GPT 4 (Azure OpenAI)\"\n    CLAUDE2 = \"Claude 2\"\n    BEDROCK_CLAUDE2 = \"Claude 2 (Amazon Bedrock)\"\n    GEMINI = \"GEMINI\"\n    MIXTRAL = \"Mixtral\"\n    OLLAMA = \"Ollama\"\n\n\ndef get_chatbot(\n    llm_type: LLMType,\n    system_message: str,\n):\n    if llm_type == LLMType.GPT_35_TURBO:\n        llm = get_openai_llm()\n    elif llm_type == LLMType.GPT_4:\n        llm = get_openai_llm(model=\"gpt-4\")\n    elif llm_type == LLMType.GPT_4O:\n        llm = get_openai_llm(model=\"gpt-4o\")\n    elif llm_type == LLMType.AZURE_OPENAI:\n        llm = get_openai_llm(azure=True)\n    elif llm_type == LLMType.CLAUDE2:\n        llm = get_anthropic_llm()\n    elif llm_type == LLMType.BEDROCK_CLAUDE2:\n        llm = get_anthropic_llm(bedrock=True)\n    elif llm_type == LLMType.GEMINI:\n        llm = get_google_llm()\n    elif llm_type == LLMType.MIXTRAL:\n        llm = get_mixtral_fireworks()\n    elif llm_type == LLMType.OLLAMA:\n        llm = get_ollama_llm()\n    else:\n        raise ValueError(\"Unexpected llm type\")\n    return get_chatbot_executor(llm, system_message, CHECKPOINTER)\n\n\nclass ConfigurableChatBot(RunnableBinding):\n    llm: LLMType\n    system_message: str = DEFAULT_SYSTEM_MESSAGE\n    user_id: Optional[str] = None\n\n    def __init__(\n        self,\n        *,\n        llm: LLMType = LLMType.GPT_35_TURBO,\n        system_message: str = DEFAULT_SYSTEM_MESSAGE,\n        kwargs: Optional[Mapping[str, Any]] = None,\n        config: Optional[Mapping[str, Any]] = None,\n        **others: Any,\n    ) -> None:\n        others.pop(\"bound\", None)\n\n        chatbot = get_chatbot(llm, system_message)\n        super().__init__(\n            llm=llm,\n            system_message=system_message,\n            bound=chatbot,\n            kwargs=kwargs or {},\n            config=config or {},\n        )\n\n\nchatbot = (\n    ConfigurableChatBot(llm=LLMType.GPT_35_TURBO, checkpoint=CHECKPOINTER)\n    .configurable_fields(\n        llm=ConfigurableField(id=\"llm_type\", name=\"LLM Type\"),\n        system_message=ConfigurableField(id=\"system_message\", name=\"Instructions\"),\n    )\n    .with_types(\n        input_type=Messages,\n        output_type=Sequence[AnyMessage],\n    )\n)\n\n\nclass ConfigurableRetrieval(RunnableBinding):\n    llm_type: LLMType\n    system_message: str = DEFAULT_SYSTEM_MESSAGE\n    assistant_id: Optional[str] = None\n    thread_id: Optional[str] = \"\"\n    user_id: Optional[str] = None\n\n    def __init__(\n        self,\n        *,\n        llm_type: LLMType = LLMType.GPT_35_TURBO,\n        system_message: str = DEFAULT_SYSTEM_MESSAGE,\n        assistant_id: Optional[str] = None,\n        thread_id: Optional[str] = \"\",\n        kwargs: Optional[Mapping[str, Any]] = None,\n        config: Optional[Mapping[str, Any]] = None,\n        **others: Any,\n    ) -> None:\n        others.pop(\"bound\", None)\n        retriever = get_retriever(assistant_id, thread_id)\n        if llm_type == LLMType.GPT_35_TURBO:\n            llm = get_openai_llm()\n        elif llm_type == LLMType.GPT_4:\n            llm = get_openai_llm(model=\"gpt-4-turbo\")\n        elif llm_type == LLMType.GPT_4O:\n            llm = get_openai_llm(model=\"gpt-4o\")\n        elif llm_type == LLMType.AZURE_OPENAI:\n            llm = get_openai_llm(azure=True)\n        elif llm_type == LLMType.CLAUDE2:\n            llm = get_anthropic_llm()\n        elif llm_type == LLMType.BEDROCK_CLAUDE2:\n            llm = get_anthropic_llm(bedrock=True)\n        elif llm_type == LLMType.GEMINI:\n            llm = get_google_llm()\n        elif llm_type == LLMType.MIXTRAL:\n            llm = get_mixtral_fireworks()\n        elif llm_type == LLMType.OLLAMA:\n            llm = get_ollama_llm()\n        else:\n            raise ValueError(\"Unexpected llm type\")\n        chatbot = get_retrieval_executor(llm, retriever, system_message, CHECKPOINTER)\n        super().__init__(\n            llm_type=llm_type,\n            system_message=system_message,\n            bound=chatbot,\n            kwargs=kwargs or {},\n            config=config or {},\n        )\n\n\nchat_retrieval = (\n    ConfigurableRetrieval(llm_type=LLMType.GPT_35_TURBO, checkpoint=CHECKPOINTER)\n    .configurable_fields(\n        llm_type=ConfigurableField(id=\"llm_type\", name=\"LLM Type\"),\n        system_message=ConfigurableField(id=\"system_message\", name=\"Instructions\"),\n        assistant_id=ConfigurableField(\n            id=\"assistant_id\", name=\"Assistant ID\", is_shared=True\n        ),\n        thread_id=ConfigurableField(\n            id=\"thread_id\", name=\"Thread ID\", annotation=str, is_shared=True\n        ),\n    )\n    .with_types(\n        input_type=Dict[str, Any],\n        output_type=Dict[str, Any],\n    )\n)\n\n\nagent: Pregel = (\n    ConfigurableAgent(\n        agent=AgentType.GPT_35_TURBO,\n        tools=[],\n        system_message=DEFAULT_SYSTEM_MESSAGE,\n        retrieval_description=RETRIEVAL_DESCRIPTION,\n        assistant_id=None,\n        thread_id=\"\",\n    )\n    .configurable_fields(\n        agent=ConfigurableField(id=\"agent_type\", name=\"Agent Type\"),\n        system_message=ConfigurableField(id=\"system_message\", name=\"Instructions\"),\n        interrupt_before_action=ConfigurableField(\n            id=\"interrupt_before_action\",\n            name=\"Tool Confirmation\",\n            description=\"If Yes, you'll be prompted to continue before each tool is executed.\\nIf No, tools will be executed automatically by the agent.\",\n        ),\n        assistant_id=ConfigurableField(\n            id=\"assistant_id\", name=\"Assistant ID\", is_shared=True\n        ),\n        thread_id=ConfigurableField(\n            id=\"thread_id\", name=\"Thread ID\", annotation=str, is_shared=True\n        ),\n        tools=ConfigurableField(id=\"tools\", name=\"Tools\"),\n        retrieval_description=ConfigurableField(\n            id=\"retrieval_description\", name=\"Retrieval Description\"\n        ),\n    )\n    .configurable_alternatives(\n        ConfigurableField(id=\"type\", name=\"Bot Type\"),\n        default_key=\"agent\",\n        prefix_keys=True,\n        chatbot=chatbot,\n        chat_retrieval=chat_retrieval,\n    )\n    .with_types(\n        input_type=Messages,\n        output_type=Sequence[AnyMessage],\n    )\n)\n\nif __name__ == \"__main__\":\n    import asyncio\n\n    from langchain.schema.messages import HumanMessage\n\n    async def run():\n        async for m in agent.astream_events(\n            HumanMessage(content=\"whats your name\"),\n            config={\"configurable\": {\"user_id\": \"2\", \"thread_id\": \"test1\"}},\n            version=\"v1\",\n        ):\n            print(m)\n\n    asyncio.run(run())\n"
  },
  {
    "path": "backend/app/agent_types/__init__.py",
    "content": ""
  },
  {
    "path": "backend/app/agent_types/prompts.py",
    "content": "xml_template = \"\"\"{system_message}\n\nYou have access to the following tools:\n\n{tools}\n\nIn order to use a tool, you can use <tool></tool> and <tool_input></tool_input> tags. You will then get back a response in the form <observation></observation>\nFor example, if you have a tool called 'search' that could run a google search, in order to search for the weather in SF you would respond:\n\n<tool>search</tool><tool_input>weather in SF</tool_input>\n<observation>64 degrees</observation>\n\nWhen you are done, you can respond as normal to the user.\n\nExample 1:\n\nHuman: Hi!\n\nAssistant: Hi! How are you?\n\nHuman: What is the weather in SF?\nAssistant: <tool>search</tool><tool_input>weather in SF</tool_input>\n<observation>64 degrees</observation>\nIt is 64 degrees in SF\n\n\nBegin!\"\"\"\n"
  },
  {
    "path": "backend/app/agent_types/tools_agent.py",
    "content": "from typing import cast\n\nfrom langchain.tools import BaseTool\nfrom langchain_core.language_models.base import LanguageModelLike\nfrom langchain_core.messages import (\n    AIMessage,\n    FunctionMessage,\n    HumanMessage,\n    SystemMessage,\n    ToolMessage,\n)\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.graph import END\nfrom langgraph.graph.message import MessageGraph\nfrom langgraph.prebuilt import ToolExecutor, ToolInvocation\n\nfrom app.message_types import LiberalToolMessage\n\n\ndef get_tools_agent_executor(\n    tools: list[BaseTool],\n    llm: LanguageModelLike,\n    system_message: str,\n    interrupt_before_action: bool,\n    checkpoint: BaseCheckpointSaver,\n):\n    async def _get_messages(messages):\n        msgs = []\n        for m in messages:\n            if isinstance(m, LiberalToolMessage):\n                _dict = m.model_dump()\n                _dict[\"content\"] = str(_dict[\"content\"])\n                m_c = ToolMessage(**_dict)\n                msgs.append(m_c)\n            elif isinstance(m, FunctionMessage):\n                # anthropic doesn't like function messages\n                msgs.append(HumanMessage(content=str(m.content)))\n            else:\n                msgs.append(m)\n\n        return [SystemMessage(content=system_message)] + msgs\n\n    if tools:\n        llm_with_tools = llm.bind_tools(tools)\n    else:\n        llm_with_tools = llm\n    agent = _get_messages | llm_with_tools\n    tool_executor = ToolExecutor(tools)\n\n    # Define the function that determines whether to continue or not\n    def should_continue(messages):\n        last_message = messages[-1]\n        # If there is no function call, then we finish\n        if not last_message.tool_calls:\n            return \"end\"\n        # Otherwise if there is, we continue\n        else:\n            return \"continue\"\n\n    # Define the function to execute tools\n    async def call_tool(messages):\n        actions: list[ToolInvocation] = []\n        # Based on the continue condition\n        # we know the last message involves a function call\n        last_message = cast(AIMessage, messages[-1])\n        for tool_call in last_message.tool_calls:\n            # We construct a ToolInvocation from the function_call\n            actions.append(\n                ToolInvocation(\n                    tool=tool_call[\"name\"],\n                    tool_input=tool_call[\"args\"],\n                )\n            )\n        # We call the tool_executor and get back a response\n        responses = await tool_executor.abatch(actions)\n        # We use the response to create a ToolMessage\n        tool_messages = [\n            LiberalToolMessage(\n                tool_call_id=tool_call[\"id\"],\n                name=tool_call[\"name\"],\n                content=response,\n            )\n            for tool_call, response in zip(last_message.tool_calls, responses)\n        ]\n        return tool_messages\n\n    workflow = MessageGraph()\n\n    # Define the two nodes we will cycle between\n    workflow.add_node(\"agent\", agent)\n    workflow.add_node(\"action\", call_tool)\n\n    # Set the entrypoint as `agent`\n    # This means that this node is the first one called\n    workflow.set_entry_point(\"agent\")\n\n    # We now add a conditional edge\n    workflow.add_conditional_edges(\n        # First, we define the start node. We use `agent`.\n        # This means these are the edges taken after the `agent` node is called.\n        \"agent\",\n        # Next, we pass in the function that will determine which node is called next.\n        should_continue,\n        # Finally we pass in a mapping.\n        # The keys are strings, and the values are other nodes.\n        # END is a special node marking that the graph should finish.\n        # What will happen is we will call `should_continue`, and then the output of that\n        # will be matched against the keys in this mapping.\n        # Based on which one it matches, that node will then be called.\n        {\n            # If `tools`, then we call the tool node.\n            \"continue\": \"action\",\n            # Otherwise we finish.\n            \"end\": END,\n        },\n    )\n\n    # We now add a normal edge from `tools` to `agent`.\n    # This means that after `tools` is called, `agent` node is called next.\n    workflow.add_edge(\"action\", \"agent\")\n\n    # Finally, we compile it!\n    # This compiles it into a LangChain Runnable,\n    # meaning you can use it as you would any other runnable\n    return workflow.compile(\n        checkpointer=checkpoint,\n        interrupt_before=[\"action\"] if interrupt_before_action else None,\n    )\n"
  },
  {
    "path": "backend/app/agent_types/xml_agent.py",
    "content": "from langchain.tools import BaseTool\nfrom langchain.tools.render import render_text_description\nfrom langchain_core.language_models.base import LanguageModelLike\nfrom langchain_core.messages import (\n    AIMessage,\n    FunctionMessage,\n    HumanMessage,\n    SystemMessage,\n)\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.graph import END\nfrom langgraph.graph.message import MessageGraph\nfrom langgraph.prebuilt import ToolExecutor, ToolInvocation\n\nfrom app.agent_types.prompts import xml_template\nfrom app.message_types import LiberalFunctionMessage\n\n\ndef _collapse_messages(messages):\n    log = \"\"\n    if isinstance(messages[-1], AIMessage):\n        scratchpad = messages[:-1]\n        final = messages[-1]\n    else:\n        scratchpad = messages\n        final = None\n    if len(scratchpad) % 2 != 0:\n        raise ValueError(\"Unexpected\")\n    for i in range(0, len(scratchpad), 2):\n        action = messages[i]\n        observation = messages[i + 1]\n        log += f\"{action.content}<observation>{observation.content}</observation>\"\n    if final is not None:\n        log += final.content\n    return AIMessage(content=log)\n\n\ndef construct_chat_history(messages):\n    collapsed_messages = []\n    temp_messages = []\n    for message in messages:\n        if isinstance(message, HumanMessage):\n            if temp_messages:\n                collapsed_messages.append(_collapse_messages(temp_messages))\n                temp_messages = []\n            collapsed_messages.append(message)\n        elif isinstance(message, LiberalFunctionMessage):\n            _dict = message.model_dump()\n            _dict[\"content\"] = str(_dict[\"content\"])\n            m_c = FunctionMessage(**_dict)\n            temp_messages.append(m_c)\n        else:\n            temp_messages.append(message)\n\n    # Don't forget to add the last non-human message if it exists\n    if temp_messages:\n        collapsed_messages.append(_collapse_messages(temp_messages))\n\n    return collapsed_messages\n\n\ndef get_xml_agent_executor(\n    tools: list[BaseTool],\n    llm: LanguageModelLike,\n    system_message: str,\n    interrupt_before_action: bool,\n    checkpoint: BaseCheckpointSaver,\n):\n    formatted_system_message = xml_template.format(\n        system_message=system_message,\n        tools=render_text_description(tools),\n        tool_names=\", \".join([t.name for t in tools]),\n    )\n\n    llm_with_stop = llm.bind(stop=[\"</tool_input>\", \"<observation>\"])\n\n    def _get_messages(messages):\n        return [\n            SystemMessage(content=formatted_system_message)\n        ] + construct_chat_history(messages)\n\n    agent = _get_messages | llm_with_stop\n    tool_executor = ToolExecutor(tools)\n\n    # Define the function that determines whether to continue or not\n    def should_continue(messages):\n        last_message = messages[-1]\n        if \"</tool>\" in last_message.content:\n            return \"continue\"\n        else:\n            return \"end\"\n\n    # Define the function to execute tools\n    async def call_tool(messages):\n        # Based on the continue condition\n        # we know the last message involves a function call\n        last_message = messages[-1]\n        # We construct an ToolInvocation from the function_call\n        tool, tool_input = last_message.content.split(\"</tool>\")\n        _tool = tool.split(\"<tool>\")[1]\n        if \"<tool_input>\" not in tool_input:\n            _tool_input = \"\"\n        else:\n            _tool_input = tool_input.split(\"<tool_input>\")[1]\n            if \"</tool_input>\" in _tool_input:\n                _tool_input = _tool_input.split(\"</tool_input>\")[0]\n        action = ToolInvocation(\n            tool=_tool,\n            tool_input=_tool_input,\n        )\n        # We call the tool_executor and get back a response\n        response = await tool_executor.ainvoke(action)\n        # We use the response to create a FunctionMessage\n        function_message = LiberalFunctionMessage(content=response, name=action.tool)\n        # We return a list, because this will get added to the existing list\n        return function_message\n\n    workflow = MessageGraph()\n\n    # Define the two nodes we will cycle between\n    workflow.add_node(\"agent\", agent)\n    workflow.add_node(\"action\", call_tool)\n\n    # Set the entrypoint as `agent`\n    # This means that this node is the first one called\n    workflow.set_entry_point(\"agent\")\n\n    # We now add a conditional edge\n    workflow.add_conditional_edges(\n        # First, we define the start node. We use `agent`.\n        # This means these are the edges taken after the `agent` node is called.\n        \"agent\",\n        # Next, we pass in the function that will determine which node is called next.\n        should_continue,\n        # Finally we pass in a mapping.\n        # The keys are strings, and the values are other nodes.\n        # END is a special node marking that the graph should finish.\n        # What will happen is we will call `should_continue`, and then the output of that\n        # will be matched against the keys in this mapping.\n        # Based on which one it matches, that node will then be called.\n        {\n            # If `tools`, then we call the tool node.\n            \"continue\": \"action\",\n            # Otherwise we finish.\n            \"end\": END,\n        },\n    )\n\n    # We now add a normal edge from `tools` to `agent`.\n    # This means that after `tools` is called, `agent` node is called next.\n    workflow.add_edge(\"action\", \"agent\")\n\n    # Finally, we compile it!\n    # This compiles it into a LangChain Runnable,\n    # meaning you can use it as you would any other runnable\n    return workflow.compile(\n        checkpointer=checkpoint,\n        interrupt_before=[\"action\"] if interrupt_before_action else None,\n    )\n"
  },
  {
    "path": "backend/app/api/__init__.py",
    "content": "from fastapi import APIRouter\n\nfrom app.api.assistants import router as assistants_router\nfrom app.api.runs import router as runs_router\nfrom app.api.threads import router as threads_router\n\nrouter = APIRouter()\n\n\n@router.get(\"/ok\")\nasync def ok():\n    return {\"ok\": True}\n\n\nrouter.include_router(\n    assistants_router,\n    prefix=\"/assistants\",\n    tags=[\"assistants\"],\n)\nrouter.include_router(\n    runs_router,\n    prefix=\"/runs\",\n    tags=[\"runs\"],\n)\nrouter.include_router(\n    threads_router,\n    prefix=\"/threads\",\n    tags=[\"threads\"],\n)\n"
  },
  {
    "path": "backend/app/api/assistants.py",
    "content": "from typing import Annotated, List\nfrom uuid import uuid4\n\nfrom fastapi import APIRouter, HTTPException, Path\nfrom pydantic import BaseModel, Field\n\nimport app.storage as storage\nfrom app.auth.handlers import AuthedUser\nfrom app.schema import Assistant\n\nrouter = APIRouter()\n\n\nclass AssistantPayload(BaseModel):\n    \"\"\"Payload for creating an assistant.\"\"\"\n\n    name: Annotated[str, Field(description=\"The name of the assistant.\")]\n    config: Annotated[dict, Field(description=\"The assistant config.\")]\n    public: Annotated[\n        bool, Field(default=False, description=\"Whether the assistant is public.\")\n    ]\n\n\nAssistantID = Annotated[str, Path(description=\"The ID of the assistant.\")]\n\n\n@router.get(\"/\")\nasync def list_assistants(user: AuthedUser) -> List[Assistant]:\n    \"\"\"List all assistants for the current user.\"\"\"\n    return await storage.list_assistants(user.user_id)\n\n\n@router.get(\"/public/\")\nasync def list_public_assistants() -> List[Assistant]:\n    \"\"\"List all public assistants.\"\"\"\n    return await storage.list_public_assistants()\n\n\n@router.get(\"/{aid}\")\nasync def get_assistant(\n    user: AuthedUser,\n    aid: AssistantID,\n) -> Assistant:\n    \"\"\"Get an assistant by ID.\"\"\"\n    assistant = await storage.get_assistant(user.user_id, aid)\n    if not assistant:\n        raise HTTPException(status_code=404, detail=\"Assistant not found\")\n    return assistant\n\n\n@router.post(\"\")\nasync def create_assistant(\n    user: AuthedUser,\n    payload: AssistantPayload,\n) -> Assistant:\n    \"\"\"Create an assistant.\"\"\"\n    return await storage.put_assistant(\n        user.user_id,\n        str(uuid4()),\n        name=payload.name,\n        config=payload.config,\n        public=payload.public,\n    )\n\n\n@router.put(\"/{aid}\")\nasync def upsert_assistant(\n    user: AuthedUser,\n    aid: AssistantID,\n    payload: AssistantPayload,\n) -> Assistant:\n    \"\"\"Create or update an assistant.\"\"\"\n    return await storage.put_assistant(\n        user.user_id,\n        aid,\n        name=payload.name,\n        config=payload.config,\n        public=payload.public,\n    )\n\n\n@router.delete(\"/{aid}\")\nasync def delete_assistant(\n    user: AuthedUser,\n    aid: AssistantID,\n):\n    \"\"\"Delete an assistant by ID.\"\"\"\n    await storage.delete_assistant(user.user_id, aid)\n    return {\"status\": \"ok\"}\n"
  },
  {
    "path": "backend/app/api/runs.py",
    "content": "from typing import Any, Dict, Optional, Sequence, Union\nfrom uuid import UUID\n\nimport langsmith.client\nfrom fastapi import APIRouter, BackgroundTasks, HTTPException\nfrom fastapi.exceptions import RequestValidationError\nfrom langchain_core.messages import AnyMessage\nfrom langchain_core.runnables import RunnableConfig\nfrom langsmith.utils import tracing_is_enabled\nfrom pydantic import BaseModel, Field, ValidationError\nfrom sse_starlette import EventSourceResponse\n\nfrom app.agent import agent, chat_retrieval, chatbot\nfrom app.auth.handlers import AuthedUser\nfrom app.storage import get_assistant, get_thread\nfrom app.stream import astream_state, to_sse\n\nrouter = APIRouter()\n\n\nclass CreateRunPayload(BaseModel):\n    \"\"\"Payload for creating a run.\"\"\"\n\n    thread_id: str\n    input: Optional[Union[Sequence[AnyMessage], Dict[str, Any]]] = Field(\n        default_factory=dict\n    )\n    config: Optional[RunnableConfig] = None\n\n\nasync def _run_input_and_config(payload: CreateRunPayload, user_id: str):\n    thread = await get_thread(user_id, payload.thread_id)\n    if not thread:\n        raise HTTPException(status_code=404, detail=\"Thread not found\")\n\n    assistant = await get_assistant(user_id, str(thread.assistant_id))\n    if not assistant:\n        raise HTTPException(status_code=404, detail=\"Assistant not found\")\n\n    config: RunnableConfig = {\n        **assistant.config,\n        \"configurable\": {\n            **assistant.config[\"configurable\"],\n            **((payload.config or {}).get(\"configurable\") or {}),\n            \"user_id\": user_id,\n            \"thread_id\": str(thread.thread_id),\n            \"assistant_id\": str(assistant.assistant_id),\n        },\n    }\n\n    try:\n        if payload.input is not None:\n            # Get the bot type from config\n            bot_type = config[\"configurable\"].get(\"type\", \"agent\")\n            # Get the correct schema based on bot type\n            if bot_type == \"chat_retrieval\":\n                schema = chat_retrieval.get_input_schema()\n            elif bot_type == \"chatbot\":\n                schema = chatbot.get_input_schema()\n            else:  # default to agent\n                schema = agent.get_input_schema()\n            # Validate against the correct schema\n            schema.model_validate(payload.input)\n    except ValidationError as e:\n        raise RequestValidationError(e.errors(), body=payload)\n\n    return payload.input, config\n\n\n@router.post(\"\")\nasync def create_run(\n    payload: CreateRunPayload,\n    user: AuthedUser,\n    background_tasks: BackgroundTasks,\n):\n    \"\"\"Create a run.\"\"\"\n    input_, config = await _run_input_and_config(payload, user.user_id)\n    background_tasks.add_task(agent.ainvoke, input_, config)\n    return {\"status\": \"ok\"}  # TODO add a run id\n\n\n@router.post(\"/stream\")\nasync def stream_run(\n    payload: CreateRunPayload,\n    user: AuthedUser,\n):\n    \"\"\"Create a run.\"\"\"\n    input_, config = await _run_input_and_config(payload, user.user_id)\n\n    return EventSourceResponse(to_sse(astream_state(agent, input_, config)))\n\n\n@router.get(\"/input_schema\")\nasync def input_schema() -> dict:\n    \"\"\"Return the input schema of the runnable.\"\"\"\n    return agent.get_input_schema().model_json_schema()\n\n\n@router.get(\"/output_schema\")\nasync def output_schema() -> dict:\n    \"\"\"Return the output schema of the runnable.\"\"\"\n    return agent.get_output_schema().model_json_schema()\n\n\n@router.get(\"/config_schema\")\nasync def config_schema() -> dict:\n    \"\"\"Return the config schema of the runnable.\"\"\"\n    return agent.config_schema().model_json_schema()\n\n\nif tracing_is_enabled():\n    langsmith_client = langsmith.client.Client()\n\n    class FeedbackCreateRequest(BaseModel):\n        \"\"\"\n        Shared information between create requests of feedback and feedback objects\n        \"\"\"\n\n        run_id: UUID\n        \"\"\"The associated run ID this feedback is logged for.\"\"\"\n\n        key: str\n        \"\"\"The metric name, tag, or aspect to provide feedback on.\"\"\"\n\n        score: Optional[Union[float, int, bool]] = None\n        \"\"\"Value or score to assign the run.\"\"\"\n\n        value: Optional[Union[float, int, bool, str, Dict]] = None\n        \"\"\"The display value for the feedback if not a metric.\"\"\"\n\n        comment: Optional[str] = None\n        \"\"\"Comment or explanation for the feedback.\"\"\"\n\n    @router.post(\"/feedback\")\n    def create_run_feedback(feedback_create_req: FeedbackCreateRequest) -> dict:\n        \"\"\"\n        Send feedback on an individual run to langsmith\n\n        Note that a successful response means that feedback was successfully\n        submitted. It does not guarantee that the feedback is recorded by\n        langsmith. Requests may be silently rejected if they are\n        unauthenticated or invalid by the server.\n        \"\"\"\n\n        langsmith_client.create_feedback(\n            feedback_create_req.run_id,\n            feedback_create_req.key,\n            score=feedback_create_req.score,\n            value=feedback_create_req.value,\n            comment=feedback_create_req.comment,\n            source_info={\n                \"from_langserve\": True,\n            },\n        )\n\n        return {\"status\": \"ok\"}\n"
  },
  {
    "path": "backend/app/api/threads.py",
    "content": "from typing import Annotated, Any, Dict, List, Optional, Sequence, Union\nfrom uuid import uuid4\n\nfrom fastapi import APIRouter, HTTPException, Path\nfrom langchain.schema.messages import AnyMessage\nfrom pydantic import BaseModel, Field\n\nimport app.storage as storage\nfrom app.auth.handlers import AuthedUser\nfrom app.schema import Thread\n\nrouter = APIRouter()\n\n\nThreadID = Annotated[str, Path(description=\"The ID of the thread.\")]\n\n\nclass ThreadPutRequest(BaseModel):\n    \"\"\"Payload for creating a thread.\"\"\"\n\n    name: Annotated[str, Field(description=\"The name of the thread.\")]\n    assistant_id: Annotated[str, Field(description=\"The ID of the assistant to use.\")]\n\n\nclass ThreadPostRequest(BaseModel):\n    \"\"\"Payload for adding state to a thread.\"\"\"\n\n    values: Union[Sequence[AnyMessage], Dict[str, Any]]\n    config: Optional[Dict[str, Any]] = None\n\n\n@router.get(\"/\")\nasync def list_threads(user: AuthedUser) -> List[Thread]:\n    \"\"\"List all threads for the current user.\"\"\"\n    return await storage.list_threads(user.user_id)\n\n\n@router.get(\"/{tid}/state\")\nasync def get_thread_state(\n    user: AuthedUser,\n    tid: ThreadID,\n):\n    \"\"\"Get state for a thread.\"\"\"\n    thread = await storage.get_thread(user.user_id, tid)\n    if not thread:\n        raise HTTPException(status_code=404, detail=\"Thread not found\")\n    assistant = await storage.get_assistant(user.user_id, thread.assistant_id)\n    if not assistant:\n        raise HTTPException(status_code=400, detail=\"Thread has no assistant\")\n    return await storage.get_thread_state(\n        user_id=user.user_id,\n        thread_id=tid,\n        assistant=assistant,\n    )\n\n\n@router.post(\"/{tid}/state\")\nasync def add_thread_state(\n    user: AuthedUser,\n    tid: ThreadID,\n    payload: ThreadPostRequest,\n):\n    \"\"\"Add state to a thread.\"\"\"\n    thread = await storage.get_thread(user.user_id, tid)\n    if not thread:\n        raise HTTPException(status_code=404, detail=\"Thread not found\")\n    assistant = await storage.get_assistant(user.user_id, thread.assistant_id)\n    if not assistant:\n        raise HTTPException(status_code=400, detail=\"Thread has no assistant\")\n    return await storage.update_thread_state(\n        payload.config or {\"configurable\": {\"thread_id\": tid}},\n        payload.values,\n        user_id=user.user_id,\n        assistant=assistant,\n    )\n\n\n@router.get(\"/{tid}/history\")\nasync def get_thread_history(\n    user: AuthedUser,\n    tid: ThreadID,\n):\n    \"\"\"Get all past states for a thread.\"\"\"\n    thread = await storage.get_thread(user.user_id, tid)\n    if not thread:\n        raise HTTPException(status_code=404, detail=\"Thread not found\")\n    assistant = await storage.get_assistant(user.user_id, thread.assistant_id)\n    if not assistant:\n        raise HTTPException(status_code=400, detail=\"Thread has no assistant\")\n    return await storage.get_thread_history(\n        user_id=user.user_id,\n        thread_id=tid,\n        assistant=assistant,\n    )\n\n\n@router.get(\"/{tid}\")\nasync def get_thread(\n    user: AuthedUser,\n    tid: ThreadID,\n) -> Thread:\n    \"\"\"Get a thread by ID.\"\"\"\n    thread = await storage.get_thread(user.user_id, tid)\n    if not thread:\n        raise HTTPException(status_code=404, detail=\"Thread not found\")\n    return thread\n\n\n@router.post(\"\")\nasync def create_thread(\n    user: AuthedUser,\n    thread_put_request: ThreadPutRequest,\n) -> Thread:\n    \"\"\"Create a thread.\"\"\"\n    return await storage.put_thread(\n        user.user_id,\n        str(uuid4()),\n        assistant_id=thread_put_request.assistant_id,\n        name=thread_put_request.name,\n    )\n\n\n@router.put(\"/{tid}\")\nasync def upsert_thread(\n    user: AuthedUser,\n    tid: ThreadID,\n    thread_put_request: ThreadPutRequest,\n) -> Thread:\n    \"\"\"Update a thread.\"\"\"\n    return await storage.put_thread(\n        user.user_id,\n        tid,\n        assistant_id=thread_put_request.assistant_id,\n        name=thread_put_request.name,\n    )\n\n\n@router.delete(\"/{tid}\")\nasync def delete_thread(\n    user: AuthedUser,\n    tid: ThreadID,\n):\n    \"\"\"Delete a thread by ID.\"\"\"\n    await storage.delete_thread(user.user_id, tid)\n    return {\"status\": \"ok\"}\n"
  },
  {
    "path": "backend/app/auth/__init__.py",
    "content": ""
  },
  {
    "path": "backend/app/auth/handlers.py",
    "content": "from abc import ABC, abstractmethod\nfrom functools import lru_cache\nfrom typing import Annotated\n\nimport jwt\nimport requests\nfrom fastapi import Depends, HTTPException, Request\nfrom fastapi.security.http import HTTPBearer\n\nimport app.storage as storage\nfrom app.auth.settings import AuthType, settings\nfrom app.schema import User\n\n\nclass AuthHandler(ABC):\n    @abstractmethod\n    async def __call__(self, request: Request) -> User:\n        \"\"\"Auth handler that returns a user object or raises an HTTPException.\"\"\"\n\n\nclass NOOPAuth(AuthHandler):\n    _default_sub = \"static-default-user-id\"\n\n    async def __call__(self, request: Request) -> User:\n        sub = request.cookies.get(\"opengpts_user_id\") or self._default_sub\n        user, _ = await storage.get_or_create_user(sub)\n        return user\n\n\nclass JWTAuthBase(AuthHandler):\n    async def __call__(self, request: Request) -> User:\n        http_bearer = await HTTPBearer()(request)\n        token = http_bearer.credentials\n\n        try:\n            payload = self.decode_token(token, self.get_decode_key(token))\n        except jwt.PyJWTError as e:\n            raise HTTPException(status_code=401, detail=str(e))\n\n        user, _ = await storage.get_or_create_user(payload[\"sub\"])\n        return user\n\n    @abstractmethod\n    def decode_token(self, token: str, decode_key: str) -> dict:\n        ...\n\n    @abstractmethod\n    def get_decode_key(self, token: str) -> str:\n        ...\n\n\nclass JWTAuthLocal(JWTAuthBase):\n    \"\"\"Auth handler that uses a hardcoded decode key from env.\"\"\"\n\n    def decode_token(self, token: str, decode_key: str) -> dict:\n        return jwt.decode(\n            token,\n            decode_key,\n            issuer=settings.jwt_local.iss,\n            audience=settings.jwt_local.aud,\n            algorithms=[settings.jwt_local.alg.upper()],\n            options={\"require\": [\"exp\", \"iss\", \"aud\", \"sub\"]},\n        )\n\n    def get_decode_key(self, token: str) -> str:\n        return settings.jwt_local.decode_key\n\n\nclass JWTAuthOIDC(JWTAuthBase):\n    \"\"\"Auth handler that uses OIDC discovery to get the decode key.\"\"\"\n\n    def decode_token(self, token: str, decode_key: str) -> dict:\n        alg = self._decode_complete_unverified(token)[\"header\"][\"alg\"]\n        return jwt.decode(\n            token,\n            decode_key,\n            issuer=settings.jwt_oidc.iss,\n            audience=settings.jwt_oidc.aud,\n            algorithms=[alg.upper()],\n            options={\"require\": [\"exp\", \"iss\", \"aud\", \"sub\"]},\n        )\n\n    def get_decode_key(self, token: str) -> str:\n        unverified = self._decode_complete_unverified(token)\n        issuer = unverified[\"payload\"].get(\"iss\")\n        kid = unverified[\"header\"].get(\"kid\")\n        return self._get_jwk_client(issuer).get_signing_key(kid).key\n\n    @lru_cache\n    def _decode_complete_unverified(self, token: str) -> dict:\n        return jwt.api_jwt.decode_complete(token, options={\"verify_signature\": False})\n\n    @lru_cache\n    def _get_jwk_client(self, issuer: str) -> jwt.PyJWKClient:\n        \"\"\"\n        lru_cache ensures a single instance of PyJWKClient per issuer. This is\n        so that we can take advantage of jwks caching (and invalidation) handled\n        by PyJWKClient.\n        \"\"\"\n        url = issuer.rstrip(\"/\") + \"/.well-known/openid-configuration\"\n        config = requests.get(url).json()\n        return jwt.PyJWKClient(config[\"jwks_uri\"], cache_jwk_set=True)\n\n\n@lru_cache(maxsize=1)\ndef get_auth_handler() -> AuthHandler:\n    if settings.auth_type == AuthType.JWT_LOCAL:\n        return JWTAuthLocal()\n    elif settings.auth_type == AuthType.JWT_OIDC:\n        return JWTAuthOIDC()\n    return NOOPAuth()\n\n\nasync def auth_user(\n    request: Request, auth_handler: AuthHandler = Depends(get_auth_handler)\n):\n    return await auth_handler(request)\n\n\nAuthedUser = Annotated[User, Depends(auth_user)]\n"
  },
  {
    "path": "backend/app/auth/settings.py",
    "content": "import os\nfrom base64 import b64decode\nfrom enum import Enum\nfrom typing import List, Optional, Union\n\nfrom pydantic import ConfigDict, field_validator, model_validator\nfrom pydantic_settings import BaseSettings\n\n\nclass AuthType(Enum):\n    NOOP = \"noop\"\n    JWT_LOCAL = \"jwt_local\"\n    JWT_OIDC = \"jwt_oidc\"\n\n\nclass JWTSettingsBase(BaseSettings):\n    iss: str\n    aud: Union[str, list[str]]\n\n    @field_validator(\"aud\", mode=\"before\")\n    @classmethod\n    def set_aud(cls, v) -> Union[str, List[str]]:\n        if isinstance(v, str) and \",\" in v:\n            return v.split(\",\")\n        return v\n\n    model_config = ConfigDict(\n        env_prefix=\"jwt_\",\n    )\n\n\nclass JWTSettingsLocal(JWTSettingsBase):\n    decode_key_b64: str\n    decode_key: str = None\n    alg: str\n\n    @field_validator(\"decode_key\", mode=\"before\")\n    @classmethod\n    def set_decode_key(cls, v, info):\n        \"\"\"\n        Key may be a multiline string (e.g. in the case of a public key), so to\n        be able to set it from env, we set it as a base64 encoded string and\n        decode it here.\n        \"\"\"\n        decode_key_b64 = info.data.get(\"decode_key_b64\")\n        if decode_key_b64:\n            return b64decode(decode_key_b64).decode(\"utf-8\")\n        return v\n\n\nclass JWTSettingsOIDC(JWTSettingsBase):\n    ...\n\n\nclass Settings(BaseSettings):\n    auth_type: AuthType\n    jwt_local: Optional[JWTSettingsLocal] = None\n    jwt_oidc: Optional[JWTSettingsOIDC] = None\n\n    @model_validator(mode=\"before\")\n    @classmethod\n    def check_jwt_settings(cls, values):\n        auth_type = values.get(\"auth_type\")\n        if auth_type == AuthType.JWT_LOCAL and values.get(\"jwt_local\") is None:\n            raise ValueError(\n                \"jwt local settings must be set when auth type is jwt_local.\"\n            )\n        if auth_type == AuthType.JWT_OIDC and values.get(\"jwt_oidc\") is None:\n            raise ValueError(\n                \"jwt oidc settings must be set when auth type is jwt_oidc.\"\n            )\n        return values\n\n\nauth_type = AuthType(os.getenv(\"AUTH_TYPE\", AuthType.NOOP.value).lower())\nkwargs = {\"auth_type\": auth_type}\nif auth_type == AuthType.JWT_LOCAL:\n    kwargs[\"jwt_local\"] = JWTSettingsLocal()\nelif auth_type == AuthType.JWT_OIDC:\n    kwargs[\"jwt_oidc\"] = JWTSettingsOIDC()\nsettings = Settings(**kwargs)\n"
  },
  {
    "path": "backend/app/chatbot.py",
    "content": "from typing import Annotated, List\n\nfrom langchain_core.language_models.base import LanguageModelLike\nfrom langchain_core.messages import BaseMessage, SystemMessage\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.graph.state import StateGraph\n\nfrom app.message_types import add_messages_liberal\n\n\ndef get_chatbot_executor(\n    llm: LanguageModelLike,\n    system_message: str,\n    checkpoint: BaseCheckpointSaver,\n):\n    def _get_messages(messages):\n        return [SystemMessage(content=system_message)] + messages\n\n    chatbot = _get_messages | llm\n\n    workflow = StateGraph(Annotated[List[BaseMessage], add_messages_liberal])\n    workflow.add_node(\"chatbot\", chatbot)\n    workflow.set_entry_point(\"chatbot\")\n    workflow.set_finish_point(\"chatbot\")\n    app = workflow.compile(checkpointer=checkpoint)\n    return app\n"
  },
  {
    "path": "backend/app/checkpoint.py",
    "content": "import os\nfrom typing import Any, AsyncIterator, Optional, Sequence\n\nimport structlog\nfrom langgraph.checkpoint.base import (\n    ChannelVersions,\n    Checkpoint,\n    CheckpointMetadata,\n    CheckpointTuple,\n    RunnableConfig,\n)\nfrom langgraph.checkpoint.postgres.aio import AsyncPostgresSaver\nfrom langgraph.checkpoint.postgres.base import BasePostgresSaver\nfrom langgraph.checkpoint.serde.base import SerializerProtocol\nfrom psycopg import AsyncPipeline\nfrom psycopg_pool import AsyncConnectionPool\n\nlogger = structlog.get_logger(__name__)\n\n\nclass AsyncPostgresCheckpoint(BasePostgresSaver):\n    \"\"\"A singleton implementation of AsyncPostgresSaver with separate setup.\"\"\"\n\n    _instance = None\n\n    def __new__(cls, *args, **kwargs):\n        if not cls._instance:\n            cls._instance = super().__new__(cls)\n        return cls._instance\n\n    def __init__(\n        self,\n        pipe: Optional[AsyncPipeline] = None,\n        serde: Optional[SerializerProtocol] = None,\n    ) -> None:\n        if not hasattr(self, \"_initialized\"):\n            super().__init__(serde=serde)\n            # Initialize basic attributes\n            self.pipe = pipe\n            self.serde = serde\n            self._initialized = True\n            self._setup_complete = False\n            self.async_postgres_saver = None\n\n    async def ensure_setup(self) -> None:\n        \"\"\"Ensure the instance is set up before use.\"\"\"\n        if not self._setup_complete:\n            await self.setup()\n            self._setup_complete = True\n\n    async def setup(self) -> None:\n        \"\"\"Internal setup method.\"\"\"\n        try:\n            conninfo = (\n                f\"postgresql://{os.environ['POSTGRES_USER']}:\"\n                f\"{os.environ['POSTGRES_PASSWORD']}@\"\n                f\"{os.environ['POSTGRES_HOST']}:\"\n                f\"{os.environ['POSTGRES_PORT']}/\"\n                f\"{os.environ['POSTGRES_DB']}\"\n            )\n\n            pool = AsyncConnectionPool(\n                conninfo=conninfo,\n                kwargs={\"autocommit\": True, \"prepare_threshold\": 0},\n                open=False,  # Don't open in constructor\n            )\n            await pool.open()\n\n            self.async_postgres_saver = AsyncPostgresSaver(\n                conn=pool, pipe=self.pipe, serde=self.serde\n            )\n\n            # Setup will create/migrate the tables if they don't exist\n            await self.async_postgres_saver.setup()\n\n            logger.warning(\"Checkpoint setup complete.\")\n        except Exception as e:\n            logger.error(f\"Failed to set up AsyncPostgresCheckpoint: {e}\")\n            raise\n\n    async def alist(\n        self,\n        config: Optional[RunnableConfig],\n        *,\n        filter: Optional[dict[str, Any]] = None,\n        before: Optional[RunnableConfig] = None,\n        limit: Optional[int] = None,\n    ) -> AsyncIterator[CheckpointTuple]:\n        \"\"\"List checkpoints from the database asynchronously.\"\"\"\n        async for checkpoint in self.async_postgres_saver.alist(\n            config, filter=filter, before=before, limit=limit\n        ):\n            yield checkpoint\n\n    async def aget_tuple(self, config: RunnableConfig) -> Optional[CheckpointTuple]:\n        \"\"\"Get a checkpoint tuple from the database asynchronously.\"\"\"\n        return await self.async_postgres_saver.aget_tuple(config)\n\n    async def aput(\n        self,\n        config: RunnableConfig,\n        checkpoint: Checkpoint,\n        metadata: CheckpointMetadata,\n        new_versions: ChannelVersions,\n    ) -> RunnableConfig:\n        \"\"\"Save a checkpoint to the database asynchronously.\"\"\"\n        return await self.async_postgres_saver.aput(\n            config, checkpoint, metadata, new_versions\n        )\n\n    async def aput_writes(\n        self,\n        config: RunnableConfig,\n        writes: Sequence[tuple[str, Any]],\n        task_id: str,\n    ) -> None:\n        \"\"\"Store intermediate writes linked to a checkpoint asynchronously.\"\"\"\n        await self.async_postgres_saver.aput_writes(config, writes, task_id)\n"
  },
  {
    "path": "backend/app/ingest.py",
    "content": "\"\"\"Code to ingest blob into a vectorstore.\n\nCode is responsible for taking binary data, parsing it and then indexing it\ninto a vector store.\n\nThis code should be agnostic to how the blob got generated; i.e., it does not\nknow about server/uploading etc.\n\"\"\"\nfrom typing import List\n\nfrom langchain.text_splitter import TextSplitter\nfrom langchain_community.document_loaders import Blob\nfrom langchain_community.document_loaders.base import BaseBlobParser\nfrom langchain_core.documents import Document\nfrom langchain_core.vectorstores import VectorStore\n\n\ndef _update_document_metadata(document: Document, namespace: str) -> None:\n    \"\"\"Mutation in place that adds a namespace to the document metadata.\"\"\"\n    document.metadata[\"namespace\"] = namespace\n\n\ndef _sanitize_document_content(document: Document) -> Document:\n    \"\"\"Sanitize the document.\"\"\"\n    # Without this, PDF ingestion fails with\n    # \"A string literal cannot contain NUL (0x00) characters\".\n    document.page_content = document.page_content.replace(\"\\x00\", \"x\")\n\n\n# PUBLIC API\n\n\ndef ingest_blob(\n    blob: Blob,\n    parser: BaseBlobParser,\n    text_splitter: TextSplitter,\n    vectorstore: VectorStore,\n    namespace: str,\n    *,\n    batch_size: int = 100,\n) -> List[str]:\n    \"\"\"Ingest a document into the vectorstore.\"\"\"\n    docs_to_index = []\n    ids = []\n    for document in parser.lazy_parse(blob):\n        docs = text_splitter.split_documents([document])\n        for doc in docs:\n            _sanitize_document_content(doc)\n            _update_document_metadata(doc, namespace)\n        docs_to_index.extend(docs)\n\n        if len(docs_to_index) >= batch_size:\n            ids.extend(vectorstore.add_documents(docs_to_index))\n            docs_to_index = []\n\n    if docs_to_index:\n        ids.extend(vectorstore.add_documents(docs_to_index))\n\n    return ids\n"
  },
  {
    "path": "backend/app/lifespan.py",
    "content": "import os\nfrom contextlib import asynccontextmanager\n\nimport asyncpg\nimport orjson\nimport structlog\nfrom fastapi import FastAPI\n\nfrom app.checkpoint import AsyncPostgresCheckpoint\n\n_pg_pool = None\n\n\ndef get_pg_pool() -> asyncpg.pool.Pool:\n    return _pg_pool\n\n\nasync def _init_connection(conn) -> None:\n    await conn.set_type_codec(\n        \"json\",\n        encoder=lambda v: orjson.dumps(v).decode(),\n        decoder=orjson.loads,\n        schema=\"pg_catalog\",\n    )\n    await conn.set_type_codec(\n        \"jsonb\",\n        encoder=lambda v: orjson.dumps(v).decode(),\n        decoder=orjson.loads,\n        schema=\"pg_catalog\",\n    )\n    await conn.set_type_codec(\n        \"uuid\", encoder=lambda v: str(v), decoder=lambda v: v, schema=\"pg_catalog\"\n    )\n\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    structlog.configure(\n        processors=[\n            structlog.stdlib.filter_by_level,\n            structlog.stdlib.PositionalArgumentsFormatter(),\n            structlog.processors.StackInfoRenderer(),\n            structlog.processors.UnicodeDecoder(),\n            structlog.stdlib.render_to_log_kwargs,\n        ],\n        logger_factory=structlog.stdlib.LoggerFactory(),\n        wrapper_class=structlog.stdlib.BoundLogger,\n        cache_logger_on_first_use=True,\n    )\n\n    global _pg_pool\n\n    _pg_pool = await asyncpg.create_pool(\n        database=os.environ[\"POSTGRES_DB\"],\n        user=os.environ[\"POSTGRES_USER\"],\n        password=os.environ[\"POSTGRES_PASSWORD\"],\n        host=os.environ[\"POSTGRES_HOST\"],\n        port=os.environ[\"POSTGRES_PORT\"],\n        init=_init_connection,\n    )\n    await AsyncPostgresCheckpoint().ensure_setup()\n    yield\n    await _pg_pool.close()\n    _pg_pool = None\n"
  },
  {
    "path": "backend/app/llms.py",
    "content": "import os\nfrom functools import lru_cache\nfrom urllib.parse import urlparse\n\nimport boto3\nimport httpx\nimport structlog\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_community.chat_models import BedrockChat, ChatFireworks\nfrom langchain_community.chat_models.ollama import ChatOllama\nfrom langchain_google_vertexai import ChatVertexAI\nfrom langchain_openai import AzureChatOpenAI, ChatOpenAI\n\nlogger = structlog.get_logger(__name__)\n\n\n@lru_cache(maxsize=4)\ndef get_openai_llm(model: str = \"gpt-3.5-turbo\", azure: bool = False):\n    proxy_url = os.getenv(\"PROXY_URL\")\n    http_client = None\n    if proxy_url:\n        parsed_url = urlparse(proxy_url)\n        if parsed_url.scheme and parsed_url.netloc:\n            http_client = httpx.AsyncClient(proxies=proxy_url)\n        else:\n            logger.warn(\"Invalid proxy URL provided. Proceeding without proxy.\")\n\n    if not azure:\n        try:\n            openai_model = model\n            llm = ChatOpenAI(\n                http_client=http_client,\n                model=openai_model,\n                temperature=0,\n            )\n        except Exception as e:\n            logger.error(\n                f\"Failed to instantiate ChatOpenAI due to: {str(e)}. Falling back to AzureChatOpenAI.\"\n            )\n            llm = AzureChatOpenAI(\n                http_client=http_client,\n                temperature=0,\n                deployment_name=os.environ[\"AZURE_OPENAI_DEPLOYMENT_NAME\"],\n                azure_endpoint=os.environ[\"AZURE_OPENAI_API_BASE\"],\n                openai_api_version=os.environ[\"AZURE_OPENAI_API_VERSION\"],\n                openai_api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n            )\n    else:\n        llm = AzureChatOpenAI(\n            http_client=http_client,\n            temperature=0,\n            deployment_name=os.environ[\"AZURE_OPENAI_DEPLOYMENT_NAME\"],\n            azure_endpoint=os.environ[\"AZURE_OPENAI_API_BASE\"],\n            openai_api_version=os.environ[\"AZURE_OPENAI_API_VERSION\"],\n            openai_api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n        )\n    return llm\n\n\n@lru_cache(maxsize=2)\ndef get_anthropic_llm(bedrock: bool = False):\n    if bedrock:\n        client = boto3.client(\n            \"bedrock-runtime\",\n            region_name=\"us-west-2\",\n            aws_access_key_id=os.environ.get(\"AWS_ACCESS_KEY_ID\"),\n            aws_secret_access_key=os.environ.get(\"AWS_SECRET_ACCESS_KEY\"),\n        )\n        model = BedrockChat(model_id=\"anthropic.claude-v2\", client=client)\n    else:\n        model = ChatAnthropic(\n            model_name=\"claude-3-haiku-20240307\",\n            max_tokens_to_sample=2000,\n            temperature=0,\n        )\n    return model\n\n\n@lru_cache(maxsize=1)\ndef get_google_llm():\n    return ChatVertexAI(\n        model_name=\"gemini-pro\", convert_system_message_to_human=True, streaming=True\n    )\n\n\n@lru_cache(maxsize=1)\ndef get_mixtral_fireworks():\n    return ChatFireworks(model=\"accounts/fireworks/models/mixtral-8x7b-instruct\")\n\n\n@lru_cache(maxsize=1)\ndef get_ollama_llm():\n    model_name = os.environ.get(\"OLLAMA_MODEL\")\n    if not model_name:\n        model_name = \"llama2\"\n    ollama_base_url = os.environ.get(\"OLLAMA_BASE_URL\")\n    if not ollama_base_url:\n        ollama_base_url = \"http://localhost:11434\"\n\n    return ChatOllama(model=model_name, base_url=ollama_base_url)\n"
  },
  {
    "path": "backend/app/message_types.py",
    "content": "from typing import Any\n\nfrom langchain_core.messages import (\n    FunctionMessage,\n    MessageLikeRepresentation,\n    ToolMessage,\n    _message_from_dict,\n)\nfrom langgraph.graph.message import Messages, add_messages\nfrom pydantic import Field\n\n\nclass LiberalFunctionMessage(FunctionMessage):\n    content: Any = Field(default=\"\")\n\n\nclass LiberalToolMessage(ToolMessage):\n    content: Any = Field(default=\"\")\n\n\ndef _convert_pydantic_dict_to_message(\n    data: MessageLikeRepresentation,\n) -> MessageLikeRepresentation:\n    \"\"\"Convert a dictionary to a message object if it matches message format.\"\"\"\n    if (\n        isinstance(data, dict)\n        and \"content\" in data\n        and isinstance(data.get(\"type\"), str)\n    ):\n        _type = data.pop(\"type\")\n        return _message_from_dict({\"data\": data, \"type\": _type})\n    return data\n\n\ndef add_messages_liberal(left: Messages, right: Messages):\n    # coerce to list\n    if not isinstance(left, list):\n        left = [left]\n    if not isinstance(right, list):\n        right = [right]\n    return add_messages(\n        [_convert_pydantic_dict_to_message(m) for m in left],\n        [_convert_pydantic_dict_to_message(m) for m in right],\n    )\n"
  },
  {
    "path": "backend/app/parsing.py",
    "content": "\"\"\"Module contains logic for parsing binary blobs into text.\"\"\"\nfrom langchain_community.document_loaders.parsers import BS4HTMLParser, PDFMinerParser\nfrom langchain_community.document_loaders.parsers.generic import MimeTypeBasedParser\nfrom langchain_community.document_loaders.parsers.msword import MsWordParser\nfrom langchain_community.document_loaders.parsers.txt import TextParser\n\nHANDLERS = {\n    \"application/pdf\": PDFMinerParser(),\n    \"text/plain\": TextParser(),\n    \"text/html\": BS4HTMLParser(),\n    \"application/msword\": MsWordParser(),\n    \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": (\n        MsWordParser()\n    ),\n}\n\nSUPPORTED_MIMETYPES = sorted(HANDLERS.keys())\n\n# PUBLIC API\n\nMIMETYPE_BASED_PARSER = MimeTypeBasedParser(\n    handlers=HANDLERS,\n    fallback_parser=None,\n)\n"
  },
  {
    "path": "backend/app/retrieval.py",
    "content": "import operator\nfrom typing import Annotated, List, Sequence, TypedDict\nfrom uuid import uuid4\n\nfrom langchain_core.language_models.base import LanguageModelLike\nfrom langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.retrievers import BaseRetriever\nfrom langchain_core.runnables import chain\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.graph import END\nfrom langgraph.graph.state import StateGraph\n\nfrom app.message_types import LiberalToolMessage, add_messages_liberal\n\nsearch_prompt = PromptTemplate.from_template(\n    \"\"\"Given the conversation below, come up with a search query to look up.\n\nThis search query can be either a few words or question\n\nReturn ONLY this search query, nothing more.\n\n>>> Conversation:\n{conversation}\n>>> END OF CONVERSATION\n\nRemember, return ONLY the search query that will help you when formulating a response to the above conversation.\"\"\"\n)\n\n\nresponse_prompt_template = \"\"\"{instructions}\n\nRespond to the user using ONLY the context provided below. Do not make anything up.\n\n{context}\"\"\"\n\n\ndef get_retrieval_executor(\n    llm: LanguageModelLike,\n    retriever: BaseRetriever,\n    system_message: str,\n    checkpoint: BaseCheckpointSaver,\n):\n    class AgentState(TypedDict):\n        messages: Annotated[List[BaseMessage], add_messages_liberal]\n        msg_count: Annotated[int, operator.add]\n\n    def _get_messages(messages):\n        chat_history = []\n        for m in messages:\n            if isinstance(m, AIMessage):\n                if not m.tool_calls:\n                    chat_history.append(m)\n            if isinstance(m, HumanMessage):\n                chat_history.append(m)\n        response = messages[-1].content\n        content = \"\\n\".join([d[\"page_content\"] for d in response])\n        return [\n            SystemMessage(\n                content=response_prompt_template.format(\n                    instructions=system_message, context=content\n                )\n            )\n        ] + chat_history\n\n    @chain\n    async def get_search_query(messages: Sequence[BaseMessage]):\n        convo = []\n        for m in messages:\n            if isinstance(m, AIMessage):\n                if \"function_call\" not in m.additional_kwargs:\n                    convo.append(f\"AI: {m.content}\")\n            if isinstance(m, HumanMessage):\n                convo.append(f\"Human: {m.content}\")\n        conversation = \"\\n\".join(convo)\n        prompt = await search_prompt.ainvoke({\"conversation\": conversation})\n        response = await llm.ainvoke(prompt, {\"tags\": [\"nostream\"]})\n        return response\n\n    async def invoke_retrieval(state: AgentState):\n        messages = state[\"messages\"]\n        if len(messages) == 1:\n            human_input = messages[-1].content\n            return {\n                \"messages\": [\n                    AIMessage(\n                        content=\"\",\n                        tool_calls=[\n                            {\n                                \"id\": uuid4().hex,\n                                \"name\": \"retrieval\",\n                                \"args\": {\"query\": human_input},\n                            }\n                        ],\n                    )\n                ]\n            }\n        else:\n            search_query = await get_search_query.ainvoke(messages)\n            return {\n                \"messages\": [\n                    AIMessage(\n                        id=search_query.id,\n                        content=\"\",\n                        tool_calls=[\n                            {\n                                \"id\": uuid4().hex,\n                                \"name\": \"retrieval\",\n                                \"args\": {\"query\": search_query.content},\n                            }\n                        ],\n                    )\n                ]\n            }\n\n    async def retrieve(state: AgentState):\n        messages = state[\"messages\"]\n        params = messages[-1].tool_calls[0]\n        query = params[\"args\"][\"query\"]\n        response = await retriever.ainvoke(query)\n        response = [doc.model_dump() for doc in response]\n        msg = LiberalToolMessage(\n            name=\"retrieval\", content=response, tool_call_id=params[\"id\"]\n        )\n        return {\"messages\": [msg], \"msg_count\": 1}\n\n    def call_model(state: AgentState):\n        messages = state[\"messages\"]\n        response = llm.invoke(_get_messages(messages))\n        return {\"messages\": [response], \"msg_count\": 1}\n\n    workflow = StateGraph(AgentState)\n    workflow.add_node(\"invoke_retrieval\", invoke_retrieval)\n    workflow.add_node(\"retrieve\", retrieve)\n    workflow.add_node(\"response\", call_model)\n    workflow.set_entry_point(\"invoke_retrieval\")\n    workflow.add_edge(\"invoke_retrieval\", \"retrieve\")\n    workflow.add_edge(\"retrieve\", \"response\")\n    workflow.add_edge(\"response\", END)\n    app = workflow.compile(checkpointer=checkpoint)\n    return app\n"
  },
  {
    "path": "backend/app/schema.py",
    "content": "from datetime import datetime\nfrom typing import Optional\n\nfrom pydantic import BaseModel\n\n\nclass User(BaseModel):\n    user_id: str\n    \"\"\"The ID of the user.\"\"\"\n    sub: str\n    \"\"\"The sub of the user (from a JWT token).\"\"\"\n    created_at: datetime\n    \"\"\"The time the user was created.\"\"\"\n\n\nclass Assistant(BaseModel):\n    assistant_id: str\n    \"\"\"The ID of the assistant.\"\"\"\n    user_id: str\n    \"\"\"The ID of the user that owns the assistant.\"\"\"\n    name: str\n    \"\"\"The name of the assistant.\"\"\"\n    config: dict\n    \"\"\"The assistant config.\"\"\"\n    updated_at: datetime\n    \"\"\"The last time the assistant was updated.\"\"\"\n    public: bool = False\n    \"\"\"Whether the assistant is public.\"\"\"\n\n\nclass Thread(BaseModel):\n    thread_id: str\n    \"\"\"The ID of the thread.\"\"\"\n    user_id: str\n    \"\"\"The ID of the user that owns the thread.\"\"\"\n    assistant_id: Optional[str] = None\n    \"\"\"The assistant that was used in conjunction with this thread.\"\"\"\n    name: str\n    \"\"\"The name of the thread.\"\"\"\n    updated_at: datetime\n    \"\"\"The last time the thread was updated.\"\"\"\n    metadata: Optional[dict] = None\n"
  },
  {
    "path": "backend/app/server.py",
    "content": "import os\nfrom pathlib import Path\n\nimport orjson\nimport structlog\nfrom fastapi import FastAPI, Form, UploadFile\nfrom fastapi.exceptions import HTTPException\nfrom fastapi.staticfiles import StaticFiles\n\nimport app.storage as storage\nfrom app.api import router as api_router\nfrom app.auth.handlers import AuthedUser\nfrom app.lifespan import lifespan\nfrom app.upload import convert_ingestion_input_to_blob, ingest_runnable\n\nlogger = structlog.get_logger(__name__)\n\napp = FastAPI(title=\"OpenGPTs API\", lifespan=lifespan)\n\n\n# Get root of app, used to point to directory containing static files\nROOT = Path(__file__).parent.parent\n\n\napp.include_router(api_router)\n\n\n@app.post(\"/ingest\", description=\"Upload files to the given assistant.\")\nasync def ingest_files(\n    files: list[UploadFile], user: AuthedUser, config: str = Form(...)\n) -> None:\n    \"\"\"Ingest a list of files.\"\"\"\n    config = orjson.loads(config)\n\n    assistant_id = config[\"configurable\"].get(\"assistant_id\")\n    if assistant_id is not None:\n        assistant = await storage.get_assistant(user.user_id, assistant_id)\n        if assistant is None:\n            raise HTTPException(status_code=404, detail=\"Assistant not found.\")\n\n    thread_id = config[\"configurable\"].get(\"thread_id\")\n    if thread_id is not None:\n        thread = await storage.get_thread(user.user_id, thread_id)\n        if thread is None:\n            raise HTTPException(status_code=404, detail=\"Thread not found.\")\n\n    file_blobs = [convert_ingestion_input_to_blob(file) for file in files]\n    return ingest_runnable.batch(file_blobs, config)\n\n\n@app.get(\"/health\")\nasync def health() -> dict:\n    return {\"status\": \"ok\"}\n\n\nui_dir = str(ROOT / \"ui\")\n\nif os.path.exists(ui_dir):\n    app.mount(\"\", StaticFiles(directory=ui_dir, html=True), name=\"ui\")\nelse:\n    logger.warn(\"No UI directory found, serving API only.\")\n\nif __name__ == \"__main__\":\n    import uvicorn\n\n    uvicorn.run(app, host=\"0.0.0.0\", port=8100)\n"
  },
  {
    "path": "backend/app/storage.py",
    "content": "from datetime import datetime, timezone\nfrom typing import Any, List, Optional, Sequence, Union\n\nfrom langchain_core.messages import AnyMessage\nfrom langchain_core.runnables import RunnableConfig\n\nfrom app.agent import agent\nfrom app.lifespan import get_pg_pool\nfrom app.schema import Assistant, Thread, User\n\n\nasync def list_assistants(user_id: str) -> List[Assistant]:\n    \"\"\"List all assistants for the current user.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        records = await conn.fetch(\n            \"SELECT * FROM assistant WHERE user_id = $1\", user_id\n        )\n        return [Assistant(**record) for record in records]\n\n\nasync def get_assistant(user_id: str, assistant_id: str) -> Optional[Assistant]:\n    \"\"\"Get an assistant by ID.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        record = await conn.fetchrow(\n            \"SELECT * FROM assistant WHERE assistant_id = $1 AND (user_id = $2 OR public IS true)\",\n            assistant_id,\n            user_id,\n        )\n        if record is None:\n            return None\n        return Assistant(**record)\n\n\nasync def list_public_assistants() -> List[Assistant]:\n    \"\"\"List all the public assistants.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        records = await conn.fetch(\"SELECT * FROM assistant WHERE public IS true\")\n        return [Assistant(**record) for record in records]\n\n\nasync def put_assistant(\n    user_id: str, assistant_id: str, *, name: str, config: dict, public: bool = False\n) -> Assistant:\n    \"\"\"Modify an assistant.\n\n    Args:\n        user_id: The user ID.\n        assistant_id: The assistant ID.\n        name: The assistant name.\n        config: The assistant config.\n        public: Whether the assistant is public.\n\n    Returns:\n        return the assistant model if no exception is raised.\n    \"\"\"\n    updated_at = datetime.now(timezone.utc)\n    async with get_pg_pool().acquire() as conn:\n        async with conn.transaction():\n            await conn.execute(\n                (\n                    \"INSERT INTO assistant (assistant_id, user_id, name, config, updated_at, public) VALUES ($1, $2, $3, $4, $5, $6) \"\n                    \"ON CONFLICT (assistant_id) DO UPDATE SET \"\n                    \"user_id = EXCLUDED.user_id, \"\n                    \"name = EXCLUDED.name, \"\n                    \"config = EXCLUDED.config, \"\n                    \"updated_at = EXCLUDED.updated_at, \"\n                    \"public = EXCLUDED.public;\"\n                ),\n                assistant_id,\n                user_id,\n                name,\n                config,\n                updated_at,\n                public,\n            )\n    return Assistant(\n        assistant_id=assistant_id,\n        user_id=user_id,\n        name=name,\n        config=config,\n        updated_at=updated_at,\n        public=public,\n    )\n\n\nasync def delete_assistant(user_id: str, assistant_id: str) -> None:\n    \"\"\"Delete an assistant by ID.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        await conn.execute(\n            \"DELETE FROM assistant WHERE assistant_id = $1 AND user_id = $2\",\n            assistant_id,\n            user_id,\n        )\n\n\nasync def list_threads(user_id: str) -> List[Thread]:\n    \"\"\"List all threads for the current user.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        records = await conn.fetch(\"SELECT * FROM thread WHERE user_id = $1\", user_id)\n        return [Thread(**record) for record in records]\n\n\nasync def get_thread(user_id: str, thread_id: str) -> Optional[Thread]:\n    \"\"\"Get a thread by ID.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        record = await conn.fetchrow(\n            \"SELECT * FROM thread WHERE thread_id = $1 AND user_id = $2\",\n            thread_id,\n            user_id,\n        )\n        if record is None:\n            return None\n        return Thread(**record)\n\n\nasync def get_thread_state(*, user_id: str, thread_id: str, assistant: Assistant):\n    \"\"\"Get state for a thread.\"\"\"\n    state = await agent.aget_state(\n        {\n            \"configurable\": {\n                **assistant.config[\"configurable\"],\n                \"thread_id\": thread_id,\n                \"assistant_id\": assistant.assistant_id,\n            }\n        }\n    )\n    # Keep original format - return values as is\n    values = state.values if state.values else None\n\n    return {\n        \"values\": values,\n        \"next\": state.next,\n    }\n\n\nasync def update_thread_state(\n    config: RunnableConfig,\n    values: Union[Sequence[AnyMessage], dict[str, Any]],\n    *,\n    user_id: str,\n    assistant: Assistant,\n):\n    \"\"\"Add state to a thread.\"\"\"\n    # Get the current state to determine the format\n    current_state = await agent.aget_state(\n        {\n            \"configurable\": {\n                **assistant.config[\"configurable\"],\n                **config[\"configurable\"],\n                \"assistant_id\": assistant.assistant_id,\n            }\n        }\n    )\n\n    # If current state is a dict (retrieval agent), maintain dict structure\n    if current_state.values and isinstance(current_state.values, dict):\n        if isinstance(values, dict):\n            state_values = values\n        else:\n            # Update just the messages in the existing state\n            state_values = {**current_state.values, \"messages\": values}\n    else:\n        # For message-only states (tools_agent, chatbot), just use the messages\n        state_values = (\n            values if isinstance(values, dict) and \"messages\" in values else values\n        )\n\n    await agent.aupdate_state(\n        {\n            \"configurable\": {\n                **assistant.config[\"configurable\"],\n                **config[\"configurable\"],\n                \"assistant_id\": assistant.assistant_id,\n            }\n        },\n        state_values,\n    )\n\n\nasync def get_thread_history(*, user_id: str, thread_id: str, assistant: Assistant):\n    \"\"\"Get the history of a thread.\"\"\"\n    return [\n        {\n            \"values\": c.values,\n            \"next\": c.next,\n            \"config\": c.config,\n            \"parent\": c.parent_config,\n        }\n        async for c in agent.aget_state_history(\n            {\n                \"configurable\": {\n                    **assistant.config[\"configurable\"],\n                    \"thread_id\": thread_id,\n                    \"assistant_id\": assistant.assistant_id,\n                }\n            }\n        )\n    ]\n\n\ndef get_assistant_type(config: dict) -> str:\n    \"\"\"Extract assistant type from config, handling both old and new formats.\"\"\"\n    configurable = config.get(\"configurable\", {})\n\n    # First try direct type key (old format)\n    if \"type\" in configurable:\n        return configurable[\"type\"]\n\n    # Default fallback\n    return \"chatbot\"\n\n\nasync def put_thread(\n    user_id: str, thread_id: str, *, assistant_id: str, name: str\n) -> Thread:\n    \"\"\"Modify a thread.\"\"\"\n    updated_at = datetime.now(timezone.utc)\n    assistant = await get_assistant(user_id, assistant_id)\n    metadata = (\n        {\"assistant_type\": get_assistant_type(assistant.config)} if assistant else None\n    )\n    async with get_pg_pool().acquire() as conn:\n        await conn.execute(\n            (\n                \"INSERT INTO thread (thread_id, user_id, assistant_id, name, updated_at, metadata) VALUES ($1, $2, $3, $4, $5, $6) \"\n                \"ON CONFLICT (thread_id) DO UPDATE SET \"\n                \"user_id = EXCLUDED.user_id,\"\n                \"assistant_id = EXCLUDED.assistant_id, \"\n                \"name = EXCLUDED.name, \"\n                \"updated_at = EXCLUDED.updated_at, \"\n                \"metadata = EXCLUDED.metadata;\"\n            ),\n            thread_id,\n            user_id,\n            assistant_id,\n            name,\n            updated_at,\n            metadata,\n        )\n        return Thread(\n            thread_id=thread_id,\n            user_id=user_id,\n            assistant_id=assistant_id,\n            name=name,\n            updated_at=updated_at,\n            metadata=metadata,\n        )\n\n\nasync def delete_thread(user_id: str, thread_id: str):\n    \"\"\"Delete a thread by ID.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        await conn.execute(\n            \"DELETE FROM thread WHERE thread_id = $1 AND user_id = $2\",\n            thread_id,\n            user_id,\n        )\n\n\nasync def get_or_create_user(sub: str) -> tuple[User, bool]:\n    \"\"\"Returns a tuple of the user and a boolean indicating whether the user was created.\"\"\"\n    async with get_pg_pool().acquire() as conn:\n        if record := await conn.fetchrow('SELECT * FROM \"user\" WHERE sub = $1', sub):\n            return User(**record), False\n        record = await conn.fetchrow(\n            'INSERT INTO \"user\" (sub) VALUES ($1) RETURNING *', sub\n        )\n        return User(**record), True\n"
  },
  {
    "path": "backend/app/stream.py",
    "content": "import functools\nfrom typing import Any, AsyncIterator, Dict, Optional, Sequence, Union\n\nimport orjson\nimport structlog\nfrom langchain_core.messages import AnyMessage, BaseMessage, message_chunk_to_message\nfrom langchain_core.runnables import Runnable, RunnableConfig\n\nlogger = structlog.get_logger(__name__)\n\nMessagesStream = AsyncIterator[Union[list[AnyMessage], str]]\n\n\nasync def astream_state(\n    app: Runnable,\n    input: Union[Sequence[AnyMessage], Dict[str, Any]],\n    config: RunnableConfig,\n) -> MessagesStream:\n    \"\"\"Stream messages from the runnable.\"\"\"\n    root_run_id: Optional[str] = None\n    messages: dict[str, BaseMessage] = {}\n\n    async for event in app.astream_events(\n        input, config, version=\"v1\", stream_mode=\"values\", exclude_tags=[\"nostream\"]\n    ):\n        if event[\"event\"] == \"on_chain_start\" and not root_run_id:\n            root_run_id = event[\"run_id\"]\n            yield root_run_id\n        elif event[\"event\"] == \"on_chain_stream\" and event[\"run_id\"] == root_run_id:\n            new_messages: list[BaseMessage] = []\n\n            # event[\"data\"][\"chunk\"] is a Sequence[AnyMessage] or a Dict[str, Any]\n            state_chunk_msgs: Union[Sequence[AnyMessage], Dict[str, Any]] = event[\n                \"data\"\n            ][\"chunk\"]\n            if isinstance(state_chunk_msgs, dict):\n                state_chunk_msgs = event[\"data\"][\"chunk\"][\"messages\"]\n\n            for msg in state_chunk_msgs:\n                msg_id = msg[\"id\"] if isinstance(msg, dict) else msg.id\n                if msg_id in messages and msg == messages[msg_id]:\n                    continue\n                else:\n                    messages[msg_id] = msg\n                    new_messages.append(msg)\n            if new_messages:\n                yield new_messages\n        elif event[\"event\"] == \"on_chat_model_stream\":\n            message: BaseMessage = event[\"data\"][\"chunk\"]\n            if message.id not in messages:\n                messages[message.id] = message\n            else:\n                messages[message.id] += message\n            yield [messages[message.id]]\n\n\ndef _default(obj) -> Any:\n    if hasattr(obj, \"dict\") and callable(obj.dict):\n        return obj.dict()\n    raise TypeError(f\"Object of type {obj.__class__.__name__} is not JSON serializable\")\n\n\ndumps = functools.partial(orjson.dumps, default=_default)\n\n\nasync def to_sse(messages_stream: MessagesStream) -> AsyncIterator[dict]:\n    \"\"\"Consume the stream into an EventSourceResponse\"\"\"\n    try:\n        async for chunk in messages_stream:\n            # EventSourceResponse expects a string for data\n            # so after serializing into bytes, we decode into utf-8\n            # to get a string.\n            if isinstance(chunk, str):\n                yield {\n                    \"event\": \"metadata\",\n                    \"data\": orjson.dumps({\"run_id\": chunk}).decode(),\n                }\n            else:\n                yield {\n                    \"event\": \"data\",\n                    \"data\": dumps(\n                        [message_chunk_to_message(msg) for msg in chunk]\n                    ).decode(),\n                }\n    except Exception:\n        logger.warn(\"error in stream\", exc_info=True)\n        yield {\n            \"event\": \"error\",\n            # Do not expose the error message to the client since\n            # the message may contain sensitive information.\n            # We'll add client side errors for validation as well.\n            \"data\": orjson.dumps(\n                {\"status_code\": 500, \"message\": \"Internal Server Error\"}\n            ).decode(),\n        }\n\n    # Send an end event to signal the end of the stream\n    yield {\"event\": \"end\"}\n"
  },
  {
    "path": "backend/app/tools.py",
    "content": "from enum import Enum\nfrom functools import lru_cache\nfrom typing import Annotated, Literal\n\nfrom langchain.tools.retriever import create_retriever_tool\nfrom langchain_community.agent_toolkits.connery import ConneryToolkit\nfrom langchain_community.retrievers.kay import KayAiRetriever\nfrom langchain_community.retrievers.pubmed import PubMedRetriever\nfrom langchain_community.retrievers.wikipedia import WikipediaRetriever\nfrom langchain_community.retrievers.you import YouRetriever\nfrom langchain_community.tools.arxiv.tool import ArxivQueryRun\nfrom langchain_community.tools.connery import ConneryService\nfrom langchain_community.tools.ddg_search.tool import DuckDuckGoSearchRun\nfrom langchain_community.tools.tavily_search import (\n    TavilyAnswer as _TavilyAnswer,\n)\nfrom langchain_community.tools.tavily_search import (\n    TavilySearchResults,\n)\nfrom langchain_community.utilities.arxiv import ArxivAPIWrapper\nfrom langchain_community.utilities.dalle_image_generator import DallEAPIWrapper\nfrom langchain_community.utilities.tavily_search import TavilySearchAPIWrapper\nfrom langchain_core.tools import Tool\nfrom pydantic import BaseModel, Field\nfrom typing_extensions import TypedDict\n\nfrom app.upload import vstore\n\n\nclass DDGInput(BaseModel):\n    query: Annotated[str, Field(description=\"search query to look up\")]\n\n\nclass ArxivInput(BaseModel):\n    query: Annotated[str, Field(description=\"search query to look up\")]\n\n\nclass PythonREPLInput(BaseModel):\n    query: Annotated[str, Field(description=\"python command to run\")]\n\n\nclass DallEInput(BaseModel):\n    query: Annotated[str, Field(description=\"image description to generate image from\")]\n\n\nclass AvailableTools(str, Enum):\n    ACTION_SERVER = \"action_server_by_sema4ai\"\n    CONNERY = \"ai_action_runner_by_connery\"\n    DDG_SEARCH = \"ddg_search\"\n    TAVILY = \"search_tavily\"\n    TAVILY_ANSWER = \"search_tavily_answer\"\n    RETRIEVAL = \"retrieval\"\n    ARXIV = \"arxiv\"\n    YOU_SEARCH = \"you_search\"\n    SEC_FILINGS = \"sec_filings_kai_ai\"\n    PRESS_RELEASES = \"press_releases_kai_ai\"\n    PUBMED = \"pubmed\"\n    WIKIPEDIA = \"wikipedia\"\n    DALL_E = \"dall_e\"\n\n\nclass ToolConfig(TypedDict):\n    ...\n\n\nclass BaseTool(BaseModel):\n    type: AvailableTools\n    name: str\n    description: str\n    config: ToolConfig = Field(default_factory=dict)\n    multi_use: bool = False\n\n\nclass ActionServerConfig(ToolConfig):\n    url: str\n    api_key: str\n\n\nclass ActionServer(BaseTool):\n    type: Literal[AvailableTools.ACTION_SERVER] = AvailableTools.ACTION_SERVER\n    name: Literal[\"Action Server by Sema4.ai\"] = \"Action Server by Sema4.ai\"\n    description: Literal[\n        (\n            \"Run AI actions with \"\n            \"[Sema4.ai Action Server](https://github.com/Sema4AI/actions).\"\n        )\n    ] = (\n        \"Run AI actions with \"\n        \"[Sema4.ai Action Server](https://github.com/Sema4AI/actions).\"\n    )\n    config: ActionServerConfig\n    multi_use: Literal[True] = True\n\n\nclass Connery(BaseTool):\n    type: Literal[AvailableTools.CONNERY] = AvailableTools.CONNERY\n    name: Literal[\"AI Action Runner by Connery\"] = \"AI Action Runner by Connery\"\n    description: Literal[\n        (\n            \"Connect OpenGPTs to the real world with \"\n            \"[Connery](https://github.com/connery-io/connery).\"\n        )\n    ] = (\n        \"Connect OpenGPTs to the real world with \"\n        \"[Connery](https://github.com/connery-io/connery).\"\n    )\n\n\nclass DDGSearch(BaseTool):\n    type: Literal[AvailableTools.DDG_SEARCH] = AvailableTools.DDG_SEARCH\n    name: Literal[\"DuckDuckGo Search\"] = \"DuckDuckGo Search\"\n    description: Literal[\n        \"Search the web with [DuckDuckGo](https://pypi.org/project/duckduckgo-search/).\"\n    ] = \"Search the web with [DuckDuckGo](https://pypi.org/project/duckduckgo-search/).\"\n\n\nclass Arxiv(BaseTool):\n    type: Literal[AvailableTools.ARXIV] = AvailableTools.ARXIV\n    name: Literal[\"Arxiv\"] = \"Arxiv\"\n    description: Literal[\n        \"Searches [Arxiv](https://arxiv.org/).\"\n    ] = \"Searches [Arxiv](https://arxiv.org/).\"\n\n\nclass YouSearch(BaseTool):\n    type: Literal[AvailableTools.YOU_SEARCH] = AvailableTools.YOU_SEARCH\n    name: Literal[\"You.com Search\"] = \"You.com Search\"\n    description: Literal[\n        \"Uses [You.com](https://you.com/) search, optimized responses for LLMs.\"\n    ] = \"Uses [You.com](https://you.com/) search, optimized responses for LLMs.\"\n\n\nclass SecFilings(BaseTool):\n    type: Literal[AvailableTools.SEC_FILINGS] = AvailableTools.SEC_FILINGS\n    name: Literal[\"SEC Filings (Kay.ai)\"] = \"SEC Filings (Kay.ai)\"\n    description: Literal[\n        \"Searches through SEC filings using [Kay.ai](https://www.kay.ai/).\"\n    ] = \"Searches through SEC filings using [Kay.ai](https://www.kay.ai/).\"\n\n\nclass PressReleases(BaseTool):\n    type: Literal[AvailableTools.PRESS_RELEASES] = AvailableTools.PRESS_RELEASES\n    name: Literal[\"Press Releases (Kay.ai)\"] = \"Press Releases (Kay.ai)\"\n    description: Literal[\n        \"Searches through press releases using [Kay.ai](https://www.kay.ai/).\"\n    ] = \"Searches through press releases using [Kay.ai](https://www.kay.ai/).\"\n\n\nclass PubMed(BaseTool):\n    type: Literal[AvailableTools.PUBMED] = AvailableTools.PUBMED\n    name: Literal[\"PubMed\"] = \"PubMed\"\n    description: Literal[\n        \"Searches [PubMed](https://pubmed.ncbi.nlm.nih.gov/).\"\n    ] = \"Searches [PubMed](https://pubmed.ncbi.nlm.nih.gov/).\"\n\n\nclass Wikipedia(BaseTool):\n    type: Literal[AvailableTools.WIKIPEDIA] = AvailableTools.WIKIPEDIA\n    name: Literal[\"Wikipedia\"] = \"Wikipedia\"\n    description: Literal[\n        \"Searches [Wikipedia](https://pypi.org/project/wikipedia/).\"\n    ] = \"Searches [Wikipedia](https://pypi.org/project/wikipedia/).\"\n\n\nclass Tavily(BaseTool):\n    type: Literal[AvailableTools.TAVILY] = AvailableTools.TAVILY\n    name: Literal[\"Search (Tavily)\"] = \"Search (Tavily)\"\n    description: Literal[\n        (\n            \"Uses the [Tavily](https://app.tavily.com/) search engine. \"\n            \"Includes sources in the response.\"\n        )\n    ] = (\n        \"Uses the [Tavily](https://app.tavily.com/) search engine. \"\n        \"Includes sources in the response.\"\n    )\n\n\nclass TavilyAnswer(BaseTool):\n    type: Literal[AvailableTools.TAVILY_ANSWER] = AvailableTools.TAVILY_ANSWER\n    name: Literal[\"Search (short answer, Tavily)\"] = \"Search (short answer, Tavily)\"\n    description: Literal[\n        (\n            \"Uses the [Tavily](https://app.tavily.com/) search engine. \"\n            \"This returns only the answer, no supporting evidence.\"\n        )\n    ] = (\n        \"Uses the [Tavily](https://app.tavily.com/) search engine. \"\n        \"This returns only the answer, no supporting evidence.\"\n    )\n\n\nclass Retrieval(BaseTool):\n    type: Literal[AvailableTools.RETRIEVAL] = AvailableTools.RETRIEVAL\n    name: Literal[\"Retrieval\"] = \"Retrieval\"\n    description: Literal[\n        \"Look up information in uploaded files.\"\n    ] = \"Look up information in uploaded files.\"\n\n\nclass DallE(BaseTool):\n    type: Literal[AvailableTools.DALL_E] = AvailableTools.DALL_E\n    name: Literal[\"Generate Image (Dall-E)\"] = \"Generate Image (Dall-E)\"\n    description: Literal[\n        \"Generates images from a text description using OpenAI's DALL-E model.\"\n    ] = \"Generates images from a text description using OpenAI's DALL-E model.\"\n\n\nRETRIEVAL_DESCRIPTION = \"\"\"Can be used to look up information that was uploaded to this assistant.\nIf the user is referencing particular files, that is often a good hint that information may be here.\nIf the user asks a vague question, they are likely meaning to look up info from this retriever, and you should call it!\"\"\"\n\n\ndef get_retriever(assistant_id: str, thread_id: str):\n    return vstore.as_retriever(\n        search_kwargs={\"filter\": {\"namespace\": {\"$in\": [assistant_id, thread_id]}}}\n    )\n\n\n@lru_cache(maxsize=5)\ndef get_retrieval_tool(assistant_id: str, thread_id: str, description: str):\n    return create_retriever_tool(\n        get_retriever(assistant_id, thread_id),\n        \"Retriever\",\n        description,\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_duck_duck_go():\n    return DuckDuckGoSearchRun(args_schema=DDGInput)\n\n\n@lru_cache(maxsize=1)\ndef _get_arxiv():\n    return ArxivQueryRun(api_wrapper=ArxivAPIWrapper(), args_schema=ArxivInput)\n\n\n@lru_cache(maxsize=1)\ndef _get_you_search():\n    return create_retriever_tool(\n        YouRetriever(n_hits=3, n_snippets_per_hit=3),\n        \"you_search\",\n        \"Searches for documents using You.com\",\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_sec_filings():\n    return create_retriever_tool(\n        KayAiRetriever.create(\n            dataset_id=\"company\", data_types=[\"10-K\", \"10-Q\"], num_contexts=3\n        ),\n        \"sec_filings_search\",\n        \"Search for a query among SEC Filings\",\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_press_releases():\n    return create_retriever_tool(\n        KayAiRetriever.create(\n            dataset_id=\"company\", data_types=[\"PressRelease\"], num_contexts=6\n        ),\n        \"press_release_search\",\n        \"Search for a query among press releases from US companies\",\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_pubmed():\n    return create_retriever_tool(\n        PubMedRetriever(), \"pub_med_search\", \"Search for a query on PubMed\"\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_wikipedia():\n    return create_retriever_tool(\n        WikipediaRetriever(), \"wikipedia\", \"Search for a query on Wikipedia\"\n    )\n\n\n@lru_cache(maxsize=1)\ndef _get_tavily():\n    tavily_search = TavilySearchAPIWrapper()\n    return TavilySearchResults(api_wrapper=tavily_search, name=\"search_tavily\")\n\n\n@lru_cache(maxsize=1)\ndef _get_tavily_answer():\n    tavily_search = TavilySearchAPIWrapper()\n    return _TavilyAnswer(api_wrapper=tavily_search, name=\"search_tavily_answer\")\n\n\n@lru_cache(maxsize=1)\ndef _get_connery_actions():\n    connery_service = ConneryService()\n    connery_toolkit = ConneryToolkit.create_instance(connery_service)\n    tools = connery_toolkit.get_tools()\n    return tools\n\n\n@lru_cache(maxsize=1)\ndef _get_dalle_tools():\n    return Tool(\n        \"Dall-E-Image-Generator\",\n        DallEAPIWrapper(size=\"1024x1024\", quality=\"hd\").run,\n        \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\",\n    )\n\n\nTOOLS = {\n    AvailableTools.CONNERY: _get_connery_actions,\n    AvailableTools.DDG_SEARCH: _get_duck_duck_go,\n    AvailableTools.ARXIV: _get_arxiv,\n    AvailableTools.YOU_SEARCH: _get_you_search,\n    AvailableTools.SEC_FILINGS: _get_sec_filings,\n    AvailableTools.PRESS_RELEASES: _get_press_releases,\n    AvailableTools.PUBMED: _get_pubmed,\n    AvailableTools.TAVILY: _get_tavily,\n    AvailableTools.WIKIPEDIA: _get_wikipedia,\n    AvailableTools.TAVILY_ANSWER: _get_tavily_answer,\n    AvailableTools.DALL_E: _get_dalle_tools,\n}\n"
  },
  {
    "path": "backend/app/upload.py",
    "content": "\"\"\"API to deal with file uploads via a runnable.\n\nFor now this code assumes that the content is a base64 encoded string.\n\nThe details here might change in the future.\n\nFor the time being, upload and ingestion are coupled\n\"\"\"\n\nfrom __future__ import annotations\n\nimport mimetypes\nimport os\nfrom typing import BinaryIO, List, Optional\n\nfrom fastapi import UploadFile\nfrom langchain_community.vectorstores.pgvector import PGVector\nfrom langchain_core.document_loaders.blob_loaders import Blob\nfrom langchain_core.runnables import (\n    ConfigurableField,\n    RunnableConfig,\n    RunnableSerializable,\n)\nfrom langchain_core.vectorstores import VectorStore\nfrom langchain_openai import AzureOpenAIEmbeddings, OpenAIEmbeddings\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter\nfrom pydantic import ConfigDict\n\nfrom app.ingest import ingest_blob\nfrom app.parsing import MIMETYPE_BASED_PARSER\n\n\ndef _guess_mimetype(file_name: str, file_bytes: bytes) -> str:\n    \"\"\"Guess the mime-type of a file based on its name or bytes.\"\"\"\n    # Guess based on the file extension\n    mime_type, _ = mimetypes.guess_type(file_name)\n\n    # Return detected mime type from mimetypes guess, unless it's None\n    if mime_type:\n        return mime_type\n\n    # Signature-based detection for common types\n    if file_bytes.startswith(b\"%PDF\"):\n        return \"application/pdf\"\n    elif file_bytes.startswith(\n        (b\"\\x50\\x4B\\x03\\x04\", b\"\\x50\\x4B\\x05\\x06\", b\"\\x50\\x4B\\x07\\x08\")\n    ):\n        return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n    elif file_bytes.startswith(b\"\\xd0\\xcf\\x11\\xe0\\xa1\\xb1\\x1a\\xe1\"):\n        return \"application/msword\"\n    elif file_bytes.startswith(b\"\\x09\\x00\\xff\\x00\\x06\\x00\"):\n        return \"application/vnd.ms-excel\"\n\n    # Check for CSV-like plain text content (commas, tabs, newlines)\n    try:\n        decoded = file_bytes[:1024].decode(\"utf-8\", errors=\"ignore\")\n        if all(char in decoded for char in (\",\", \"\\n\")) or all(\n            char in decoded for char in (\"\\t\", \"\\n\")\n        ):\n            return \"text/csv\"\n        elif decoded.isprintable() or decoded == \"\":\n            return \"text/plain\"\n    except UnicodeDecodeError:\n        pass\n\n    return \"application/octet-stream\"\n\n\ndef convert_ingestion_input_to_blob(file: UploadFile) -> Blob:\n    \"\"\"Convert ingestion input to blob.\"\"\"\n    file_data = file.file.read()\n    file_name = file.filename\n\n    # Check if file_name is a valid string\n    if not isinstance(file_name, str):\n        raise TypeError(f\"Expected string for file name, got {type(file_name)}\")\n\n    mimetype = _guess_mimetype(file_name, file_data)\n    return Blob.from_data(\n        data=file_data,\n        path=file_name,\n        mime_type=mimetype,\n    )\n\n\ndef _determine_azure_or_openai_embeddings() -> PGVector:\n    if os.environ.get(\"OPENAI_API_KEY\"):\n        return PGVector(\n            connection_string=PG_CONNECTION_STRING,\n            embedding_function=OpenAIEmbeddings(),\n            use_jsonb=True,\n        )\n    if os.environ.get(\"AZURE_OPENAI_API_KEY\"):\n        return PGVector(\n            connection_string=PG_CONNECTION_STRING,\n            embedding_function=AzureOpenAIEmbeddings(\n                azure_endpoint=os.environ.get(\"AZURE_OPENAI_API_BASE\"),\n                azure_deployment=os.environ.get(\n                    \"AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME\"\n                ),\n                openai_api_version=os.environ.get(\"AZURE_OPENAI_API_VERSION\"),\n            ),\n            use_jsonb=True,\n        )\n    raise ValueError(\n        \"Either OPENAI_API_KEY or AZURE_OPENAI_API_KEY needs to be set for embeddings to work.\"\n    )\n\n\nclass IngestRunnable(RunnableSerializable[BinaryIO, List[str]]):\n    \"\"\"Runnable for ingesting files into a vectorstore.\"\"\"\n\n    text_splitter: TextSplitter\n    vectorstore: VectorStore\n    assistant_id: Optional[str] = None\n    thread_id: Optional[str] = None\n    \"\"\"Ingested documents will be associated with assistant_id or thread_id.\n    \n    ID is used as the namespace, and is filtered on at query time.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    @property\n    def namespace(self) -> str:\n        if (self.assistant_id is None and self.thread_id is None) or (\n            self.assistant_id is not None and self.thread_id is not None\n        ):\n            raise ValueError(\n                \"Exactly one of assistant_id or thread_id must be provided\"\n            )\n        return self.assistant_id if self.assistant_id is not None else self.thread_id\n\n    def invoke(self, blob: Blob, config: Optional[RunnableConfig] = None) -> List[str]:\n        out = ingest_blob(\n            blob,\n            MIMETYPE_BASED_PARSER,\n            self.text_splitter,\n            self.vectorstore,\n            self.namespace,\n        )\n        return out\n\n\nPG_CONNECTION_STRING = PGVector.connection_string_from_db_params(\n    driver=\"psycopg2\",\n    host=os.environ[\"POSTGRES_HOST\"],\n    port=int(os.environ[\"POSTGRES_PORT\"]),\n    database=os.environ[\"POSTGRES_DB\"],\n    user=os.environ[\"POSTGRES_USER\"],\n    password=os.environ[\"POSTGRES_PASSWORD\"],\n)\nvstore = _determine_azure_or_openai_embeddings()\n\n\ningest_runnable = IngestRunnable(\n    text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200),\n    vectorstore=vstore,\n).configurable_fields(\n    assistant_id=ConfigurableField(\n        id=\"assistant_id\",\n        annotation=Optional[str],\n        name=\"Assistant ID\",\n    ),\n    thread_id=ConfigurableField(\n        id=\"thread_id\",\n        annotation=Optional[str],\n        name=\"Thread ID\",\n    ),\n)\n"
  },
  {
    "path": "backend/log_config.json",
    "content": "{\n    \"version\": 1,\n    \"disable_existing_loggers\": false,\n    \"formatters\": {\n        \"default\": {\n            \"()\": \"uvicorn.logging.DefaultFormatter\",\n            \"fmt\": \"%(asctime)s - %(name)s - %(levelprefix)s %(message)s\"\n        },\n        \"access\": {\n            \"()\": \"uvicorn.logging.AccessFormatter\",\n            \"fmt\": \"%(asctime)s - %(name)s - %(levelprefix)s  %(client_addr)s - \\\"%(request_line)s\\\" %(status_code)s\"\n        },\n        \"json\": {\n            \"()\": \"pythonjsonlogger.jsonlogger.JsonFormatter\",\n            \"fmt\": \"%(asctime)s - %(name)s - %(levelname)s %(message)s\"\n        }\n    },\n    \"handlers\": {\n        \"default\": {\n            \"formatter\": \"default\",\n            \"class\": \"logging.StreamHandler\",\n            \"stream\": \"ext://sys.stderr\"\n        },\n        \"access\": {\n            \"formatter\": \"access\",\n            \"class\": \"logging.StreamHandler\",\n            \"stream\": \"ext://sys.stdout\"\n        },\n        \"file\": {\n            \"formatter\": \"json\",\n            \"class\": \"logging.handlers.RotatingFileHandler\",\n            \"filename\": \"./app.log\",\n            \"mode\": \"a+\",\n            \"maxBytes\": 10000000,\n            \"backupCount\": 1\n        }\n    },\n    \"root\": {\n        \"handlers\": [\n            \"default\",\n            \"file\"\n        ],\n        \"level\": \"INFO\"\n    },\n    \"loggers\": {\n        \"app\": {\n            \"handlers\": [\n                \"default\",\n                \"file\"\n            ],\n            \"level\": \"INFO\",\n            \"propagate\": false\n        },\n        \"uvicorn\": {\n            \"handlers\": [\n                \"default\",\n                \"file\"\n            ],\n            \"level\": \"INFO\",\n            \"propagate\": false\n        },\n        \"uvicorn.access\": {\n            \"handlers\": [\n                \"access\",\n                \"file\"\n            ],\n            \"level\": \"INFO\",\n            \"propagate\": false\n        }\n    }\n}"
  },
  {
    "path": "backend/migrations/000001_create_extensions_and_first_tables.down.sql",
    "content": "DROP TABLE IF EXISTS thread;\nDROP TABLE IF EXISTS assistant;\nDROP TABLE IF EXISTS checkpoints;\n"
  },
  {
    "path": "backend/migrations/000001_create_extensions_and_first_tables.up.sql",
    "content": "CREATE EXTENSION IF NOT EXISTS vector;\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n\nCREATE TABLE IF NOT EXISTS assistant (\n    assistant_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n    user_id VARCHAR(255) NOT NULL,\n    name VARCHAR(255) NOT NULL,\n    config JSON NOT NULL,\n    updated_at TIMESTAMP WITH TIME ZONE DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),\n    public BOOLEAN NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS thread (\n    thread_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n    assistant_id UUID REFERENCES assistant(assistant_id) ON DELETE SET NULL,\n    user_id VARCHAR(255) NOT NULL,\n    name VARCHAR(255) NOT NULL,\n    updated_at TIMESTAMP WITH TIME ZONE DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC')\n);\n\nCREATE TABLE IF NOT EXISTS checkpoints (\n    thread_id TEXT PRIMARY KEY,\n    checkpoint BYTEA\n);"
  },
  {
    "path": "backend/migrations/000002_checkpoints_update_schema.down.sql",
    "content": "ALTER TABLE checkpoints\n    DROP CONSTRAINT IF EXISTS checkpoints_pkey,\n    ADD PRIMARY KEY (thread_id),\n    DROP COLUMN IF EXISTS thread_ts,\n    DROP COLUMN IF EXISTS parent_ts;\n"
  },
  {
    "path": "backend/migrations/000002_checkpoints_update_schema.up.sql",
    "content": "ALTER TABLE checkpoints\n    ADD COLUMN IF NOT EXISTS thread_ts TIMESTAMPTZ,\n    ADD COLUMN IF NOT EXISTS parent_ts TIMESTAMPTZ;\n\nUPDATE checkpoints\n    SET thread_ts = CURRENT_TIMESTAMP AT TIME ZONE 'UTC'\nWHERE thread_ts IS NULL;\n\nALTER TABLE checkpoints\n    DROP CONSTRAINT IF EXISTS checkpoints_pkey,\n    ADD PRIMARY KEY (thread_id, thread_ts)\n"
  },
  {
    "path": "backend/migrations/000003_create_user.down.sql",
    "content": "ALTER TABLE assistant\n    DROP CONSTRAINT fk_assistant_user_id,\n    ALTER COLUMN user_id TYPE VARCHAR USING (user_id::text);\n\nALTER TABLE thread\n    DROP CONSTRAINT fk_thread_user_id,\n    ALTER COLUMN user_id TYPE VARCHAR USING (user_id::text);\n\nDROP TABLE IF EXISTS \"user\";"
  },
  {
    "path": "backend/migrations/000003_create_user.up.sql",
    "content": "CREATE TABLE IF NOT EXISTS \"user\" (\n    user_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),\n    sub VARCHAR(255) UNIQUE NOT NULL,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'UTC')\n);\n\nINSERT INTO \"user\" (user_id, sub)\nSELECT DISTINCT user_id::uuid, user_id\nFROM assistant\nWHERE user_id IS NOT NULL\nON CONFLICT (user_id) DO NOTHING;\n\nINSERT INTO \"user\" (user_id, sub)\nSELECT DISTINCT user_id::uuid, user_id\nFROM thread\nWHERE user_id IS NOT NULL\nON CONFLICT (user_id) DO NOTHING;\n\nALTER TABLE assistant\n    ALTER COLUMN user_id TYPE UUID USING (user_id::UUID),\n    ADD CONSTRAINT fk_assistant_user_id FOREIGN KEY (user_id) REFERENCES \"user\"(user_id);\n\nALTER TABLE thread\n    ALTER COLUMN user_id TYPE UUID USING (user_id::UUID),\n    ADD CONSTRAINT fk_thread_user_id FOREIGN KEY (user_id) REFERENCES \"user\"(user_id);"
  },
  {
    "path": "backend/migrations/000004_add_metadata_to_thread.down.sql",
    "content": "ALTER TABLE thread\nDROP COLUMN metadata;"
  },
  {
    "path": "backend/migrations/000004_add_metadata_to_thread.up.sql",
    "content": "ALTER TABLE thread\nADD COLUMN metadata JSONB;\n\nUPDATE thread\nSET metadata = json_build_object(\n    'assistant_type', (SELECT config->'configurable'->>'type'\n                 FROM assistant\n                 WHERE assistant.assistant_id = thread.assistant_id)\n);"
  },
  {
    "path": "backend/migrations/000005_advanced_checkpoints_schema.down.sql",
    "content": "-- Drop the blob storage table\nDROP TABLE IF EXISTS checkpoint_blobs;\n\n-- Drop the writes tracking table\nDROP TABLE IF EXISTS checkpoint_writes;\n\n-- Drop the new checkpoints table that was created by the application\nDROP TABLE IF EXISTS checkpoints;\n\n-- Restore the original checkpoints table by renaming old_checkpoints back\n-- This preserves the original data that was saved before the migration\nALTER TABLE old_checkpoints RENAME TO checkpoints;"
  },
  {
    "path": "backend/migrations/000005_advanced_checkpoints_schema.up.sql",
    "content": "-- BREAKING CHANGE WARNING:\n-- This migration represents a transition from pickle-based checkpointing to a new checkpoint system.\n-- As a result, any threads created before this migration will not be usable/clickable in the UI.\n-- old thread data remains in old_checkpoints table but cannot be accessed by the new version.\n\n-- Rename existing checkpoints table to preserve current data\n-- This is necessary because the application will create a new checkpoints table\n-- with an updated schema during runtime initialization.\nALTER TABLE checkpoints RENAME TO old_checkpoints;"
  },
  {
    "path": "backend/pyproject.toml",
    "content": "[tool.poetry]\nname = \"opengpts\"\nversion = \"0.1.0\"\ndescription = \"\"\nauthors = [\"Your Name <you@example.com>\"]\nreadme = \"README.md\"\npackages = [{include = \"app\"}]\n\n[tool.poetry.dependencies]\npython = \"^3.9.0,<3.12\"\nsse-starlette = \"^1.6.5\"\ntomli-w = \"^1.0.0\"\nuvicorn = \"^0.23.2\"\nfastapi = \"^0.103.2\"\n# Uncomment if you need to work from a development branch\n# This will only work for local development though!\n# langchain = { git = \"git@github.com:langchain-ai/langchain.git/\", branch = \"nc/subclass-runnable-binding\" , subdirectory = \"libs/langchain\"}\norjson = \"^3.9.10\"\npython-multipart = \"^0.0.6\"\ntiktoken = \"^0\"\nlangchain = \"^0.3\"\nlanggraph = \"0.2.45\"\nlanggraph-checkpoint-postgres = \"^2.0.2\"\npydantic = \"^2\"\nlangchain-openai = \"^0.2\"\nbeautifulsoup4 = \"^4.12.3\"\nboto3 = \"^1.34.28\"\nduckduckgo-search = \"^5.3.0\"\narxiv = \"^2.1.0\"\nkay = \"^0.1.2\"\nxmltodict = \"^0.13.0\"\nwikipedia = \"^1.4.0\"\nlangchain-google-vertexai = \"^2.0\"\nlangchain-google-community = \"^2.0.1\"\nsetuptools = \"^69.0.3\"\npdfminer-six = \"^20231228\"\nfireworks-ai = \"^0.11.2\"\nhttpx = { version = \"^0\", extras = [\"socks\"] }\nunstructured = {extras = [\"doc\", \"docx\"], version = \"^0\"}\npgvector = \"^0.2.5\"\npsycopg2-binary = \"^2.9.9\"\nasyncpg = \"^0.29.0\"\nlangchain-core = \"^0.3\"\npyjwt = {extras = [\"crypto\"], version = \"^2.8.0\"}\nlangchain-anthropic = \"^0.2\"\nstructlog = \"^24.1.0\"\npython-json-logger = \"^2.0.7\"\n\n[tool.poetry.group.dev.dependencies]\nuvicorn = \"^0.23.2\"\npygithub = \"^2.1.1\"\n\n[tool.poetry.group.lint.dependencies]\nruff = \"^0.1.4\"\ncodespell = \"^2.2.0\"\n\n[tool.poetry.group.test.dependencies]\npytest = \"^7.2.1\"\npytest-cov = \"^4.0.0\"\npytest-asyncio = \"^0.21.1\"\npytest-mock = \"^3.11.1\"\npytest-socket = \"^0.6.0\"\npytest-watch = \"^4.2.0\"\npytest-timeout = \"^2.2.0\"\n\n[tool.coverage.run]\nomit = [\n    \"tests/*\",\n]\n\n[tool.pytest.ini_options]\n# --strict-markers will raise errors on unknown marks.\n# https://docs.pytest.org/en/7.1.x/how-to/mark.html#raising-errors-on-unknown-marks\n#\n# https://docs.pytest.org/en/7.1.x/reference/reference.html\n# --strict-config       any warnings encountered while parsing the `pytest`\n#                       section of the configuration file raise errors.\naddopts = \"--strict-markers --strict-config --durations=5 -vv\"\n# Use global timeout of 30 seconds for now.\n# Most tests should be closer to ~100 ms, but some of the tests involve\n# parsing files. We can adjust on a per test basis later on.\ntimeout = 30\nasyncio_mode = \"auto\"\n\n\n[build-system]\nrequires = [\"poetry-core\"]\nbuild-backend = \"poetry.core.masonry.api\"\n"
  },
  {
    "path": "backend/tests/__init__.py",
    "content": ""
  },
  {
    "path": "backend/tests/unit_tests/__init__.py",
    "content": ""
  },
  {
    "path": "backend/tests/unit_tests/agent_executor/__init__.py",
    "content": ""
  },
  {
    "path": "backend/tests/unit_tests/agent_executor/test_parsing.py",
    "content": "\"\"\"Test parsing logic.\"\"\"\nimport mimetypes\n\nfrom langchain_community.document_loaders import Blob\n\nfrom app.parsing import MIMETYPE_BASED_PARSER, SUPPORTED_MIMETYPES\nfrom tests.unit_tests.fixtures import get_sample_paths\n\n\ndef test_list_of_supported_mimetypes() -> None:\n    \"\"\"This list should generally grow! Protecting against typos in mimetypes.\"\"\"\n    assert SUPPORTED_MIMETYPES == [\n        \"application/msword\",\n        \"application/pdf\",\n        \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n        \"text/html\",\n        \"text/plain\",\n    ]\n\n\ndef test_attempt_to_parse_each_fixture() -> None:\n    \"\"\"Attempt to parse supported fixtures.\"\"\"\n    seen_mimetypes = set()\n    for path in get_sample_paths():\n        type_, _ = mimetypes.guess_type(path)\n        if type_ not in SUPPORTED_MIMETYPES:\n            continue\n        seen_mimetypes.add(type_)\n        blob = Blob.from_path(path)\n        documents = MIMETYPE_BASED_PARSER.parse(blob)\n        try:\n            assert len(documents) == 1\n            doc = documents[0]\n            assert \"source\" in doc.metadata\n            assert doc.metadata[\"source\"] == str(path)\n            assert \"🦜\" in doc.page_content\n        except Exception as e:\n            raise AssertionError(f\"Failed to parse {path}\") from e\n\n    known_missing = {\"application/msword\"}\n    assert set(SUPPORTED_MIMETYPES) - known_missing == seen_mimetypes\n"
  },
  {
    "path": "backend/tests/unit_tests/agent_executor/test_upload.py",
    "content": "from io import BytesIO\n\nfrom fastapi import UploadFile\nfrom langchain.text_splitter import RecursiveCharacterTextSplitter\n\nfrom app.upload import IngestRunnable, _guess_mimetype, convert_ingestion_input_to_blob\nfrom tests.unit_tests.fixtures import get_sample_paths\nfrom tests.unit_tests.utils import InMemoryVectorStore\n\n\ndef test_ingestion_runnable() -> None:\n    \"\"\"Test ingestion runnable\"\"\"\n    vectorstore = InMemoryVectorStore()\n    splitter = RecursiveCharacterTextSplitter()\n    runnable = IngestRunnable(\n        text_splitter=splitter,\n        vectorstore=vectorstore,\n        input_key=\"file_contents\",\n        assistant_id=\"TheParrot\",\n    )\n    # Simulate file data\n    file_data = BytesIO(b\"test data\")\n    file_data.seek(0)\n    # Create UploadFile object\n    file = UploadFile(filename=\"testfile.txt\", file=file_data)\n\n    # Convert the file to blob\n    blob = convert_ingestion_input_to_blob(file)\n    ids = runnable.invoke(blob)\n    assert len(ids) == 1\n\n\ndef test_mimetype_guessing() -> None:\n    \"\"\"Verify mimetype guessing for all fixtures.\"\"\"\n    name_to_mime = {}\n    for file in sorted(get_sample_paths()):\n        data = file.read_bytes()\n        name_to_mime[file.name] = _guess_mimetype(file.name, data)\n\n    assert {\n        \"sample.docx\": (\n            \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n        ),\n        \"sample.epub\": \"application/epub+zip\",\n        \"sample.html\": \"text/html\",\n        \"sample.odt\": \"application/vnd.oasis.opendocument.text\",\n        \"sample.pdf\": \"application/pdf\",\n        \"sample.rtf\": \"application/rtf\",\n        \"sample.txt\": \"text/plain\",\n    } == name_to_mime\n"
  },
  {
    "path": "backend/tests/unit_tests/app/__init__.py",
    "content": ""
  },
  {
    "path": "backend/tests/unit_tests/app/helpers.py",
    "content": "from contextlib import asynccontextmanager\n\nfrom httpx import AsyncClient\nfrom typing_extensions import AsyncGenerator\n\n\n@asynccontextmanager\nasync def get_client() -> AsyncGenerator[AsyncClient, None]:\n    \"\"\"Get the app.\"\"\"\n    from app.server import app\n\n    async with AsyncClient(app=app, base_url=\"http://test\") as ac:\n        yield ac\n"
  },
  {
    "path": "backend/tests/unit_tests/app/test_app.py",
    "content": "\"\"\"Test the server and client together.\"\"\"\n\nfrom typing import Optional, Sequence\nfrom uuid import uuid4\n\nimport asyncpg\nfrom pydantic import BaseModel\n\nfrom app.schema import Assistant, Thread\nfrom tests.unit_tests.app.helpers import get_client\n\n\ndef _project(model: BaseModel, *, exclude_keys: Optional[Sequence[str]] = None) -> dict:\n    \"\"\"Return a dict with only the keys specified.\"\"\"\n    d = model.model_dump()\n    _exclude = set(exclude_keys) if exclude_keys else set()\n    return {k: v for k, v in d.items() if k not in _exclude}\n\n\nasync def test_list_and_create_assistants(pool: asyncpg.pool.Pool) -> None:\n    \"\"\"Test list and create assistants.\"\"\"\n    headers = {\"Cookie\": \"opengpts_user_id=1\"}\n    aid = str(uuid4())\n\n    async with pool.acquire() as conn:\n        assert len(await conn.fetch(\"SELECT * FROM assistant;\")) == 0\n\n    async with get_client() as client:\n        response = await client.get(\n            \"/assistants/\",\n            headers=headers,\n        )\n        assert response.status_code == 200\n\n        assert response.json() == []\n\n        # Create an assistant\n        response = await client.put(\n            f\"/assistants/{aid}\",\n            json={\"name\": \"bobby\", \"config\": {}, \"public\": False},\n            headers=headers,\n        )\n        assert response.status_code == 200\n        assistant = Assistant.model_validate(response.json())\n        assert _project(assistant, exclude_keys=[\"updated_at\", \"user_id\"]) == {\n            \"assistant_id\": aid,\n            \"config\": {},\n            \"name\": \"bobby\",\n            \"public\": False,\n        }\n        async with pool.acquire() as conn:\n            assert len(await conn.fetch(\"SELECT * FROM assistant;\")) == 1\n\n        response = await client.get(\"/assistants/\", headers=headers)\n        assistants = [Assistant.model_validate(d) for d in response.json()]\n        assert [\n            _project(d, exclude_keys=[\"updated_at\", \"user_id\"]) for d in assistants\n        ] == [\n            {\n                \"assistant_id\": aid,\n                \"config\": {},\n                \"name\": \"bobby\",\n                \"public\": False,\n            }\n        ]\n\n        response = await client.put(\n            f\"/assistants/{aid}\",\n            json={\"name\": \"bobby\", \"config\": {}, \"public\": False},\n            headers=headers,\n        )\n\n        assistant = Assistant.model_validate(response.json())\n        assert _project(assistant, exclude_keys=[\"updated_at\", \"user_id\"]) == {\n            \"assistant_id\": aid,\n            \"config\": {},\n            \"name\": \"bobby\",\n            \"public\": False,\n        }\n\n        # Check not visible to other users\n        headers = {\"Cookie\": \"opengpts_user_id=2\"}\n        response = await client.get(\"/assistants/\", headers=headers)\n        assert response.status_code == 200, response.text\n        assert response.json() == []\n\n\nasync def test_threads(pool: asyncpg.pool.Pool) -> None:\n    \"\"\"Test put thread.\"\"\"\n    headers = {\"Cookie\": \"opengpts_user_id=1\"}\n    aid = str(uuid4())\n    tid = str(uuid4())\n\n    async with get_client() as client:\n        response = await client.put(\n            f\"/assistants/{aid}\",\n            json={\n                \"name\": \"assistant\",\n                \"config\": {\"configurable\": {\"type\": \"chatbot\"}},\n                \"public\": False,\n            },\n            headers=headers,\n        )\n\n        response = await client.put(\n            f\"/threads/{tid}\",\n            json={\"name\": \"bobby\", \"assistant_id\": aid},\n            headers=headers,\n        )\n        assert response.status_code == 200, response.text\n        _ = Thread.model_validate(response.json())\n\n        response = await client.get(f\"/threads/{tid}/state\", headers=headers)\n        assert response.status_code == 200\n        assert response.json() == {\"values\": None, \"next\": []}\n\n        response = await client.get(\"/threads/\", headers=headers)\n\n        assert response.status_code == 200\n        threads = [Thread.model_validate(d) for d in response.json()]\n        assert [\n            _project(d, exclude_keys=[\"updated_at\", \"user_id\"]) for d in threads\n        ] == [\n            {\n                \"assistant_id\": aid,\n                \"name\": \"bobby\",\n                \"thread_id\": tid,\n                \"metadata\": {\"assistant_type\": \"chatbot\"},\n            }\n        ]\n\n        response = await client.put(\n            f\"/threads/{tid}\",\n            headers={\"Cookie\": \"opengpts_user_id=2\"},\n        )\n        assert response.status_code == 422\n"
  },
  {
    "path": "backend/tests/unit_tests/app/test_auth.py",
    "content": "from base64 import b64encode\nfrom datetime import datetime, timedelta, timezone\nfrom typing import Optional\nfrom unittest.mock import MagicMock, patch\n\nimport jwt\n\nfrom app.auth.handlers import AuthedUser, get_auth_handler\nfrom app.auth.settings import (\n    AuthType,\n    JWTSettingsLocal,\n    JWTSettingsOIDC,\n)\nfrom app.auth.settings import (\n    settings as auth_settings,\n)\nfrom app.server import app\nfrom tests.unit_tests.app.helpers import get_client\n\n\n@app.get(\"/me\")\nasync def me(user: AuthedUser) -> dict:\n    return user.model_dump()\n\n\ndef _create_jwt(\n    key: str, alg: str, payload: dict, headers: Optional[dict] = None\n) -> str:\n    return jwt.encode(payload, key, algorithm=alg, headers=headers)\n\n\nasync def test_noop():\n    get_auth_handler.cache_clear()\n    auth_settings.auth_type = AuthType.NOOP\n    sub = \"user_noop\"\n\n    async with get_client() as client:\n        response = await client.get(\"/me\", cookies={\"opengpts_user_id\": sub})\n        assert response.status_code == 200\n        assert response.json()[\"sub\"] == sub\n\n\nasync def test_jwt_local():\n    get_auth_handler.cache_clear()\n    auth_settings.auth_type = AuthType.JWT_LOCAL\n    key = \"key\"\n    auth_settings.jwt_local = JWTSettingsLocal(\n        alg=\"HS256\",\n        iss=\"issuer\",\n        aud=\"audience\",\n        decode_key_b64=b64encode(key.encode(\"utf-8\")),\n    )\n    sub = \"user_jwt_local\"\n\n    token = _create_jwt(\n        key=key,\n        alg=auth_settings.jwt_local.alg,\n        payload={\n            \"sub\": sub,\n            \"iss\": auth_settings.jwt_local.iss,\n            \"aud\": auth_settings.jwt_local.aud,\n            \"exp\": datetime.now(timezone.utc) + timedelta(days=1),\n        },\n    )\n\n    async with get_client() as client:\n        response = await client.get(\"/me\", headers={\"Authorization\": f\"Bearer {token}\"})\n        assert response.status_code == 200\n        assert response.json()[\"sub\"] == sub\n\n    # Test invalid token\n    async with get_client() as client:\n        response = await client.get(\"/me\", headers={\"Authorization\": \"Bearer xyz\"})\n        assert response.status_code == 401\n\n\nasync def test_jwt_oidc():\n    get_auth_handler.cache_clear()\n    auth_settings.auth_type = AuthType.JWT_OIDC\n    auth_settings.jwt_oidc = JWTSettingsOIDC(iss=\"issuer\", aud=\"audience\")\n    sub = \"user_jwt_oidc\"\n    key = \"key\"\n    alg = \"HS256\"\n\n    token = _create_jwt(\n        key=key,\n        alg=alg,\n        payload={\n            \"sub\": sub,\n            \"iss\": auth_settings.jwt_oidc.iss,\n            \"aud\": auth_settings.jwt_oidc.aud,\n            \"exp\": datetime.now(timezone.utc) + timedelta(days=1),\n        },\n        headers={\"kid\": \"kid\", \"alg\": alg},\n    )\n\n    mock_jwk_client = MagicMock()\n    mock_jwk_client.get_signing_key.return_value = MagicMock(key=key)\n\n    with patch(\n        \"app.auth.handlers.JWTAuthOIDC._get_jwk_client\", return_value=mock_jwk_client\n    ):\n        async with get_client() as client:\n            response = await client.get(\n                \"/me\", headers={\"Authorization\": f\"Bearer {token}\"}\n            )\n            assert response.status_code == 200\n            assert response.json()[\"sub\"] == sub\n"
  },
  {
    "path": "backend/tests/unit_tests/conftest.py",
    "content": "import asyncio\nimport os\nimport subprocess\n\nimport asyncpg\nimport pytest\n\nfrom app.auth.settings import AuthType\nfrom app.auth.settings import settings as auth_settings\nfrom app.lifespan import get_pg_pool, lifespan\nfrom app.server import app\n\nauth_settings.auth_type = AuthType.NOOP\n\n# Temporary handling of environment variables for testing\nos.environ[\"OPENAI_API_KEY\"] = \"test\"\n\nTEST_DB = \"test\"\nassert os.environ[\"POSTGRES_DB\"] != TEST_DB, \"Test and main database conflict.\"\nos.environ[\"POSTGRES_DB\"] = TEST_DB\n\n\nasync def _get_conn() -> asyncpg.Connection:\n    return await asyncpg.connect(\n        user=os.environ[\"POSTGRES_USER\"],\n        password=os.environ[\"POSTGRES_PASSWORD\"],\n        host=os.environ[\"POSTGRES_HOST\"],\n        port=os.environ[\"POSTGRES_PORT\"],\n        database=\"postgres\",\n    )\n\n\nasync def _create_test_db() -> None:\n    \"\"\"Check if the test database exists and create it if it doesn't.\"\"\"\n    conn = await _get_conn()\n    exists = await conn.fetchval(\"SELECT 1 FROM pg_database WHERE datname=$1\", TEST_DB)\n    if not exists:\n        await conn.execute(f'CREATE DATABASE \"{TEST_DB}\"')\n    await conn.close()\n\n\nasync def _drop_test_db() -> None:\n    \"\"\"Check if the test database exists and if so, drop it.\"\"\"\n    conn = await _get_conn()\n    exists = await conn.fetchval(\"SELECT 1 FROM pg_database WHERE datname=$1\", TEST_DB)\n    if exists:\n        await conn.execute(f'DROP DATABASE \"{TEST_DB}\" WITH (FORCE)')\n    await conn.close()\n\n\ndef _migrate_test_db() -> None:\n    subprocess.run([\"make\", \"migrate\"], check=True)\n\n\n@pytest.fixture(scope=\"session\")\nasync def _init_db():\n    \"\"\"Initialize the test database.\"\"\"\n    await _drop_test_db()  # In case previous test session was abruptly terminated\n    await _create_test_db()\n    _migrate_test_db()\n\n\n@pytest.fixture(scope=\"session\")\nasync def pool(_init_db):\n    \"\"\"Initialize database pool with checkpointer.\"\"\"\n    async with lifespan(app):\n        yield get_pg_pool()\n    await _drop_test_db()\n\n\n@pytest.fixture(scope=\"function\", autouse=True)\nasync def clear_test_db(pool):\n    \"\"\"Truncate all tables before each test.\"\"\"\n    async with pool.acquire() as conn:\n        query = \"\"\"\n        DO\n        $$\n        DECLARE\n        r RECORD;\n        BEGIN\n        FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP\n            EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE;';\n        END LOOP;\n        END\n        $$;\n        \"\"\"\n        await conn.execute(query)\n\n\n@pytest.fixture(scope=\"session\")\ndef event_loop(request):\n    loop = asyncio.get_event_loop_policy().new_event_loop()\n    yield loop\n    loop.close()\n"
  },
  {
    "path": "backend/tests/unit_tests/fixtures/__init__.py",
    "content": "from pathlib import Path\nfrom typing import List\n\nHERE = Path(__file__).parent\n\n# PUBLIC API\n\n\ndef get_sample_paths() -> List[Path]:\n    \"\"\"List all fixtures.\"\"\"\n    return list(HERE.glob(\"sample.*\"))\n"
  },
  {
    "path": "backend/tests/unit_tests/fixtures/sample.html",
    "content": "<html><head><meta content=\"text/html; charset=UTF-8\" http-equiv=\"content-type\"><style type=\"text/css\">.lst-kix_n6n0tzfwn8i8-5>li:before{content:\"\\0025a0   \"}.lst-kix_n6n0tzfwn8i8-6>li:before{content:\"\\0025cf   \"}ul.lst-kix_n6n0tzfwn8i8-8{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-7{list-style-type:none}.lst-kix_n6n0tzfwn8i8-3>li:before{content:\"\\0025cf   \"}.lst-kix_n6n0tzfwn8i8-4>li:before{content:\"\\0025cb   \"}.lst-kix_n6n0tzfwn8i8-7>li:before{content:\"\\0025cb   \"}.lst-kix_n6n0tzfwn8i8-8>li:before{content:\"\\0025a0   \"}.lst-kix_n6n0tzfwn8i8-1>li:before{content:\"\\0025cb   \"}.lst-kix_n6n0tzfwn8i8-2>li:before{content:\"\\0025a0   \"}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_n6n0tzfwn8i8-0>li:before{content:\"\\0025cf   \"}ul.lst-kix_n6n0tzfwn8i8-2{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-1{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-0{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-6{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-5{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-4{list-style-type:none}ul.lst-kix_n6n0tzfwn8i8-3{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c6{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:156pt;border-top-color:#000000;border-bottom-style:solid}.c0{-webkit-text-decoration-skip:none;color:#000000;font-weight:400;text-decoration:underline;vertical-align:baseline;text-decoration-skip-ink:none;font-size:11pt;font-family:\"Arial\";font-style:normal}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.0;orphans:2;widows:2;text-align:left;height:11pt}.c11{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:\"Arial\";font-style:italic}.c3{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:\"Arial\";font-style:normal}.c12{color:#000000;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:\"Arial\";font-style:normal}.c7{padding-top:0pt;padding-bottom:0pt;line-height:1.0;orphans:2;widows:2;text-align:left}.c1{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c8{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c14{border-spacing:0;border-collapse:collapse;margin-right:auto}.c13{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c15{padding:0;margin:0}.c10{margin-left:36pt;padding-left:0pt}.c5{color:inherit;text-decoration:inherit}.c9{height:11pt}.c2{height:0pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:\"Arial\"}p{margin:0;color:#000000;font-size:11pt;font-family:\"Arial\"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:\"Arial\";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style></head><body class=\"c13 doc-content\"><p class=\"c1\"><span class=\"c3\">🦜️ LangChain</span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1\"><span class=\"c0\">Underline</span></p><p class=\"c1 c9\"><span class=\"c0\"></span></p><p class=\"c1\"><span class=\"c12\">Bold</span></p><p class=\"c1 c9\"><span class=\"c12\"></span></p><p class=\"c1\"><span class=\"c11\">Italics</span></p><p class=\"c1 c9\"><span class=\"c11\"></span></p><p class=\"c1 c9\"><span class=\"c11\"></span></p><a id=\"t.e89270b97fc18eabe5c666cba79cd82cff5b5c3d\"></a><a id=\"t.0\"></a><table class=\"c14\"><tbody><tr class=\"c2\"><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c4\"><span class=\"c12\"></span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c12\">Col 1</span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c12\">Col 2</span></p></td></tr><tr class=\"c2\"><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c12\">Row 1</span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c3\">1</span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c3\">2</span></p></td></tr><tr class=\"c2\"><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c12\">Row 2</span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c3\">3</span></p></td><td class=\"c6\" colspan=\"1\" rowspan=\"1\"><p class=\"c7\"><span class=\"c3\">4</span></p></td></tr></tbody></table><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1\"><span>Link: </span><span class=\"c8\"><a class=\"c5\" href=\"https://www.google.com/url?q=https://www.langchain.com/&amp;sa=D&amp;source=editors&amp;ust=1699572948600868&amp;usg=AOvVaw2T4jvAmPuMvcyed6PrEjq1\">https://www.langchain.com/</a></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><ul class=\"c15 lst-kix_n6n0tzfwn8i8-0 start\"><li class=\"c1 c10 li-bullet-0\"><span class=\"c3\">Item 1</span></li><li class=\"c1 c10 li-bullet-0\"><span class=\"c3\">Item 2</span></li><li class=\"c1 c10 li-bullet-0\"><span class=\"c3\">Item 3</span></li><li class=\"c1 c10 li-bullet-0\"><span class=\"c3\">We also love cats 🐱</span></li></ul><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1\"><span class=\"c3\">Image</span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1\"><span style=\"overflow: hidden; display: inline-block; margin: 0.00px 0.00px; border: 0.00px solid #000000; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px); width: 624.00px; height: 132.00px;\"><img alt=\"\" src=\"sample_files/image1.png\" style=\"width: 624.00px; height: 132.00px; margin-left: 0.00px; margin-top: 0.00px; transform: rotate(0.00rad) translateZ(0px); -webkit-transform: rotate(0.00rad) translateZ(0px);\" title=\"\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p><p class=\"c1 c9\"><span class=\"c3\"></span></p></body></html>"
  },
  {
    "path": "backend/tests/unit_tests/fixtures/sample.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\uc0\\stshfdbch0\\stshfloch0\\stshfhich0\\stshfbi0\\deff0\\adeff0{\\fonttbl{\\f0\\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f1\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}{\\f2\\fswiss\\fcharset0\\fprq2{\\*\\panose 020b0604020202020204}Arial;}}{\\colortbl;\\red0\\green0\\blue0;\\red17\\green85\\blue204;\r\n\\red67\\green67\\blue67;\\red102\\green102\\blue102;}{\\stylesheet{\\s0\\snext0\\sqformat\\spriority0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Normal;}{\\s1\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb400\\sa120\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs40\\ltrch\\b0\\i0\\fs40\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 heading 1;}{\\s2\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb360\\sa120\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs32\\ltrch\\b0\\i0\\fs32\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 heading 2;}{\\s3\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb320\\sa80\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs28\\ltrch\\b0\\i0\\fs28\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf3 heading 3;}{\\s4\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb280\\sa80\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs24\\ltrch\\b0\\i0\\fs24\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf4 heading 4;}{\\s5\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb240\\sa80\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf4 heading 5;}{\\s6\\sbasedon0\\snext0\\styrsid15694742\r\n\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb240\\sa80\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai\\af2\\afs22\\ltrch\\b0\\i\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf4 heading 6;}{\\*\\cs10\\additive\\ssemihidden\\spriority0 Default Paragraph Font;\r\n}{\\*\\ts11\\tsrowd\\snext11\\ssemihidden\\spriority0\\aspalpha\\aspnum\\adjustright\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\tsvertalt\\tsbrdrl\\tsbrdrr\\tsbrdrt\\tsbrdrb\\tsbrdrdgr\\tsbrdrdgl\\tsbrdrh\\tsbrdrv\\trpaddl108\\trpaddfl3\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\r\n\\trpaddfb3\\trpaddr108\\trpaddfr3 Normal Table;}{\\s15\\sbasedon0\\snext15\\styrsid15694742\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb0\\sa60\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs52\\ltrch\\b0\\i0\\fs52\\loch\\af2\r\n\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Title;}{\\s16\\sbasedon0\\snext16\\styrsid15694742\\sqformat\\spriority0\\keep\\keepn\\fi0\\sb0\\sa320\\aspalpha\\aspnum\\adjustright\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs30\\ltrch\\b0\\i0\\fs30\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf4 Subtitle;}}{\\*\\listtable{\\list\\listtemplateid1{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9679 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx360\\fi-360\\li720\\lin720}{\r\n\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9675 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx1080\\fi-360\\li1440\\lin1440}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9632 ;}{\r\n\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx1800\\fi-180\\li2160\\lin2160}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9679 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx2520\\fi-360\\li2880\\lin2880}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1\r\n{\\leveltext \\'01\\u9675 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx3240\\fi-360\\li3600\\lin3600}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9632 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx3960\\fi-180\\li4320\\lin4320}\r\n{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9679 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx4680\\fi-360\\li5040\\lin5040}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9675 ;\r\n}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx5400\\fi-360\\li5760\\lin5760}{\\listlevel\\levelnfc23\\levelnfcn23\\leveljc0\\leveljcn0\\levelstartat1{\\leveltext \\'01\\u9632 ;}{\\levelnumbers;}\\levelfollow0\\ulnone\\jclisttab\\tx6120\\fi-180\\li6480\\lin6480}\\listid1}}\r\n{\\*\\listoverridetable{\\listoverride\\listid1\\listoverridecount0\\ls1}}{\\*\\rsidtbl\\rsid10976062\\rsid13249109}{\\*\\generator Aspose.Words for Java 23.4.0;}{\\info\\version1\\edmins0\\nofpages1\\nofwords0\\nofchars0\\nofcharsws0}\\paperw12240\\paperh15840\\margl1440\\margr1440\\margt1440\\margb1440\\gutter0\r\n{\\mmathPr\\mbrkBin0\\mbrkBinSub0\\mdefJc1\\mdispDef1\\minterSp0\\mintLim0\\mintraSp0\\mlMargin0\\mmathFont0\\mnaryLim1\\mpostSp0\\mpreSp0\\mrMargin0\\msmallFrac0\\mwrapIndent1440\\mwrapRight0}\\deflang1033\\deflangfe2052\\adeflang1025\\jexpand\\showxmlerrors1\\validatexml1{\r\n\\*\\wgrffmtfilter 013f}\\viewkind1\\viewscale100\\fet0\\ftnbj\\aenddoc\\ftnrstcont\\aftnrstcont\\ftnnar\\aftnnrlc\\widowctrl\\nospaceforul\\nolnhtadjtbl\\alntblind\\lyttblrtgr\\dntblnsbdb\\noxlattoyen\\wrppunct\\nobrkwrptbl\\expshrtn\\snaptogridincell\\asianbrkrule\\htmautsp\\noultrlspc\r\n\\useltbaln\\splytwnine\\ftnlytwnine\\lytcalctblwd\\allowfieldendsel\\lnbrkrule\\nouicompat\\nofeaturethrottle1\\utinl\\formshade\\nojkernpunct\\dghspace180\\dgvspace180\\dghorigin1800\\dgvorigin1440\\dghshow1\\dgvshow1\\dgmargin\\pgbrdrhead\\pgbrdrfoot\\rsidroot10976062\\sectd\\sectlinegrid360\\pgwsxn12240\\pghsxn15840\\marglsxn1440\\margrsxn1440\\margtsxn1440\\margbsxn1440\\guttersxn0\\headery720\\footery720\\colsx720\\ltrsect\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\r\n\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\r\n\\hich\\f2\\strike0\\ulnone\\cf1 \\u-10178 \\u-8804 \\u-497  }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 LangChain}{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\r\n\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\r\n\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\r\n\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf1 Underline}{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ul\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\r\n\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ul\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Bold}{\\rtlch\\ab\\ai0\\af2\\afs22\\ltrch\\b\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\r\n\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\r\n\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\afs22\\ltrch\\b\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\r\n\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai\\af2\\alang1025\\afs22\\ltrch\\b0\\i\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Italics}\r\n{\\rtlch\\ab0\\ai\\af2\\afs22\\ltrch\\b0\\i\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\r\n\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai\\af2\\afs22\\ltrch\\b0\\i\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\r\n\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai\\af2\\afs22\\ltrch\\b0\\i\\fs22\\loch\\af2\\dbch\\af2\r\n\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\trowd\\irow0\\irowband0\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrv\r\n\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\r\n\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\r\n\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Col}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  1}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Col}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  2}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}{\\trowd\\irow0\\irowband0\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrv\r\n\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\r\n\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\r\n\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\row}\\trowd\\irow1\\irowband1\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrv\r\n\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\r\n\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\r\n\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Row}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  1}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 1}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 2}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}{\\trowd\\irow1\\irowband1\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrv\r\n\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\r\n\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\r\n\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\r\n\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\row}\\trowd\\irow2\\irowband2\\lastrow\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\r\n\\trbrdrv\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\r\n\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\r\n\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Row}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  2}{\\rtlch\\ab\\ai0\\af2\\alang1025\\afs22\\ltrch\\b\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 3}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}\\pard\\plain\\intbl\\itap1\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl240\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 4}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\cell}{\\trowd\\irow2\\irowband2\\lastrow\\ltrrow\\trql\\trgaph100\\trpaddl100\\trpaddfl3\\trbrdrt\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrl\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrb\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrr\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trbrdrh\\brdrs\\brdrw10\\brdrcf0\\brsp0\r\n\\trbrdrv\\brdrs\\brdrw10\\brdrcf0\\brsp0\\trwWidth5000\\trftsWidth2\\trautofit1\\trwWidthB0\\trftsWidthB3\\trpaddt0\\trpaddft3\\trpaddb0\\trpaddfb3\\trpaddr108\\trpaddfr3\\trrh0\\trleft-100\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\r\n\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx3020\\clwWidth3120\\clftsWidth3\\clvertalt\\clpadl100\r\n\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx6140\\clwWidth3120\\clftsWidth3\r\n\\clvertalt\\clpadl100\\clpadfl3\\clpadb100\\clpadfb3\\clpadt100\\clpadft3\\clpadr100\\clpadfr3\\clbrdrl\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrr\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrt\\brdrs\\brdrw20\\brdrcf1\\brsp0\\clbrdrb\\brdrs\\brdrw20\\brdrcf1\\brsp0\\cldgll\\brdrnone\\cldglu\\brdrnone\\cellx9260\\tbllkhdrrows\\tbllkhdrcols\\tbllknocolband\r\n\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\row}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\r\n\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\r\n\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Link}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 : }{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}\r\n{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 https}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\r\n\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 ://}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 www}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 .}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 langchain}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 .}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 com}}}{\\field{\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 HYPERLINK \"https://www.langchain.com/\"}{\\*\\datafield 08d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b36000000680074007400700073003a002f002f007700770077002e006c0061006e00670063006800610069006e002e0063006f006d002f000000}}\r\n{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ul\\cf2 /}}}{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\r\n\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\r\n\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\r\n\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\ls1\\tx360\\tx1080\\fi-360\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li1080\\lin1080\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\listtext\\pard\\plain\\tx360\\fi-360\\aspalpha\r\n\\aspnum\\adjustright\\ltrpar\\li720\\lin720\\ri0\\rin0\\ql\\faauto\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 \\u9679 \\tab }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Item}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  1}{\r\n\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\ls1\\tx360\\tx1080\\fi-360\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li1080\\lin1080\\ri0\\rin0\r\n\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\listtext\\pard\\plain\\tx360\\fi-360\\aspalpha\\aspnum\\adjustright\\ltrpar\\li720\\lin720\\ri0\\rin0\\ql\\faauto\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 \\u9679 \\tab }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Item}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  2}{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\ls1\\tx360\\tx1080\\fi-360\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li1080\\lin1080\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\listtext\\pard\\plain\\tx360\\fi-360\\aspalpha\r\n\\aspnum\\adjustright\\ltrpar\\li720\\lin720\\ri0\\rin0\\ql\\faauto\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 \\u9679 \\tab }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Item}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  3}{\r\n\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\ls1\\tx360\\tx1080\\fi-360\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li1080\\lin1080\\ri0\\rin0\r\n\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\listtext\\pard\\plain\\tx360\\fi-360\\aspalpha\\aspnum\\adjustright\\ltrpar\\li720\\lin720\\ri0\\rin0\\ql\\faauto\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1 \\u9679 \\tab }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 We}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 also}{\r\n\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\r\n\\hich\\f2\\strike0\\ulnone\\cf1 love}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  }{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 cats}{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  \\u-10179 \\u-9167 }{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\r\n\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\r\n\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\alang1025\\afs22\\ltrch\\b0\\i0\\fs22\\lang1033\\langnp1033\\langfe1033\\langfenp1033\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1 Image}{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\r\n\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\r\n\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\field{\r\n\\*\\fldinst{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1  INCLUDEPICTURE \"Image_0\" \\\\* MERGEFORMAT }}{\\fldrslt{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\*\\shppict{\\pict{\r\n\\*\\picprop\\shplid1025{\\sp{\\sn fLayoutInCell}{\\sv 1}}{\\sp{\\sn fLockAspectRatio}{\\sv 0}}{\\sp{\\sn cropFromTop}{\\sv 0}}{\\sp{\\sn cropFromBottom}{\\sv 0}}{\\sp{\\sn cropFromLeft}{\\sv 0}}{\\sp{\\sn cropFromRight}{\\sv 0}}{\\sp{\\sn dxWrapDistLeft}{\\sv 114300}}{\\sp{\\sn dyWrapDistTop}\r\n{\\sv 114300}}{\\sp{\\sn dxWrapDistRight}{\\sv 114300}}{\\sp{\\sn dyWrapDistBottom}{\\sv 114300}}{\\sp{\\sn shapeType}{\\sv 75}}{\\sp{\\sn pibName}{\\sv Image_0}}{\\sp{\\sn pibFlags}{\\sv 10}}}\\pngblip\\picw25770\\pich5450\\picwgoal14610\\pichgoal3090\\picscalex64\\picscaley64\\piccropl0\\piccropr0\\piccropt0\\piccropb0\\bliptag1760923360\r\n{\\*\\blipuid 68f58ee02fc2fb2b6d6bdec9b2a80e25}89504e470d0a1a0a0000000d49484452000003ce000000ce0802000000609fcc920000000373424954080808dbe14fe00000200049444154785eedbd77dc6d4575ff1f2346c51223284101bb141544140b60175029224d9a5c05a4238808287001e97201e902c2a58920579aa88080d811e55a10d028220a8a3d319698fce2f7ad2b99acdfccde73e6ec729e533ee78ffb7aeeec356b663e7bcfcc9a35ab3ce42f7ff9cbdfe92704848010100242400808012120048440d708fc7dd70cc54f08080121200484801010024240080881bf2220515bdf811010024240080801212004848010e8050189dabdc02aa6424008080121200484801010024240a2b6be012120048480101002424008080121d00b0212b57b81554c858010100242400808012120048480446d7d034240080801212004848010100242a01704246af702ab980a012120048480101002424008080189dafa068480101002424008080121200484402f0848d4ee05563115024240080801212004848010100212b5f50d0801212004848010100242400808815e1090a8dd0bac622a0484801010024240080801212004246aeb1b100242400808012120048480101002bd202051bb1758c554080801212004848010100242400848d4d6372004848010100242400808012120047a4140a2762fb08aa9101002424008080121200484801090a8ad6f400808012120048480101002424008f4828044ed5e601553212004848010100242400808012120515bdf801010024240080801212004848010e8050189dabdc02aa6424008080121200484801010024240a2b6be012120048480101002424008080121d00b0212b57b81554c858010100242400808012120048480446d7d034240080801212004848010100242a01704246af702ab980a012120048480101002424008080189dafa068480101002424008080121200484402f0848d4ee05563115024240080801212004848010100212b5f50d0801212004848010100242400808815e1090a8dd0bac622a0484801010024240080801212004246aeb1b100242400808012120048480101002bd202051bb1758c554080801212004848010100242400848d4d6372004848010100242400808012120047a4140a2762fb08aa9101002424008080121200484801090a8ad6f40080881e947e0c73ffef175d75d37fde3d40885801010024260cc1078c85ffef29731eb92ba2304848010e8120156b937bce10dfff99fff79c30d373ce4210fe992b5780901212004848010c82220ad76161e3d14024260f211f8e94f7ffa99cf7c66c30d37949c3df92f532310024240084c18024b4c587fd55d212004660081ffef6fbfbbefbe1b55f42aabacf20ffff00f0f7de8431b8f7be1c28508d95b6db5551d07dafab77ffbb7c58b17f3c78a2baeb8dc72cbfdfddf4b0d518796ca858010100242600804b49d0c019648858010e81b018c3daebffefa57bef295fff88fffb8da6aabbdf0852f7cf4a31ffd9ce73ce7f0c30fffe31fffd8a0f5fffeefffbee8a28bd65f7ffd273ce10969f53ffce10fc71e7becf39ffffcc73ffef1af79cd6bd65d77dda73ce5292f7bd9cb4e3ffd742aa6f42a110242400808012130140212b587824bc4424008f488004a6574cfebadb71ecaece38f3ffe924b2ed96db7dd1082bffbddefce9f3f1fc9fba69b6e1ab6f96f7ce31b77dd75d7165b6c915a8fdc7ffffde8b00f3ae8a057bffad59ffad4a77ef9cb5fc2ff4d6f7ad3adb7debafbeebb6fb4d146a8ba876d4ef442400808012120043c02728bd4f7200484c0b820f0bef7bdefa8a38e3ae38c3376de7967938c5172ffe4273f41fcbdfdf6dbe9e5231ff94844e7673ffbd9e53dde679f7dce3aebac9ffffce78f7ad4a37cadfffaafff7aed6b5ffbcd6f7e13f17af5d5570f8f287fc52b5ef1a52f7d8992cd37dffcd24b2f4d65f4f2d64529048480101002338e80b4da33fe0168f842605c10f8fce73f8f9cfde637bf39c8d9f40c3177f9e597bfe69a6b4c50c686e4ad6f7d2bd27061a7d18e633db2e9a69b2eb9e49251959b6fbef9965b6ef9ed6f7ffbc637be11ad7978bac4124bacb3ce3af6df8f7dec635ff8c2170adb1299101002424008cc2102a866eebcf3ce39ec405dd312b5eb9051b9101002234500e745dabbfaeaabd125ffebbffeab6ffb494f7ad29e7bee69255877202517f6ecd39ffe346621db6cb34daa9946b23726c42739f2c8233dc3673ce319e1bf81acb04591090121200484c09c2070fef9e7e3d8f3b39ffd6c4e5acf342a513b038e1e090121302204d0463cf8e0833486c67ad1a245186a470dbffce52f0f2548db25dd82272aed65975d167fc794fe318f794c28c42ec513fcee77bf0bfffd8ffff88fb4ae4a84801010024260ac1060c1bff8e28b9ff5ac672db3cc3263d5313a23517bdcde88fa23046614012feffef9cf7f8e5078e6339f194abef6b5af95e4de4262beeaaaabf0b3c42624c5f41def78c7ca2baf4c396e977befbdb727c03a3cfcf7052f78415a57254321402c1722bd7040c25087a354c9bb1b8abf88858010481160de6141f7ed6f7ffbeb5ffffa9ffef4a7f10ca944af1e78e0812f7ef18bbffef5af5bf6f0073ff801f9132aef300d1cf8b3b37cf5ab5f6521e28f96cda580674a246a67c0d123212004468400061edb6fbfbd35464cebf077689e907fe1efc8bca4ae8b043041273d6fdebc4a028209de71c71d6c45bff8c52f4ce6363204c14f7ce213f63781ff5efffad75756576109028079c51557e075fad8c73ef6252f79c94a2bad84cd3d011c2fbcf04209dc25008a46083443007dc4ab5ef52ae6ddaaabaeca8c63de91a08090a9c8dccd18765e8b657cc71d77c438f0c94f7ef2da6bafbdd4524bf1c75bdef2961ffef087cddae20e938adb6db75d6575567b16732e335ffce217b310d1dcb6db6e7bd9659711f6aa92bee342d63bfd8480101002e380c0b7bef52d826affcbbffc4bda99cf7ef6b361edc36f3225884a5840b139619be18f81c49e0045b83584f48f9838545d117b04d8d477d86107c06463634f25dee23ffff33f8797c8dbf9fef7bf2fc4848010e81c01720590f30b299649b7ebaebb3ef7b9cf0df3ee694f7b1a31973a6f7158865ff9ca57f077a757ac037bedb517ff86bb47129671241896212a6a22532146572ef8a79e7a2afc49adc065e6873ffce133cf3c335815a20840cf3d6c73c3d2ffddb015443f9b08f02d5e77dd75b339f6d91c3517fd76e73826c3df6fbffdc26ec12de1c05edd7befbdd01f73cc3103293dc18d37de186cb8cf3df7dca1ea8a3842e05def7a17815ff0616517b447ec82c71d775c7051656bfcfdef7f2fdc848010e81001e293b2f41132d58cb5e0ccbc63fb0e17838f78c423bef7bdef75d8e2b0ac705b7ce2139fc85d22466556972502f7f435d75c332cf2279e78e2506cbffce52f53f784134e486b593606ac047ff39bdf84a760c2f9df9a4304a74b69c50e4b246a7708e6d4b222739e7d91587d4ded2035308700cb10a1ac79e9bbecb24ba59260c46861e9cbd26c1f21fa8f20ba65baf1fef7bf1f7aac003334e1d111471c4148ef70f388088812bda4a268ea10e0d002fe68d75282b09e40507241917250891010029508dc77df7d98c66db6d966e9228922d99650fe45fb8bed5c2587be0be918f155e924b275d416b15cb987b44e3efce10f278542796750dea3b7c61a30aac2fe85e50c3cd1f193a7cc3fc5403c00b2c71e7b94b7d58052a27603d066ab0a8763fb1c8f3efae8d91af96c8f9653fed39ffe745e3d5674049f9e5b3088b76d1f2116872556072cafa481c454b1e49c803d3797ad61cde50f4277df7df7dd733be4496f7d934d3601494c4589d2188d853dde1bc77b55d3a48f5afd1702738b802d95089d242888d66d64dcadb7de3a2c7498eacd4957efb9e71eebc31a6bac919ab25c79e595a187689d0b7b888f23b2fb061b6c901e307efce31f078678c0431978e288191e3dfff9cf2fd92c0afb9392c92dd2efb0fa3b4680347b1c1629e5cc77c00107c48ff5ffe9458078497807b23691c365dd75d7451e9aabb1620a72e8a187d23a8607175c70810f7a5dd7252e13f131273e371e967534a11cd340d65fe43f028fa0e720e408ad605efcee77bf7b605d115422c086675981c86c7fca29a75c7bedb59e0c39c0ee4cacb030746365432a140242c02370d75d77f15f4c473efef18f2f58b0c03f62fd44db1d4ae66ade7de73bdfb13e101765b7dd7643c0f59d44e11dd28da1d566252979bfe438c3c99283449a3fc1476efdf77fff774fe099a731af4ada2da719bc0f95f312e5942180eb00d7bb0c0ad78a934f3e79ca46a7e10c4400d5234b1831f8b0d44743ec750003eb764580e908823eeb204b24612b50d5947026910142b6df57f2b52046fec3fffd652f7b1986e096a79d8dcacc1bf275a7ef292a19530eb10b7202e167aaa0a1468a462dd0a71925fc7989af6b28ce221602538980a942997acc3b64659b7a91249a1f381c7c7426b27745f47ede15864ccdb7d8e0a95f19b0f78838b014874e62b05a92189851134e1b01dd6ed22286284d76da69272b4465e303bf7a8537862ba998de6074b5555245b74a840008107bc13e1a8cbad24b1941343b08100ec9be042246a12118f1c06df5c46e0f157b61d318fc61b7405ca7c6df2d3926c38a89c77a61bb5340c6c98acbabb7bffded1b6eb8218643042e5861851500133438780c35c07df6d9c730e47ae457bffa55543784538486db83a1388b58084c190258511f72c82148842c77af78c52b565b6d35e284fcd33ffd13b38358a54319362074dabcc3282e381d06b8bc68fbca57beb2f10ad9067f4cb4319bb64e1e78e081112bba845a272cbf3ffad18f06b6c5e902011aa0ea28e189b2fffefbef8f08bcd6bfefa80fb2d5ae7b3b335dce6912a3583e778273a51fe84c433393837fef7bdf6b6bdfc61b6f3cd4badf12ad830e3a887631c2c320a49c15e1b4a98562bbbc4a4489d983d7702c5ebcb8312b5f91151fbb7092622268e28809aa982a7257e0cd073b69a81993540716363cfe38fbecb387658bdd086104186f5ad16f7258a9a5042a11023382008a5b1f8ccf4f3afec6317d5881986b22dc91efbcf3ce14c0cf7ffef3813f9c5382d194fcfce73f670520ac6ada1cfb4b70e478d8c31e56b2369a9b7549582adf1c0d99bb2480bce8452f1a16e4b4e7f91289da797c66f129075f3277f0fd7152e4b43d8b1068ccff7f0458865073da1add20e2693338897e4a8b84618a245d96c88cb84f57718ee13211b3bc7cbb5072451be2617962bfdcd3874ea2fe21be13e4c43c4da3dd140d163ae039f73d0dd71751f7ecbf953b771ee1ccd34d37ddd4d8a27b63dfcd50ea9110986e0450dc56ce382b5cb8706187c30ffee530bfe1861b3ae4dc152b6fd4b1d1461b0d948021586badb5965d765916f3f23eb0c29b131a3860af82974e79dd669412b59be136b5b5903c48ea66931c7fa6a91da7063624025cd20531b1dc9663c846fe8ffc9c73cee1237cce739e135d20b2b0aeb7de7a2f7de94beb96600e8a28a44903966f1a1370f2f73eee718fc30b1e1133226621c66e2aec7fe92d679e79fa1415fb72cb2d670c393c103e36fc37b4c20d126475e34a79765e82f5089b16915bb0ce0fbdb23f3023196a27cbf78d98bec15d9533469e584f85c0742340440ee61dded85cdf45f38eff227a76357c16bdb0ec60a692515874d562033e871d7658008180a10339d84185ac0b032921207a15f1fe88036b8a734b4b9cc61c2c61352c8d44ed61119b727a3c82ed43c715723ca7e294bf80311e5eb87cc488b032a163577db77c8d9812a68a5e8e82b44e00ecbab64861c0073cd0f00ec386b0a0638b1ce9b6f9f2913803010149ea9a2b29e732d758714d49b86e8b768225099b04d1aca23883d829626b5ec2b60f1ae469f216b125b3f1fb5d1fc0ed0600a000c7fe6dbc3e98b335fcf1581a78f9d0c730c553088c1502ac092c084cfce0c067b30fc312e623d32d9a77cd0ee4a6bf803359ba7a5dc01b634b9c2bd41f36764491123e169c8a34c325c43ef011ad10a20ad57ee375aca4c54023517b28b8a69c18734cfbca9ff9cc6796d8484d391c1a5e820009b7ec0b41dfdc9390f4c31ffe70a9a596624d64ef49daffcb1d77dc4107ea8c585834d15273991889ce299ff9f3e7db40ecdfc8dd133e4b2fbd7420206e5dcaa1b004eb17f379df77df7d2b15c38b162dc224d177065b9d42e61d9201e9faebafbfce3aeb00207a77df1ffb1b4d3c4fc30fad18a77174d2c3ea8438b0115d119eeca984fdea7008622504260e01cce498474c2baed1888094ce3b2263f87947022f5c2777df7d778b1f523e5e6c244ca58d2a9735a7bce2c828393f6cb9e5968600c1a306aee1748c851aeb3bf40285e232642cc268705896c9656b6db1e255fa93743b7089dadde239c1dc9027c296af547913fc22fbec3a4bd5b39ef52c5ba1d8219a2957321d446e2353234a176c36b06cc62d927ffd8fa8abb4fed18f7eb49289c5722e8968813223ec6af87a46dc8c8f1120f8361e26ea61bba9249a4786097e81d1167bd14517550eb0a742cb699c6ef32525983c96f78a502416cf8478edc3ca0ae5ad8852084c04026d623973f42d1146030e08944c678ceb46bcb694bf8870fb879c5da9954859b18630a8ca64ec29715a82d9892d71dc612a317b8a8f4a7a41c0a6225f1e97c58567c45efa21a6e38dc02db7dc1224b04efc05c3708980e1cd3632725e9d946691524a2e13d9e4107f6902f5791ac110336e6b9d6cf06d96e01031136d0d1ec675d236fa7b0e187ebcf8250fb58fb6fc64d8d8c2f4cfc05ef98860e7e5ad9b3724a1be8871545e4b9442602a11609fdd61871d2aa7d5c0c277bef39de59890e91986844cc51fa3bcd6282959b4cd4504ebb272f103ad4a1bbf6ad6d8601fdfb7b42dadf6283fa7f16debd4534fb5b98db6490101c6f73d8d41cf90173171b3af05b3e9369268341ad2a10fdc608c20158e61c5028d844af699c2951a5369be76186ebffdf6e42d43dea522de9f071f7cb0b5820d49cbdcc5dec5079e5c59d649db98834763276fe528df36bb0e31c2b07127a6b85d1d84fe100780f2ca1f9944cb3b69463b6c691d7a7a95b72e4a21308608b0e6fce0073fb0c915ccf36ceae1c9800f5fe5bc635daa5b49d231e2fa82329bdba4112f29694fea4a50b298cf3d86d7e5e3424180ad208b557995a803547ccd6b5e13163a3435753d6c5f2e51bb3d8613cf81c8d916459b6feeb8e38e9bf8f168003d23803975085281beb693d658f530ff8dc4cdcaffa200ae14a63ff7b9cf417ffcf1c797f707091bdf7f6b05950f62bad95563ceb8e79e7bb20194b34a29fd99240ca4ce3ad9670f366204d394e7084a90b9b107f5c89335b67dbb965983dc1c915924afb2f14ed9be57e22004c6078148d4c645b27ddf383fb356e3fd12dd0432e92a57d1f62d0ecb019f1f72f4b2e07ce0031f88eae67bc821845a1ff9c84706b6089f3a56e8c5c35ad7ab938c44ed81af69ca099872b843d9d746b8b19e7cdda61cc4d91b9e2597b1cf0693924e00603544ce1bf8ab5b34b97944441e36e312dfffe5975fbec71e7ba0aa7fed6b5f8bf5dec73ffe7184ecf6f21f03c19ed2cbacfc9d061634e83068899ca2d0b57782eab04c7efffbdf73eaf0dd2e31c8c9b7827928f7bcd8a890afc753f22a597c4e3ef9e47c753d1502538f00cb05118afcbc236048cb51df7efbed5c3cb2ad47277c1637c47a16bdf6ab5ccb1eb2da9886e5b4d34e8b58a18cc71f94e0ad954dd0732c5dc99f30305e136e3938f1030257f7292b8b5865b0e386c45b48693a2991a8dd098c13cc24e471e56b3be69863267824eafa0811403464f1b215ea79cf7b5e7f2b54e19830ff20a2c5baebaedb66f3685337ed27dc82437dd841d1a3a7949420749a6a2750b6492c5fd944612149d7fc7e0faa852e4a75fc59613802717b40129f88e6eebbefa6ad934e3aa9aeaeca85c08c2040580c3feff89b5ce26dc68e1a1b4364fc22d2004a2cd7d8ce61b0d7867ffbba788d9b9c4d1896941bc92c39f3d7ed2ce80491b3dffef6b7e7176dcef68f78c42302b0b7dd765bd490c50a34023a93e79676b2bce4efa3b7abffce1402c4ec3ce080036cc8dc3185fc49330502836582214ff0e38fbab133a99087a061f267c8eaaa4f5939c16ac275272e6e2162eb5c0d93ac3aec5564aef109d587ed4c9bba695b70db7ffffdfd42ffe637bf191b9594b2b2c42275543eeab5d0ec704213c4f90e91bff9ecf9f8990276b150d20d42fba19e7ff5ab5f8d6e89c03251952f7de94b94442ea1256c452304a60c8168de2dbffcf221d65383ad074714527de16dc2144be717475c645042fa966038ece6c8e250c29641116904f3f14b2fbd148939aac2537a8e0177dd9acc55a4a521ab233086389e21e404e6683aa28688e41d4ab855c8732b19571dcd12750f543e0b08104122e441e53a69ae76f7b9851aa76c129a30b159985ef8c217621ac1bfbe4b88921ffbd8c7101af05f79e08107883acc5d3fbe627bedb55788b73fb7439893d6d13a700d62ca18f26fa12349b30c8eac6358eca1e440961d598b250d2158e338888104162928ad91bceb9672f6b3283f33091aeb88691a9117bb0eac65ec88686971f89b3f4c1ab612fe4efbc936869a99ed2dcd124f37d8fc7c15dc86e806d6f9a79f7e3ad7d068daeebdf75ee400ba479c16cc49cdba3d6d8512ec44715aa215c26f8383a7613f86a705f22f0c3b53d9840a85c07420101284d97098774c525657560f8240937186d9b7cc32cb30f5def08637e049e203ff4708e0aacefd1e739f6599ccacfc3c0101b6afbcf24a4a52113c45f2e69b6fc6849a63c0a31ffd68227ce3384866314f46c7308a233a307fb01ca12ce7b6134bbcf7bce73df43665184a7019ffe4273f89c11e262edca4b128854758957ce31bdf607d63a421adac6705310b3e3e9103dd7b384eb05f63854275d6318e1f9e0fcb1d0d59093a11128a653adcf651b9025c9453860077ee214d2b4aca0e43494c10501ffce007a329c4840cd90159e9e6cd9b5737c75823eabcdc260881365d0d57224074d45147b561d5a62ed19ac98a42d8ac364ce6b62ea7b8e833434f5fd925b6077c9783f54eddc739b01cd13fb57a4740f76a7898b00b72a4ace34637bef9cd6f56f693032a13a4ae622847654ea3951c542804660401c4e297bef4a57eb260bbbc60c1823a791acb0ab43f95e0a0a62574c9c07907415dc8d4c0f6924b2e494ffb218835da62422a558ac23047ed92c9ce01e7921ea2feab1c230a2f3a561830c412038309dab4881bc7833040a27a57b6d555a16cb5bb4272f2f8a0a60a9ffbdbdef636b6f0c91b43bb1edf7aebadcc347e68f7d1d505af14960fa220934e85733c10615a831c499a0f4a381f23e804dc56596595597624e57816243394077305058a1fdec85081e7da7d38ddd7f6de398c059d71a5000ac2587494ec520369509ba5a236bb6354d16ff66cf0cf7ffef323026e78d0c7a788f8285a99ce907a3aed46ca4d2542608a1120c66834472c0e6928c4b12f4409b34216de4a5996abb3cc74f38f683403e9f7bfff7d5bdb1155b9faf6fa60ee815142e1b30837ee1251b8b0f6a22ca7906c5c6147409157e9d48822397315e67b58e7c581a21d32b4f599fe87472c2f968f1d5d0cfd31fb4f0af93b9c49d03b702558c2ad318d44edc6d04d764536f2a0d2e6ab6d1f6460e2e0e068c13d17632763b6751e738830cfede29bff324b99935e1a60ae6eb0c10681b24ebb30718034e83018624612a0a874f16ec076a82af4816b44d2f34eaec446cfd94afd1e5399ff0c5f7bdbde3c65b3bfd13757c68d39e288232a196204c2266ad629ec709185559841e1c5314752cbec4aced8fccce0217fa82f5cc4538f00f1b32b6707068a871f7e38e6674c3dcc8e23376b4eddd1a2c7542a3c8a3ff5a94fcd2f98f8bdd025feb5e979fef9e7871eb2de9a128ae508a311267b7841f0f486d7a79c724afaeebc8eaf72d4a110f395b43a4d90899de04ef9fefb8a1c2af043339f132ee258be10b2b908a5219629ce127dcbd97446a276fa2a67a28458b9e183c6696906773bb360e3787ddf7df7d92b47b71dcd7cfc36b8264b3f8890e504fac26bac94c97494dc71c71d01348c6e2b75b1bd8e947d887b09de48afadf4cadc4701024cdca130ee8a5a6486e21e605063a488b126b72bec7f6cd2585eda2e82233f0968ec4739bb29f4a4b80f85e18f4a3d345b17269ed114e0bf58e147c143221d7cbae5d37933221ff86ff97ed9eb2b1073213087083049d3794778fbb03759df227b6ec4c474bd35578d81f3cecbc7e9c031c9b3889fc1c804bbeaa88708dca8b1d3ba211d1ef4289253d1829281dd338294392504548133f271e5d3ba421aa5224e23d89aa368403583ab09d7a123b39b95a85df76aa6bcdc7b1fb3d34ff968ab86670a3cc497b0e878cb632633675f7c9cabaafec5af8cc4639e657101f4c84b12566182525722d65f21d791ec0a859789fd75a331673615cc9002805c13130d37e516124f6eb2c9266c849e60d1a24554e7c6d9efbbec82664689e153caadb284ea383f451bea19679c9112475b3efe4fe9969fd6528910100229022ca151d228e6200ec7e9b6c22c8ba6273e1e29c3f6251cda69088bcaa0ee3523bdd03aa26ab40a8546b1fa08648c2b1d45cbeeb14db3b235ce698dcc4d97f8a56780961dcb5757b0bfe8d39d89ffe21f8025960d95d09b66c9341323ffdf4132d3cc0b1bbdb56904997808250104bc3a50195686d480d2e2011b31a66975ae21b30029e86db1c51661a4c494009f510e1c411f8ff510186b944d77d216768777de79a7b1e28e85cf320d0848dc0fee91a1d97df7dd39cc783b4ed6772200f088cbdc10958fff12d6ca5ec4339ef18cc27e1274165b704f8c4bbe37100a8fb835f6641c0f66790a14c22b32215089009b115e43fe11d6115c3ba7730a7be88843a1995665bb7585ac1bb6396ebae9a66654cd22637139ad0a1d63738cacc903371ff0042548ea5859d76e4939585d78e1854426a973181dc884fed07f7edd766c60bb12b507423485047666b581319d2a05ca291cb61b1217e25c8d117725585da33020365920e176deeb1a3d1aac3b782e87927251665a2135ab3e1b1d260a5c7a8e78a45ec41c71d32d9b23824d5057f3355e7bedb5e63f107d6f1c60d863f05df697b3468319e215575cc1df78f6f8bd19bf5e0ab92a2d8f471945f6653333f7a3748cfefbe7295764a95890d652891010022902cc3b0cc67c3926ce9513ca6c270225c26e49909fb4c57c09a2b62d0521762a8b8fbfc842af5ce734425d2f6aa3fcee56a245e2e79cdf327f427ef83d3d555ced9e801d5fb618457cf4a31f0dfdc362a9dbc930be23773dc36f1a1b6b326985a50abd026e674682e8e6c5c76844445342420a85918bd8440cbfdb4ee25fcb45a1adce9c4338c811cfb5db26a6921b56e66c66b6cb72b983eef2dc0000200049444154841d4865d40ea6270170f82071064a7140ff64d7ca7ef363c3333d19e7c0c2730855a2d0d7ef78c73b2ac5745eb13f94d2252e1666700d49df854a844003047050f6b588f551b7a7d8f93910130ea852226fd0075f054d3651fc504887ab42cc54fc4516ce1b754d441aabba81d4551f588ee842f68f8d37de7820e5b81148d41eb737d27b7f086989b46dcde038955a89f5de8331688075e4c8238ff41dc1d939fc179926733147a823a40d2366a59b4d003d7480806b7cd089f281cd9f3fbf309cd3187c0b73d305f6a4b7bce52da6014220befaeaabeb6e51e81f464a957236f231b9d62040525f638d35c2482827dc35ff7de2139f58383c8c32a3487febafbf7e655dce0651f2f63a15576575150a0121101040611c258dc235b9528086f2baebaef3d0adbdf6da9594ede13de490433c13bf3912c1237391cb1ac28d71a84bc485f69d091c306a274924827e14fbbfc326fa63250392feb01d47ceecc10b172e0c3d63372d547a8de360baeb13b0f80b32eee2eb6041c8e6963fb4bcd65a6b45e14ebbebd42471f2e6daa84030ce99a4de8fbcaf7c45f8e6df78e38db44cea0a9c04327276a67784a1bcfefaeb21201a803fdb1036c7724fe2e658a86f26dc2726efa12dae7da29c1ae111dd0ef73f56582794677aae47424008800002b4f711a224352133a070438cb4da7594dd02cb62e53747969abacd917649bc155ac7aecc822075d59f1b6eb8016fc8edb6dbae2b86a3e423517b9468cf7d5b7843fa6b620ed0853bf1dc77bdcf1ea0a8f3aa858c960e4a136eac3b0430e949afd0e770bbe78d1d8ed7aa7a0ba5ee1b9b7c8ed8675f74d1458c03ff1ef60fb2ff341b130e919c12a94b042bff1d86088c6c8a85133c5269b3a1d67dd898e3fbdebeee75afcb6cbdcdc6a55a42604610c0f8988371182c4b41dda93b0ab7c792fb9297bc6404287118f03203aaf4ba2505adb317b537dc70c36e570692b1934cbe73a3941160481312b54783f3b8b4e26520dcb0d826c7a56773da0f622f04c714d6110497baee7095f6bbdffdce9e228b6cb5d55675943355ce928a7016864c940c0c12660a81f2c1e2bc6fae9084ed03a8f456043512e8b16fe579b2059e73ce3946137db1f7dc738f95632a66b2789e15343ec200c4dcfc568adaf42abac5d669338fad9e0a810c02912f328aea4af19435c1ab786048dcb0d118e9713fe63dddfd3a1f8d8b13be5da65979c6a43b0348dd2393f8b90cac5c97ea6a8d4fb944edf17917bdf7840dd51b5932676630f64825ca7ebd7bdef39e57e90d6615b1150b1c906f482652c970060bfd6d26897ca3f055330848e590c9b9386fde3c1e114e049db4e5898828a121931982787009a864853715561f3c4213467a734f73efbdf7da7fbd4d4825132b641b8bb6fc3a234b76d328fc08fdcc70d623212004ea1060478e0cb5d9532a75c61c71bde1220c39e25652d6b5d5b8dc1b6a2fb5d4522bafbc721d2b12278747a4bf6527ada36c50ce0984c3c67bdef39e0675c7a18a44ed71780b23ea03fe0a7e62d71da047d49bb169265aef30bfaed42bd05f6efa2c5d88f51d95b63f61e3e856a2411c9b7177dc112e16bde0186d0c1d373699ec88ca6761aa8996459c964aa514e23521b1191f968e99ad942fedb4d34e3318885b12b1c2a2d11e3df8e08325dfe4b7bffded5ffffad70154eea62df1720a73641a844f306e524686269e2980d49ed6528910100229024c9948d426fc484a46c955575de5dd0df1c1080e1248e1ccbb819760956c0716b21c7953f28ca13613df8bdaf87cfb6d944be3f62bc3e4264f006789da033fb6e92140a5edf7ddd7bffef5d333b616236191f2b668990b321cc208636c4da17724247968f6831ffc20020a41eef29ac816dd1cf7aa184278db41cc0c7a5afdc71d889afeb1636dbdf5d67c1e84be39fae8a3ebc46836a4206ad770fa6b31c92c2c9c367fa79ab010628840bc251f64aad2ae3c6df2422db745e81853c028e90f3382b31612806c87322f4e8f84404000f7717feff4f4a73ffdc94f7e728a0f531851db979379cdf41a4c49d4ccfccd8937cd2599b21ab624baefe2685db77071c3e6efbb08221cdac2c61a753801044b8efdc3f67052e8256a4fca9beaa09fded88be094999ba00e1a9b1c165192bc57bdea55757d27225b7844684f22acd97f598fc85b8b7c33cb018651f07b8be1c58b17ffec673fab4372d6ca09bd870ccaadc8f1c71f4f40f7ccf0f98a48350f01fb6e868cef2dc8d0a9262c385ab1fb46f61e294ff6bf28a276dd868ae01e25d1d87cf3cd8de1873ef421fb63851556a8d4d6a7edaa4408cc38025144ed28e16b0087fd8508b31e2bacb64ce4e5f2d0123f2fbffcf27d1831b38687c4d27420e3c5e40fe12c20ac03d66196176ef03851acb8e28a7df470523e2189da93f2a6daf6938dd9dfe9bff8c52f9ee5efdea3e9d73b920270feaec41afd818fbd803e2f0048f4061cd1c8dd35e351cfa2f070d1f65089ea2c1422ec12ea87fbdf638e3966cf3df7349747fe0d3f04627eec46a4462241a3e97e32a236e9d3cf3df75c830e977c76590f2333dd6b8f7ca0ae4ab4d9c8239aba8b9dc8310bc9c0e2763335828326611febf45e95adab5008cc26024cd2c81799f5b372ee7021166e53c18afb43bb91864338e272e8ede388eb9dbb965966192cb02b5f166b88f796263357b816bbfbeebb6fbae926fae62f812b994c77a144ede97ebfff373a92653cf0c003e1ffe85f2bef8867058eff1d27ab55a12d1aae66de113b046f81032214fcdefef6b74f6268fd0edf381f95e7c619a6c47aa1c30e8c212b425ff3a998f13426da5cf5626841f01ffe0d3f0af9617f8977e311471cc12838c53de5294fa91bce85175e48ca527b8a4a3b9ac8ecd6dedd39321b4b79a2a80eb6dd3cc5c9b27243e5557253e1ab87a8fc871f7eb8dd60202b8c26d66f3a0a950881c94200f134d26ad7e98c6fbffd763fb430e5d1657cea539fe211eaa19d76daa9f3e133e5fd7d17f7bd75320377713e836c5804e040a65b3a86e976793aadce07320e0c256a8fc35b18451f6c4e8696565f7df551b43af66d44b7e79599b16d105e67c05d181638560eb048334b2fbdf4befbee3bf6c3edb783804092f6d0069688ed5d61faed71cfdcd15573d5eb03601536889c8d385e490ca4c12112820d36d82025f301498827f8d39ffe34a509255144edba5b6ce8a38313a6f994901c1417059e725a38e38c33ea36e34c07f44808cc200208d05c4f8581b372d66561f49754d0bfe8452fe2388d9919ca1dab7ec20927348ecd9f419e767d202944ed4aa53b1c98f561716067647f34b61867b23eb0751e74d0417575331d98a64712b5a7e96de6c612a5a4f2094772d5a6fd19cafedffef6b7364a56844c967596c2e0b362be2c083d586fdbbdd8a9a79e1a42314c3b66b5e34317eb033c9136d2c7b5a8ad36bd0ff0808c220c148e155ffbba9d897093d899181fbc052a8d3dbc7f2afb25bb5d5dbb91e20ab2ba0d95feb0c77b3e8c8e6b6b7c3dad90a43cd1b5465da32a170242205269670282adb9e69a1eae0b2eb860e79d7746056eabebfefbefdf6d04ebd016366f21191685193d14d7b9a193041b41c5c0b283b3358673fc71dc71c705e17b76df3b4bad7eb38080cf41c5b993c9300ba31e3846f28984c94f2c61d6854c9533cf3c3310236107cb6cf351cb549c9d4751dc5354aab333f668a49cc41a4796c5a4bb0eb75d77dd357c843beeb863251956e05ecb85815325198550aeb4d24a7effc3b2bc8e981155a6b2c35e055bedba5a2a170242204280a9e46374300109a3994109038c4a21f59def7c677ecfcaf01cf88844b6a1517c4270c9c854f131523071c15cdbea623597a9353b8f96a87c7f7d14724d1912f2b5e18fe62cdca7a068e155c12df5c16fd3c4f4d56562df79e79d615c2f78c10b74cf6b6890830628c0e7318f79cc82050bea5489468c2e8183fe81071e08bd05d8e6ca0f399bf4dad3f7cd341b51a4d7c4866466539cb0348146261d521dc254cca471e5e2053b0deae20d69961b291fee67f6de7beff7bdef7d3c626d643f4e69ac044ad4d8b82ef15fac56b889269e771d316b2fcb386a6cef2c45fa65c2aab013d7d552797b046c9b834f7e816adf50cac19a1e7dbb694fa212c480c9f5eca7e7ccbb8b2fbe98417137c59eb2e5965b66864cbc3c7c3982f33194e42767ded5050bcab02a7f840938666c9cc6f12a41cd94971948a943f7586ab8f2351749f656f4d9db6ebb6d798b534cf93fa26adf2304fa5e833390d0a8cea5a0efa14d047f241e7ff94b76d3b3cf3e7b0c57cf390113b730327d107b24985fe7bbc152828b249e64c83a4f7dea53fbf0fbce77609c9f72a2f34e75e836307898d92fcd144e0dde173b710634bed85ffdea571c98336eb8348d520ae9192178a04472ecb1c76267bfdd76dbb1a70eec2db2179a6f6e87898ac0dd0e86559a0203416b4680f511d6ae4437baebaebbd005f03631fce3ec4408ff5e31274632416988f286a912df18af98fb19bc02109e5ab6cbc7c3d6f3c94f7e12d1ad81c51d621fc74202cf63a9cc52c3b1903b193c1338d3d6458e8a90675e20d7222d98c146ddd4a09facf3cc20a2d7cf9f3fbfce8abad96b0db5904d9944987f145a5ab34f21eafcf0873f7ce31bdf48acde3a778e96bdf2d5d9e9680e7889af55c2f68f7ffc2355700e79d2939e046823e86149afc682864faaef1f1f77fec4d61e08cbd4d0f7402697bf3f0d83364696933b16f57c9c11c03069c925970c331ab13b7fed38ce6351df84c05c2140b4a8ba4d13e522ba4c04d63e6616b7767bedb557dd8e8ca04f304a6ea71bc0821880881c2e0089343f2c134e1d95f64bf49673e9eebbef4e589e813c59a04cfe431024dd2f62f4c2850b3937e2bb8cd30e1e4d689a89a88391316ebe8603491007b2158110c823300aad36b397234ec88ac44ecc9db2c570408f683fbe69c245e15be643c6e0dc438621e2cb72e6e3048c1e911f07262e312fbbecb210798d29f1bbdffd4ee7a7baf591726e93496718087093aab3fdca30d123213010014c6b08d96ef90e21d6dc1c88980884408400f1fb9102cd5d9b4b8937bde94d1c59cd7a0743021487468f4feae9a79fce75445700a22ac61c88c49f304493cd36bdeaaaab62de80721d9f96e03e8ea04f52928ca151e88f091f48c05c6b1336c7879146d4867961cf11ee0f3ef860ec2560687d23c6335aed0085f1a1cf98f3e52dd69043b0c4286c173202f2d0791f3db3bcae2885c0ff219097c43b798ac36c688f0983e45dc9964d7aadb5d6f2ef86f95c4949211326c46ee46eab8ff37d5dd313570eb051b05b22f84cdc28d4e18940808f0da33d3f8bb9839e889eab9342601c10c056c42cd950aca254f25b1b8a61a4616fe78601db2f7ff9cb4eba0d9fa73ded69cc5c54d70456c254c3b3fdf18f7fec8d28e843665e134b1e238d5d76d905c1bd4e0f5daed566d416e50679f7b0c30e43c546df5867d04f83559a7b15bfe10c203e17cc4041104779224667b8e991102844e0afa1527bfd314fb02bb26f3aef639bce018ed799be85d465d80b9a4d648678961fb130b122fb65a5eeb433cb2869ec9d20c04cc479d47f6c78a677c2594c84c0d423c0ca6cb229f6c7f7df7f7fe578a324acdc4f227756529617c2c13c71c93352274323d7fa79cd9d739d258979d946826c648e5c2e6a93b00956a8a2b120af1cd1a5975eea8dd62046a3574949612a6644fdb4ffe2b40093e8bc51c753e542602002bdc7d5c6e4c3dc5149d8cb8557e5676d8551e067dcd4b824cad0073f3f4edb1917a20c871979c447804e220c96252fe34d35239868983d21c04cc45acc33c7aba6a7b6c456084c19029c4b2d5414f18c91b97da497305222a9fbfd0e0556a5683b1432d86d5a6437f66bb29b11223dad8ec58857d97ce52b5fc1d025250b25d87cd255c25662568e1fed7efbed9721ae7bc4eab1c71e7bf014fbe9bad0998816781f790ea45c4594afe339b01c0b190209d0624b1fd0810d89607610e83dd81f6b075760c876847da9f3f635b87d0a504af011ce7fe88f7ad4a3ac62141776765e5ee148593d515a04626e09f32fa290adc88440250221d18f3d6d902bb192ad0a85c0d423b078f1e230468b4d81181d4546c28e02ed12e14102257aee3a3b8d42c47cea6f0c33b6df7efbb5d75e3bba0b65d7c0c38af81281e7273ef109c292a4bb0964e88321e348908fa533b07b18919a1e9aa4bcc460213f62da1c4cdef18e779c78e289c17d0bed123ae92bafbcb292d81ac5021e4d392a7cce36b89460f2ced9802c2dc40391f26ee07b11c1b008f4abd5e63699cf9d3ecd9b376f851556c8740e59304a9e14d96da7757185b442a2dea44f551210303797f05f16d0cc0224dc84404b0422519bfd8f75a0254f551702538f00d32432d2200600cae368e0acded1c511f7c65e99d200289f7581eaf4243253a19076f13bf4ccd16ad74d6dd464fc0896d2e6c219893928a751baefb4d34ee8c82b47870149943c8bbe0509a1b20a7148f1f524aa09d9d149bb88de1def4f34d928efdbf4b9b22d150a817e456d2ccf388c8232a7e4fce7cb4a41204fff3e06c6c90e4758e2cbea45661088446d62a3e6df4586951e0981810844fb31f3942d73602d11088119478065398d5e9c467446bac5efd063856171cb25bdb05d2e48a3767b7d654805d867fb2648de144299454da35ff725a8d509419def1e87070e03762490fa298f959eb644a05f51dbe46cb4ce6436ca77349a152559d6ec268b50809a24796c71aff104046fcad3eba910688340246a334f256ab7c153757b4200690c935c54c2a84ef1f06ba918a693641869d355c465ae7f3d87cd36dbcca282f8426653a43d61876db90992d2cf47cb457b952660a6dd682bc16aa565bb79b8689110c0d1d889385e592b0d7a58e92512ce24bdf6bcb2872a9c65047a14b5992776094512b2bcd5352f2012b531141b58c58cd5300bcbe70b9de5b76b638fd665328d091321d01f023851f8e31c1ab8f6424c7fbd15e71944007743ec0750e5e25b4f1a635cf0f1267ad9cb5e76c8218760b3d10c105c9288a9ba68d1a266d5ad161cc8a8c2f687a44b603bd2a9a4122177c591690466c76d1aa52ed1bbc9e048bb182b6389c1769ceeaa6ce8debd9e5a9586da2d7be2ab3376e29cf812ecd4eb2c51b1b78e8cda2b4f3ee1d85f67fad261ffc54a0804047a748b64e9b14c1604e3cb23ce4e8c9994a719683d02317140f9977c192defcef27d9b82a7912a42a2f614bcd3711e021b24b6a43ea816aa29724a8f739fd5b7194100496bdf7df7c5852e1d2f5138f8e1be8fef1d36bba99634ade24b48d442d89068b1cd57a97c8ab1259e79f43315b28d3eb2a246184544ae64355421523e7276a65dcc9abde10a868828d1866a625862c47d92537216025beaa2773ff7dc734312c7941b22872f8c24ef945e2542606408f4286a333170efe5ec8825597e3c44898f22fd113a3e5f85a7471f7d340be240e603f94c3d8144eda97fc5e336c0c8f49353b144ed717b47b3d91fb4c516d52e0c1f953649078993f3a73ffd89422c4930082617f731c71c83cc5daec73109b82e20dd5068d3685dbba8a5380c786efbecb34faa811eaab9409c691711fcd8638ff56c89c137821c8a6baeb9260a3b429d307072fa6402ad700c4090f03d2c5f73606e4a6e8e375d81d9ec15a8d6b422d0a3a80d64038d400cd6cf7dee73fe8a99d5aac49e9875417276c977897bb5279356bb0434d1b441209a989117571bceaa2b041a23f0fef7bfdfe46c34a37befbd37c9cf2de13972243f627d5c7ef9e5643ee773e570b8e38e3ba2433defbcf330ae18d822d54dd4eedb477fc182053e4a09b6dd44951ed8bdf6042043dcdec00715f8bbdef5aef66c4b3860ad5e1778c457f759dfad9cf0d819fe766940f81152e49095f3dbdffe3626a9f8993ceb59cfe2527d9b6db6a9b354c9f0d42321508b80ad3273fb6f14dc3e9f58756ebb3a89ad475b05b79c93380af5795210e0d8fcfad7bfdeaf38175c70c1a4745efd9c5604889e61a9183093c0e6b87298a836b155f042248adb934e3ac96747afacc8152b1f3c39dafacb2f88d29d5b5c3fadc81339b06395bd1daa90263872786b168cda915087620271a48c2fcf1659d2102f2eb26621473585695d7a6e1872883af4d04309ad5d291ba1ecfbf8c73f9e56578910688640bf5aedca8f382a64638ec2fcadb3ce3a2515474c83890bfe28bd36baeaaaab6200d76d137c1676311ad84aabdd2dc2e2962210a52395563b854825234680f4ddc4895b638d3548f55027607153fab8c73d0ecd31219cf991550ddb12f4df679d75164952b027218b4ad46dae64a1bffaeaabf9e6b13929bcc82d1c3bc19eefb9e79edffef6b7c4bcc35d3204df40f3bafffefb0f65df52d8a291e11b4a8bc0850928ae99dffdee77ad9cede9ddef7e373a661fae6428ce3d117fef7bdfa39f9e39fdac34c209858c02b19bff6eb9e596d8c793088fa4f4d75f7f3d992649e883ab098eb380cc3beda9cf623b5b083493d03bac853375641dc53cef907f27ac2a13e476fea16039d3b99682930c49b07c574906d609266222042a11409984becd7f7268e32a29552804468300cbe01bdef006be4902c015b64895934f3ed90be5fcbdc9269b10a5047de769a79d86f08d72247ce7a8480b391792b117bcea55af4a7799adb7de1a21b8904933328c67d27631abe0ccdc8c21b57ad56a232efb0e2325d7f5d32b9eb8efbdf5d65b23e537f237f71e811b26e975ac542e04ca11987bad366652de509bc3e5139ef084749ecf6d0979045ef7bad745eae17c97780795a76aabc5d3b43aaed69dfb64d0d050dd4e7ba51221302c029156dbb2340fcb44f442a02b0410a7301ac1f261f9e5972fe489c9048a4f4ca1f6da6b2f4b10811076c5df7e29871d76d861fefcf969799b12f6029c026dee60d682f9383ff64aacc989058e22f6a0830eeae98a9223844535e12297467ff5ab5fe12dca4e8dd934422d878df676cce686d8069f501725f465975d16fe4baa0d1c5beb38074b18a2247123b1cc32cb449458199d7df6d921b7fce9a79fcecbc577b68ea1ca85401102e552794f949177c5ce3befdc53432dd9b2c6a16628ff15d243167e2d7b58599d95dacb3d5cfcf5674d58d90115ce1a026ca228fcfcea73c00107cc1a081aef5821c0a287bae4e0830f6ed02bbe67b27c23f5566ea868466fbcf1c64ab3e0066da555e0cccf761394260c21a86348218e335f5aa59392d02e4d73118a16df2cdd0181f84204de1eb69548abbd78f1e2613954d2f366310a0aaf06d119efc64a4a2b6407e77cf2d4a73e95f8c275640cd9e79e5c6badb528a92356b9102841608eb5da7cc19c2cfd12f68a57bca272459bf3c2ba28a773deb1811df05a6d4243f0590cac220221d018012e73a4d56e8c9e2af6810026d4d85d348b03cdf74c88406e35319bc674e4eebbef26291856cba4407ee94b5f8abeb35bfbec68f876356aff226463a682a44b803fc89029d1d3134063e38d37ee1c34df2e7b1fb10a889d67022821ad884082ba373a510fd587aeb621a2ca58fa0e5a47ce46f59ea6b2f71d03434b2f9f796b8c9770c34418b48a08e5175d7411c1ce871aa088858047608e456d9c0fc23cb16e555aa7e99d3546808b3f5fb7a703034b7f1a6ba9719f5571940810600189a1db16a334136892bae53f9edc08d4f0a10f7d683cfb36b9bd5a7df5d5cf3cf3ccf6fd27f962c6a26f207f564eb4c8645284128d2facda701bd85c1d8199b57cf4a31fc5c8181a3c9d4815895abd2413451dcf9272068bb13bf9db113aa14747c6fd3377a46f7bdbdb4aaaa7349d88dab84286a82cb88a92f0927794b615956484ec401985ede23cc3d85bee9e9c4fa2349f03bb2a82f1418043759be57d8e456d628ff8294794d33134d41e9f97dda02791a8dd80434915343d245a2ba114cdb821407c83cebb1469b56744d42657946641e7df52263be0506da59231b607849c43478be3383e42486085b2541dd9bdf7de8b65c250bd6a408c5e96d823266a5b7514f6d863741ebd2aea1b0022589ba86d8f76db6d3754fbcdb2f6b417b589831edc37b12c27084c8796eb11984438e17c55f7de0b5fe2d7bef6359f43b7b096c8c60481965177fe7e6e871185f923e67ce77e81733bc0396f3dda60e4a036e76f64163a80d26b1686a9314e2802b8fa91fb10d7b717bde8451887acb6da6a08f4dcede0daf8e0830f361b14df3c313a2a9d269b31ccd4423fea9fd2e7534e392543dfd523ec5582c5363c314d3cf2c8239b316f296a130611b319b38de4a471d34d3775286733a228a9fb7df7dd47d8c76623552d21000273a9d5666dc20acabf06f37ad68be91081286f5f4fd148f049e73eb1c36e8bd5c810f04e455d351adda594dcd876d5f41cf2216f5f330ddf1cf679fc9b5e7ae9a5bbed2481931110d395901b097e88e044d4862012b606f681202164772798e040caf60444cf40c38a9e35b022f237e36aa9761dd8311461348d981b2889564e484422520facdb210166181b6db491995c63bb485cf3f4caa2ae398cb9913ab036212060665d4af355df79e79d2f7ef18bebd8969463ee2255570950e349b3d4524bb5e9d85c8ada7ff8c31f6ebbed36dffbbe0dceda2035a175d35b0fc4a0b4b0e5e83a37f66dd91f559f4304d05711b2c0776046aeaad092f29b43e4d5f44004d65d775dcbcd1e2831c1446119d4962c8fa79e7a2a2e71e79f7f7e3eb377d416060c94946471cf7412532b6c15d8199ffbdce7465658be1632221bbfcf0c453c3efe9b86aecbb4e51f21b573484078e5ac5897df077a44794e3e5ed4a610ebc106a27663ad36d22ae6e9344ad308d995f9e18111451ecb4e244c736b116cbbf17325b04cdde1243d8999645f88672519092c2bcb55380b08cca5a84dc0207fd1bcf2ca2bb734d40ea7fcbfb9ac3ca4dbf787a115cb59b73c236e98aa2fb7dc72dd36010eac381e671691cc62da6debe2368308a4a276e747bb194455436e8f00d12a4ccec65c046d288996565965159647360e3e5a8267138f19f18b86b0ba261616343853a61922d39e50fd9a6baea11c8b94f4696109b6fe08916c34d0b311e0fb4898b9babaa98c489f9b89dac40bc706c3fa8f36f79c73ced96cb3cd2adbb5dd247ac429a592385fd84cd4a61676ea988bc09c97b5cb2ebba4ad404324ec0b2eb80035fffbdef7be40406a3c4ac27ff912f063ae4cd6034d6a54dd523849fba992d94280ef72ae7e16b128c04de4a0663dc1af8b2caca82b589ed8d44952c07ac7aa8abf4b3386692d6e9d46f059a0c9e0389eb6dea604fd62a41d61656cc3507585401e01bee179f3e6f9f9c28697afa2a742a06f04d04a9a9d31b900b1f4a86c0e99fbcb5ffeb2b713c05e02810c5545257d2844b0e38367036a9cb580591345df42b6c3a6bc77a747330000200049444154b25d56f5545dd22ccb32434330f5b3957308f9d82bdba5936932975b6eb9a592382a8ce26ae3d45852cbd3f076082b4e57391d710ea9abce2b303bae88260a2b0c1f24f53a265ff8c217a21d9f144875c42a170203119833ad36333cfa9a87baad0bd3001772dc23583af18a600dc5019c2981c91d73922866cce792e83fd1a44aff8bf283b4619cfed3471d9610b5b48fab768e1ffe3a6c3431493a8445ac260e81c880e4918f7ce4c40d411d9e3204b02a269f399e09575e79652aa7da60d1dabee4252f41dabee4924bc8c5884dc5030f3c801af5f8e38f471384489a5644fd4984e9f7bef7bd70e0df8cf96f1e4fae4cb9e6f5341884201d920a3ead88d0196d46a4486c66d40eabcb2fbfdc37c10671edb5d7b2e5a5ed224f4457bb8c97202429651f25fbeebbef89279ec879e9631ffb18db715d132043661f9e4601b6d31b63925fd631214da67f84fe8e43571db1ca85c04004e64cd4c6b3a1bda1f6f5d75f8f7b044b032ee498ca311f582b11e26d0ab1287092c65f64200a03095030d8fdda40ca36047dc8d900827f8f0fe72951bbcd3b52dd8108b01f47df58ea633490890884408708f04d127419868b162d4ac5e5a821d64c0c2ac8408ed1f681071e8825372e717befbd37c237061e287490f3d0377fe31bdf4028274d3a0e9170d86aabadc8f3d2b8cf954656186d57324cc3a420ef566e1f0c9c5d92ad962b530263475ef2c69c9370642f9189b61189da16bca5b293f9423a9627889e12d11c399be3041b31c7a14cdd10d62cd2b2211e60e01efa8f56aed2fec438a3c2f34d6051935aec64faa04742204660a0debb2702d26ef9ae70001df6ea8d3963074d56c66f7deb5ba19fa82e02e775d65967e0dd5f4f031c13b6e9951fcbee98f44ddd984a045069fbb4c64cc6850b174ee54835a84941806510a30262d50d6ba187936246811a369a4d37dd947da70d1a74ec052f7881df13b111afb309c13422dac8512aa5ada3b1f681a190b611a923326836df7c73cf0d91bd6e8fb8fdf6dba376e19fb65b5912199090f2ac92acb2101b1eda4583ce4a82710b46ed1c42b8aab51f077bfb8372c28d73a28018ed582451200958dc05be0452d2a0fcae6c8b42de85cf5a8d450d76f075c42a17022508cc595cedebaebbce4f5ae6c050576f8c0dfb6c6ef760c2d9d4c7d85a72c925b7d9661b638e7262c60fa39c43a28bc5d4b73a5a3df55f21d0128128299ab4da2df154f59608b05f209c1174a252f59b614e5438a291e031b9e69a6b5692b1dd90430e9306fea824282ca4633e8e135975b078e1dfb43a6341e2f4e5a86f09509852a2c8f7f9edeeb8e38e0f7ef08311191b8477be64aae26e586713f2e10f7fd857c768935d386db7a484519490418315a8658037271082073cf9c94f066d7c90ec87286c7f508e9dbd5d5fa0bc6368be0924013b78dc75d75d3cf501c2a39ee0ce84017a2824f22349e90b7b2b3221508d40893cde9286d3244767fe65aaf0e3ba8d44b2913fefeebbefce19941f04505a954cbbb842868984895b44091ffc8beb8ee619b6d3f708e4b9d9f4ef9e9d63fa86a9118d0f02289922434fe6fbf8744f3d994104580689fdfffdef7fbff1d8d998d0701f73cc31986ee3824f54e6fdf7df1feb4422df35e61955c4e3082307d66a4cfe50fad2e74ace279c70825fcfb1874176aca43427424f8c023bbde665333567478451e4fb94c0984717d19c0d3ef399cf54b64ba16de2612be70f13974367887362dbbdc906fc5b395e3caf9a1949a3654b19d20d3cbbe803a233f6dc959d474de0cf3c640b4af9545654a110c820f07799679d3c227b16561cfc30ea621dc93b48adbaeaaa5092c8c67ee812eafae03d48705ea923533908ecb9e79e7eb5657b102c42a03f04b836890ed2debeabbf76c559086410e84a6032d1b04e1ecd74a0e411f25fc87a884c4fd414e4d1d0167f47a6235c05733f5cc739b533c1f4bc9298fbe1e0448823e63df7dce3dbe598410c8368ef465f5ec98a42e8316eb67d9fad1cbb9d4a1b71e45dbfdd1f75d4511143f8a4014faa5586492927abcaee212d983e1bfb9cb3cf3e1b3312460a252063f9c669ca876b5c61851540a6928f0a85c05008f42b6ab32aa10048664169012e2c758309277bced63655ea28554edc438f38ff152642a03f04529faad442b4bfd6c559084c3402e8b30927622b366a662460f6d03df6d803356d941f07bb11827067068ba88a2c1b167fa26e23bbd7d12365fac4b14899041f24ec344617a8c0bc1d267c32f23dfcd9911b585c70b4888e436d3cf833d100012d2089ca9c0b0af2e0103d06231cef9c8ac95006ae3a18552e042a11e8370209361eb862b0f5624ac5b936fc8b71153f6fdc0625fdb37ff177c4c39a5326eede7552b945f3e129d37ec6adb1eb200ae5762919fefbb39ffd6c6015110881c608f824763079fce31fdfd28cb5714f5451084c1c02582fe0f987232026c2a8547ff0b71f5144fc40b835222207f2779433211a2c7a282a1e7df4d1380b225c224d66f2b060958e55345622e883bffbddef62afcc2f8a3f883e983bd2030e3820ef7dc18e8cb537078660456d7ff0af6994d9e889a68760e07fa975356428c52393eb92178a2c91c9fec38962f1e2c5589963950ec291610cfc91bf490580c5cb50fe63251d13cdcc22f05701b7efc1872606ce99206d0fa464a1f9c0073e40cf990c5c580febecd2f790c78a3f1e1eaf7ce52b43977096c7896720c26335847c67f86cb00646f5d2203f709e73fba7f48da060abafbe7a7b56190e184d12c7aaef56321df08f0853e0d563588e51a2f370217a23230b1a445ae42b45e6c08b06b35df4a05a4e47f616320d61348ca08c9c8dc88bd9032bf6b2cb2e8bfc8a2c8ef35fde1433c376e02374c9b48b5d3bb6e344de607ba55d42e361074294bd92dc99f645f16ff92e6342424adf583e4959450387335a2734dc88dd84f6b3bceb68ee88a9400c134e05038112418a405855b8512187204b0aff728aab74f04dab4f73091fdc24fe2ebef8e2f05650814fe21046d667564cff0573dcefc9d0706423f20d211c58b02abc94ba32c7ec6a20f4c722035c76d9655df14cf9a01922903c5bcb29a79c923e1d7d89a5b60e9f1cfbd6e8fba016f30860d2b3fefaeb23b421ba45a1183060cdd7d5d31123d0ab75787e2ce6d798a79982a73332cc5edf145f29371e48172badb41237995ee4d8628b2dc66d6bee158a4ae6fd1a90f47746f1de12a4d4c209236d8be84e5ffce217092338e34a1a7412dc3386187f9c4cf8eec747cbd8a633480c04404527c15b3ee28823066a32d28fa4d7127c6ef0e8a78915575cb1bf8678b9dc81a27062a5e392279397a1bf3e78ce91014964bf349a3ea8953c0224fc8a4e44819e5b887c5d3d1d31022c6b73b5b28dcf36d12be63332cc5e3124a913ba9eca2688c53c571f70657fe6a470cee26ab71cedca2baf8c56c6989c7ffef91c23528694e3504258fbf4d14c95f0957b27156ecd2ae19a134c30c7e7c21a69bb41eb5c746eb8e186c8d984532591f218dad55d75d5559824e2ae402cd806032cafc2c9d322e612343332eb2c67d21525f1b93c2b89da5d01db211f2eca5ffef297b30546f600448e6b1cf3a1c3ee89951010029385009b3871eb89df92fa0364ece6276b8c6d7a3ba9a236e2238e23d8a732786202a61a1a6ed5113e302dc093ba0d40535017a57e08e4c47050b512d5681cc685092fc22891e0b8bf1bb63f9c16defad6b7928317091bd3f3a1acb45914b024e347bbcda4fc92dec299030094db6fbf7de1bd0a83a24b74ac41af70e2c1959e8adcf0e05655d2c33e68180291863de7286c421f8d8ae7b008b029e2c281170196943e4814772385dfeab02d8a5e080881294680d33b5a1e1c7049717aecb1c78691b241e35a30c5032f1cdaa41a90303cec222ebae8228469644794a3575e7925fb07374148e1184b1039885de4b4d34e2b04628ac90004bf043f409c5dfad6b396e089e70d6484ac6ab0bb9f7cf2c91840531d47729f7120d32e62282ef65ffdea5769971ff645c885b8fba01ae7cbc1a7bedb6b44fccc2c6fd976db6d97e9953d220905f1b3387ba0a4c7fd1f73377e248221573379a14bf0e12d9f77de7954c78fea8d6f7c23c31ceaf831b0878504806caf35d0e3ae5a5857642346800f9e29e0effd707deb76168c78446a4e0808813944806d88ddcad2785b378899988f933387bd1d69d39516dc1354886b7608af81921bd1048304ec251053105c266820bd7695a846feab4297dc6b7385cc2dcd2fa224f2596115234398b39c0868eb396895d4253a24fe7975538b93f75bdef2966ea3a812ab8be66834ef848a19cca1871eeae3b9469d64a922a372c918a1e19bb7750d4502173b85b53a246338ded99c380928e93be42f56dd22800aca7f6fe8a5bae52f6e424008cc14022cf88861615541173653c3af1bec046bb5ed5da29524d01b3624081977de79279a6c5e33c128d65b6fbd3134dead13f5fa2e4745ea9bc06663a38d36eabbd181fc310c85867840bcbeaf7ffdeb4869bc4dce4808979977c7a74c6057b38121646c143fa1b2d1534f3dd55266424c5e06f4ac58352092de76db6dc81648e1ac0ea43c20231ad27f9ba44ba175c46b74ccfc97d08a19352132f4b6db6e8b2a1a4a6e1eb8be27571c9f3116204106423f8df92c317109f55a9974cd0f194adc224f3ae9242ef230a062225402d25f21b6e93e707b94fca2bf76c5b9190284890c15f9507dc693660c554b0808815946805805086301012d29ff03459d0c3e89e52847f31ac4491c54277d262b909ffc04df1907a0880f53b92421505e73cd357503fff297bf6cb570ea2ad198de74d34de6fe8c508b581fb1255620026ee80694f4aaaee9f2728cc8e1497056ce7e75b5889b6b69e11efbd8c79e75d65966a20d317f709038e79c732219fdb5af7d6d496254ec4f6c382462302399ba0ef451ce71c5bfd31d76d8a18f56c4b3130458307941e17d912e641c96854e862626424008cc090266d869ab0ac6244a156c6f6152dd222b4534e4a48c06b1b2ca8c1422cc11a6230c16656a03c7bb6eb1fac4273e819174254f044d94b2958f1005f6de7b6f7b347ffefc8146cc188d6db5d5567ceb242c24b9dae31ef7b8882d26da1ff9c84742219458f9fffef7bfaf6cbdbc102f0288b93a485b342634f4ce77bef39e7bee41bf8e771ae1b7198b1d09f8037b12642014eddeb0040524499207f601a31a339561ec175c70c140fa6e0948efec19ca50bb5b78bbe5c66c22526ae089a8adf5b35b84c54d08cc1a02f85b872163625072ed3c0b104d95a83d0b2facd918d94189c213eae28417c26c3763d8a61652e65e7bed859c8dc61739d8ebd58c2d3134b097a86c02474393c23108ae93d47d45023e12479c12f4bb5886bcfffdef4fd92eb7dc7216cac61ea115befcf2cb53b2f212da424a869ed199f49cd65db46811217428c764850434290125b8fc9215d53fa2ca97bef4a54ae25088a41e426b2f58b00045789ebec3a7886e1c1e3c436e1e3ae42f56dd22c061cc878b21447db7fcc54d0808819942203abd13e66fa03a6c46f091a83d132f1a51fb852f7c61182ac22e06ca733272ac2630a3b758f7e868d128633b81752f06f784e0c0729ae82804efab4c3bcc34264f8d759bf4b9030d97a1c46b360c1333e2c30e3b8c63463470d6020cc47d2136276db4fe28ecb935439f8dc76725c8e01f1c55393010a70fe7ce4aca77bdeb5de8ddfd23bc2d07f68d90f316de11418aec36959cfb28a46366776ecc01d61ff0fa68513cdb20e00db579590a7fdb064cd51502428044365eb408212b848c44ed59f906f035f443f522d1c82040c1cc767ec30d37d0e241071d74e69967f207c700427292ee11ad3341f77cb69da8633808f2b342c4d381dd46f28b8cd411d6d398d3289e31b0f1dc509c0f1467eb5aa7a259a410d2a42ec81134419b88b138a9b03975207fa73cc9708b9d892f473c426b9e52fa12cc4e087f69251ff8c00718759ebeaba78ccbdbdf138411bb9dae988b4fe70878c37a0e457a599d232c864260a610f8ec673febc72b9fc8808644ed59990891a83d7aad368a5b6ea86917d11643884a5b8efccb30ab0c68c8156a0e85797a84f828a038f4abafbe7a540b01314a298a5d7b63a355f4d9d75e7b2d4da077afeb1eb6e0514a45c22fe20d59494f906c5f8e217b700cada4b7c2a0a124b40b214d32941d3ec2f606a3a0c090d7dd18c60e7b353eac78c5447627ee0d67cebab31ce722be4684602e7938b7d47d150c0a0ef0e1580831b73719ca4a04a0f7a236faa7caab5e4e805c3a61b6c457346c1395edaa50080881ae1060b9b8fbeebbf1c2ffd18f7e54a75261a1e04697a8202c29e8b93226854c76b6690294dd7cf3cd5cff6628ebfaef7d3fb8488fae64432dfa838712ab4a7bb7a8ba9e8c5d39e0ea370b08b04dfaa44df82b5032ca8187b0d6d861376897694f28409b3f3beeb823cb470913a416ef9878e08107a615e11ce592c581b28479258dd9c6d0d54cb41096b3d4869bd5a792e17df7dd17ad1a1c542a297de12f7ef18b508b743f03e93b2138fdf4d37d5751c077c2763a98e036e03f33f6216e96fcd0305b2234a4771b004c2e79f8a22204907d0f3ef8e0e8b4c9ae46c62eb6db42b8b0d4f22f8b809b69459c5c31f70a64cf7dee7309699f92a944080881d12380f4bcc61a6b84e989ff1217aabe1b9cc077df7df728d42f3176f195c2d2c353220c70b94a06ab68afd975d75d3341b4a221c3c43be7ecb3cf3e29266c73584586ed8f558be48329d9f495fcddf40d4923aa43e0f0c30ff7130995581d65e7e504c0b6a609fc9c914133edfad016b8126628a347986a20dc3376ccc153391be2d44e9a337d397f4f89a063a92b318fc97060498a16b5d5565badeee443269a68f9c32624c3dc1ec12d18a08f26b623637feb5bdf1aba8a253daeb703fb392304175e78a121e3bd02d86638478100db0f42b611102092fca904a0f4d647c406099fee15575c11f280e2d10be5d24b2f1d60df78e38deb3ea408ea850b17faef8aa8f6d197ccd61b08c25d10565ee5d2fc8cbc5c0d53088c1e01f63592303043398d7b03483c9dac33c1af099a74a1600d614b354a8c2a83530d8b095a00ee8dc3dc873f1aab920146f9b0d24c795ce8057d194d3ce6318fa1153a8f9d6709ff89a691a83dd1af6fb8cefbc0f27ce2a8d986abdf949a762d681d6204d752cdd89861b7cd7feeb29b31a9ac75e9a5977a99e3e52f7f79a1b092720bf137f8237dea4bb069030d6b17a18a004975f45e3f6df484f0ab23f6e521b4cbb2cb2e8bd949499536349ca0bcb90ec6f76db84d535d362acbd684bf2c12b3ffde7847a8972cb91a9eac0453c710df5e16aa6b7f0d65b3d522d2c08d7c466c6cc8c730849e7b98f00d979cc4a84550cb50258aa8cdf78f328ca7ecd02442a287dcf6f2428dbedba4aad3f4a2351621301a0438ee5abca0fdf6db8fd9ca0a131c2d906529e1e297d94a2117b9041a0a0b85f7fcb130b8575f7db5d5dd72cb2d99e6e847a8ce0f6573581ff0ef2fd9138385a755c40dc9a371f1c51713ed801f5a6da47c347d96570e623411a3c16d0e5b91a83d87e08fba696f83c1f7bddd76db556a79bbed163a63b47436f74e38e184c6cc836480f96fa4816bcc938a60627ae8b0ac7cfad39f6ecc1001083ed849972c4c3ff8c10f309ee3c7557ea6c528290cfcb187cbd0874796f7dec6559edabd8473254d64ef7efcf1c75792cd602117a9bc0542a7db74e3eb0d1f1b7a1d9b1dd869b0c945f3d12783c0969acb5c2ae24880162a522dfbf3184ec6034f56d1b988f4abe1bdb0415ac25476626be5d8638f0d1de60f0c4367f0256ac842607c1060936226a2dab02b62e6a97740b4a33b29cc58f6a3858273b29fcb167096122c4fa23d0bce3e24d1d7bef6b581c3df6db7dd0273d4e49e21066f3cc202cd363b6c0b4d256ff43c1dc87cd209246a4ffa1b1caefffe50cb546c66cb315493fbeebbaf4d2732a23796ec99b441c317d697a1ba5147fca10f7dc82f3da434afa31c581e4e32ddda461f75d451be87d8f2e24a32b0331084b4915427357d499536349141c24f7ef29336dca6a62e5f05138d57104e3b3e71bdbd598233560ac72899fcabe76fe46c5e6b0a0e13c45a31fa8116d591a176385ea26ac2960926871c7288b59206c7a457690754220484c06810601b454dc6240dea0ce4e9c8dd9f9b4cdc25d3feb01c715515ad2a1ce9534a5a99376f5ea0243a6d4ae34b58822a0db5e9dbdbdef636f890edd83247d287c87cfcb8e38ecb339f82a74b44a0ebbfd38d0011e8b811b63172afc4f68ff1747f43c62ddadc0469e2c4134f4c7d010b9b66da2f5ebcd88811b5dbc7b560eaa26e47cee6022ef401e3b628b25e61f78c0c6d1f12cc124b2cc14ddc501533c40c9c64379e8065ab30281b9971009c91529dbea172688c7fa687f6887e721119c8508778c96f60f52926c0348889b6e2df7e36cc28f80f3b1f16413e2d68060d6e5a492f9a12803fad8472e69d05564f29adc46774a3c43c07b048613bc43aebbcf3ce0bbb6c987756115dd4739ef31c3e2a5c60d33343f8de8cd8be3dfea69c61e218bdfcf2cbd77549e5424008942080508b1934943866183de26c14668a74c561c1f13ca319ca2334cae48c4bdb65f2623916ca7d868a94989228a236769814d2d5edb7df1e9539db16d671b671935b836380676217cb5cf0a657b86987c3aa82af0b777d1393ba610a8e0b1a4239021c28fd1e7ccc31c794d76d40c91db4cd28aeb7a29baca1b8f9d07858910e55d713632c8bed1a2662af79cd6b82a9343d447a200f6563b656d1cce358feda8c34ea43941b9224b7c84385fd44511a425e70a02ab16929e49c92e1d8e7ddf8da580aa5cc27bac4aca8f9e4c2280e3df450bfcd1078a46e80764d1c8833a17bfc0d06f4516c93883f7239d62c812d8e957c1b70e010cb07461a294f1f89da9c4e79ca17dee0888ea72cfbfa086ed2eaf054b910980204aeb9e61a262f6e8561492784a85f52320b059b82a7e48c5db72f304fbdef0d566479e870c7f49c31696353b08ccef3e7cff775e943708ea4ca9bdffc66bbeef66a2fcf2aff37e704cefcf9be8dc35319908cc35b18691f088e11be5d9458f695f7d1032f1f5f72c9256d9af0875d62893463857c5099cb1d335934dc2de5638c3a2caa60cb91faa1d1a528dbd65022ac5f2bf122ef55c48954efa30c6ed3ec63184d2db631337c0af234ef94491726a0a52eaaeb8c8f21c0ce9af944bd0f13679e4a7394d00a5f828f30802939e74c54441ccc4811957686f31edb2149a388d11e9e3234be792c387d84478cc45059c13ffc20c33c144fcd70a38216aa3c7c58da199508811947c07670ef5f81ca2c2c29f9852212ca2b8d4c0c5eef5202f3ca60a0fe45104030f4014b1202a4701a67d6dbe13c7a656c10e820c8b386ed4a58d6f883858b333feaed105589246e98c3b18cb0a4d8bffc41542e9ccbc315190b17b926c6fcab90a83de62fa8fbeef99b2666427f36b5fbefbfbfcd3d0c4c5b3a325afe45e3b660c182c6a090a51cad363f3ccc36df7c73822a84b41d98a816ba1b56b66e677a94828586d4954ca24256377fa027274e49ad40c3c2142ed770bfcb8b5f43718e8869c85bf5717598110adb34348975b16c46311c7ace5bb06824f6665150d50d0a0ccd3dd128316daaa3a4dc2b84d054e5f167cafbef0a5f25fe4bf02f2c5bea9ac81cc87dd222620bd471c0d63334da26c84f1d7f950b81194180f9cb5615a624933d589230c510793338781767ee7259baeb88b9ddf2ab443e1e1f7cbcb1384a6bac1c912e9a851661445cb559eb48ed758b0f7777612dc585893003756319877289dae3f01646da076685d951d9a77ce49147f6d13c22059110ac091243b66c0247c330ed2b4fc9cdf833a559b356586105638ed88d8aae012bf8a0f68309766975ebc2b06cb18de3401f464dcec8ccb258c99c5e91e83e70e82fca35f1e9bc3b39ce0095fd512108f86c6a582e9a9f502532bc2f4e6ee1f58570b929311f867733f2eaae949812a26e05b6e10f3e600ea2dc44e5c5f494217b7060422cc294c04a9817169ecc88a35c1b75b5542e0484401e01b4bc3e4d5ba58fa371606afb7b5dacc8329c7dfc50226de7771f6fd51d5603b4dad867a368c8d74dfb403f43726ba2a96456241f330073f094d5f89428317bbae94c790902e5b6db6e1b0649bc5e3ee5cec77cf9e5977349646c2bcd36866ad1a76ff5f2c7504c5262641d8cc8913c4cb70d0ef80e7251cefc4c893325c447b364ec789d868bf20cfdc0478859a48309fa42e46c129754e6cdceb0a2273e2f6e1a9f3b5377a84798f7fce637bfb12a582f9877fc501c6687d8fb23b28b643e666c39c267cfab0c61ad53acb860f56e46194aab9bfa1e518e9c8db4cd9d2cf62d247b4a5ba92bf11f7ce61385cc2f3b266ad7f154b9101002850820cbb2010562dc90ea2ab2c1f9b94f34fd3a4a8463b30837020ec999a90d0d6ef7292b2ef4f05f42db8dcc6dfa9794a6ae24443ec88740f07b0d51bdfb9064ea7a386cb944ed61119b067a426484281604938f7cef3a19a1899eb0222287370c6dc6dc674cf4f7efcdb845b5089761d188ac9c2479a8e187e28cc6110b192cc632cbdc500c11f7c3e2459613fccd0b235444ad786d87d73e0ed5993c318bb2cf5c406fbd863b5f77d69ea2d9f55a6db6bacc06e629b1f1f0a7a608378eb5a1041b47af3c4e118eb65bc45ff654eca9f059346252a5226d93e33dad3bb0247fcef4be5066243a90a108848010c823c0840d04f98502d937e844a8e2ef3ca326a0248a5128c4a83adf07bf58911017d347fc4c48146fb50874b6f7de7ba38762b3c8f319f629310dc39a83901052c80dcb6704f412b54700f2d835412a546f5c1b45446edf5db4c22133257236d2764b9e7e8a926eaa25b7a83a739555c017e2315d7efc407eb254233069261047fd21897dc8e38dbf0b777019812c0305e3f2c712bfc8666a0dfb08099ec052568b169b79910fdbe884d2731ef35a6d9f75221a111f95d73f711aacfb06a024ae4ea88e0742109a2b51e272c3471be4f264830d36c06e8a5dca42e8582dae8ff9f02a394485fe0a28af55f236e2f86fe4e5f292a6452304661c01a6bfd728e74fef7ef1211059884f956268c104adfce94f7f7ab09c4e2929894eefa496245100d9dc309e266076d883d82539d8d3e14a2651615855f237cc96b936d40dc27d491323a691a83d62c0c7a53932cb84ad0ead2471033aec1917dfe1461bdf8bfc1d5049bb5e3beb8d494aea96d0585c614f1965c8cb30219e31f1252088e4f54c95cc23ac5908d50401523b4ed6c1b53453a5ee118b94bf0dc84b60754cf2e534c1392d0490da74d34d097592af32cb4f89d7e1836d7997890816762fbf8366847242b9fba80203008709c5000015aa494441543f42cf964f829821d634b22ff7392155328504252cd142954bcc5ffce217c33009fb535e7196bf198d5d08641088168a8c4d0832ae9f802c2975a77778fac87d2c29796519c2032b5be8645852b83947f3e23d43d8d1d0706786131e85c521bf4af8d58c7633f678258df64a2351bb5778c79739f94d508059ff706bf377d0ed3b4da09f7018e53aa93dc310fa07567d88da2c3ade07915648c882cb5a49cf3176870c1133e4b32ca95549c35268b70d6802b883db628b2d2ac9ca0b896c1a880b13df943387128f9cb3ce3a2b54c1216fa8eab346ecb54aabaeba6ac6d286b07afe3bcfd884f8e4ed5868583208031626c4c08a40f6ca72bed8e818eccda9efbffffec8db89cc917e4f35ce79b553689d7001e1f68c4eeaf663d63e7e8db70f04b83df6fb54141cd6b7185d942194d749b14c551fa7df9fde719b46af145d5eb16d854580f52412f75172131e24f48445c9f78a4b518c4fd2dbb012ad36217a433854426ca12968afd4ebe31d194f89dafd613bd69c9966c4bc0b930daf85c29b9d9251795b05b4da2555f2348d456d12be10b1846b2c9ccc324d206afbe5c028a3e4d595d551fb91ea8f47587bd729092a2ba68518cd6fb4d14630e45e0f99acd2ec9bab7f628e0e4cdc65cc59adbca8ddc7891f8bfc601e879e728d35d648c7a5124380f9e52d1a335a25e8ed9ec42a62825577310a4ffc6503c2647308fa274e41d862725d73df7df70502b6346f19c5d368738a3e12bf052264736c866789aa3b7ae934caf76c15b9fa208c775e4fa66f4608088112043efbd9cf06b2cc42010d02b43f3907dd73da8a4f9280536370b5624321063f1339322df3a7775cbd917a3d4f56185fe2c50c16048ccbd123dc7aebad6937f225988eb016992d1c32067dc8e7c7cd731bc1d3b646b423e8a29ae809012249a337e54e07fecc43ee8cbaca28ee3df03a31ad6e266a738046fe0b9dc1ee79287b0c26f340e4512a2022434698bf81c41902da226d352147b8c727a069e55500720f9932b93243b8e75222c3cd1e45a23681930756198a804593638c55e1cc46bcf3a1aacf1a31fb8abfc0cdeb9ffcc568c6fd1fe3257f8624bc6e383c732dc38917234bbea800350a30af964eed52ec63367aae41fc3763323d514aa223a517d611eb3ff399cf503d28a538ec11dbc4f23ab16d33015973ead469b3f64968bc42a00d02cc322fe662909651f7f8b042cf7ce6334388dba803ec3221a4018f881e164ec5ac27e616e2bd24d905fc62959ede3162f44a2bbf73710227d12317c26972f5b0aa70b947cf5931bc9e9b2d92ad07ad363a08120e104abc8f3bdb36afa6a22e03d06f6611209d4df8a609cd8b26ac13287cc6990f7ff8c3ed797a09a0304a3763497347d725acc682369544916306f6dc6c5b5b266d410032e31312e1b22ad5351a022da303a8a3f1e520c069cae63cb60a9da7b0f1421b41974aba34cb345ea5cd4b61dfaa438337e5770e5c29ea28b9330d6b3a1f7078c5ec9716e83d4a2fea934a5291186111671f7884d0b61c0f8c0086e492a00a5ab4a88a4f6153b1c1fc6f11bb3b0624f9441875c354b91010022902cc776ff79849548c404cc4d8303d89139572b3127f0906bddf6b4e3df5544a5009c12d5467f3f237541cc823ce3847fa65c11c198d868c573ce2763daac26a9377c434860496c580846b55df9fba71cd79b90c4832bbc3f43fe26e28c4b9c391d134dced87bddc72cb052648187ce52d7912d32770285136438caf06118ba276bd5a317a1499a5e2769d71d0b6ba04946075e3efadb6daaab195181121882fc18ac651073926e356f89def7cc7ec779ffdec6717e2190c488897dcb887956d2184852b82873ffce1444da924536140c0eb7ed0e244d7ac1e2814d5b84f84129fc83dc29390baa1049bc8a0d3e23e075d32d6203ed01094fefbe72238ed83371fe7e017be19144bdcd5222ef3ad66de29296c38e0d98f2f24fc4d67703fa03368a1f0fa451d9561a2474240089420808ba13fe8666c42988cde6d2343e96da9b9100b392099cbc71f7f3cbdda65975dfcadd46db7dd162cca284f83fafbc3005b6af82fa76e0bb44510a4cc60c99ec33e9b2e29dc27a37127473d3b353669e416c83019874712b5c7e12dcc651fc8b714e27b1c72c8217cd3ed7be3efacf11af4c1c59a31e7fc1ac4773bc50ee4831891caca75f6ca88a4de860ce6ccf0cc659cb58ed934023a82e6c0b00f75bd45518d890b2b26d66698e73ee9494faaa3a4dc32e5b254d58d22aa8b6e00c5bc15726dd7ada84d67c28d2481e1fc1bcf0c61661f71daf471423236214014a5b9f1e1772200fd178e95a4bd62745d181a41c9d4f6a2335fb837d4c63731fd24bc6745d850e93c617161c8c696b7b1a60a04f663fa84bf37d964134e1a8c9ae585531942bc8fda3bb35f85062e04da20e0a56764626f6619b1fdd6b7bee585f254200ef4fe7617df1bdb04590198fbdcb8729ef7da716a790d02aae8746fe28ced8d5582de0d610335d336db6c33507354b9a4305e3cc2e9157d40958ed2d09b98b741b5afba73ae575707e61c81934e3a297c5e9dd87bb0a17ac536d61194b41926526308c7b1e28a2b9670a30aa6ab7eda109f81e5a6b21b69001653c657125b21828b99b613c8a5f10596058121cc39a1a90939f2e9e447213f9e62686e1940380330b44cc7c223af9f40955852a59006354390c91004396f14569c5932be587f8ee29dd641c1cbf5d955f143aaa3a4dc8bef871f7e38ea255e0d71b2f9ec71b18d3e4b44708e85614654f6010e416fcdf18cf9c205b19966a2090bf624be4bde31838b8e4c6f89ab1d8eaf1c0c38676688f5480808810c02cc6eef20c46138437cca29a784898f2558e544b6eaac54cb2cb38c11e34f624b8ae9b391983921fb5658ac10be03e7ba3e2055071a8e0734610cd93b2aad34615b98981dca60268a4c6fa1cf3238cce1a3bffaafe837e308f0e9877b22ae63d8addb03626ab030c1608bcd56639194fe9c78e289c60d555ca1d9b18f8d8d5e0de57ae5b8bc78614d7056aea4f485882026b8a4d66903eb1a014ac7804ff91f44992884d11bf2a20028ecd540325ab7f886d6e74ece66031b9d7402bc7fc22b46159d392bf2357a354ffec8c7bb08372a1cd8b04be1fe87864821917e24382a94f48169120c4bb842b10c14783b79234bff3abcb62c2f6a536bebadb70e7de0843fe9af55fd17027385005226e7d5309b52270adf31bbe6326292cbe4fbcc921ed8a22633c99b7b4b3ca6a28aac635e636d51ff52e67846060183ed1b6b46f8b30ce2d3991253c2d082adf640d5920f8782722d5df72a9b187da144edd1633e8e2da2010d0aa7c30e3bac7d17b1fcf62a349bbab86a61879a913332ed621316e63f56cb19caf008af2f736d46fe40e7c784afac15d98a714a2e396c9820cb9d5d0971da6eaa470fa3cbff81396ccaadb204bb8ec0aa527950596b6021b77e41418b4a6320bd0840800dc02e5eb993c94bcf10db111190095239103d3893dc94fb5364626e6fd97d89745eb9df60ff6da998c9f18ee3728633d17371e1c0329b8983672d7b73e6705baed5a645828a866fb2fcd098e9aa1e0981994580ab4e66130b052b461e046cd28866cb12c1e570c9a528fed36c9d669182b917fe8bd8585636419402fa80f080345f4960855c61b1055bde781c3670a34f05f750bd5cab4d1582fd8725051d4146619fe9de081e49d41e01c893d1840f8487cf41fb4edb244c0547c2ff312d314d1e4ae666b30f295e11260abb479c8710ec19d101bf4ffc2760c564b6ab3152e2f91e62f7925902fc5a6071af77db6db7c29e783234e28d733722e297b4c8e8423242d6caa1a0cef087cfce3bef6c88b110cb74248355f4884fcefc7b4aaa4099916e530ebc6ee8edc34e9f86124470f6bc928f014ac8ac1bf9bd792851db9f30391ee4396706a2474240088040f94261d3b9f2105e892473d3969481cbc5b07d18b84cd174c807c7f69d5f257c46643626924e540e67ce0be516998a82335a82329bcb1a1b3c4660cc9f9640608641cccb9409738398627866708544763aec93539ab4847373b022c5bb8b9993d2a4255883e1bdb7e38e3b521d211beb6a046ecebed8ab71a5c5d59817b551ba13b404c134e513958464ec9cce0712a7041c00586ed2f292929050204fccf2842b8cd1e4e3ade6f9444fb9220ce921312349f3fe0cc56da688b939e57c95772b0c8040f9b0873dac1c1f3e6fe8f9a59e8e9e096e8bdc3595f4c11c1cad1b799ee59d84d2675f62262ac0f650e88958084408942f14cc7a88cb671cb3de969481cbc5b07d18b84c31c6b0bf0fdce87d20606ee1c6d6415f296c3479ff0701f6602c7a9141892887bd263268fb086e986312e880eba7100ac3c38d81c7c57ffb9d7cf2c916a03af33298f9188c12f4031a043e44c9814b8071e3ba1ce970df7df7e59eddb258738a20a078688b9502ff0f5c37f281cc7cdf8852c412804d6d1a7b3f3384f0882ef9549d25558c86460b5b247a20f05a2d9fd9a4bcad9492186d169095479c5e08b09ad2a84408d421c0d77bd5555785a79c75cb37fe3a9e2a170242609611f0b9025081174a057380d89cebd5d581b142807450a6c46217c4aeba93be612f8131998f49927ee8a84807b6e5a308634e3a903e22403a479d8ccd377931b1723bf2c8236914c3596c58f35754111f2eeb2d354c2746edc38ea2903e987970755067a45ec8cac8b879dc6fbffdecc52124297cc450e84d31b13720c93b12582249fb8430068ba2194c31441a9a101002e508780312f69accee8c05a30f71d8a1f77f796f0b2965ab5d08d40c919d79e699b61d72c39bf9ca8745045664b2c091ae327a34a608758e17a121a43d42f35adfe6307c0186ecd687b1350b436d8fe2dc3a59124da5e455a2263786b89c3ff8e083255544330b08f8082475d1be98b9e416f541becf3df7dc59004763140242605804bca84d54d93afb721cf48349377b13b198866d6894f4ff9759def651fd2b04f8fe30e7b014cd382c9317badb7b5eb4c2040ebbe0820b162c58e073345e73cd35161238f30a10d6490d050126cbd822cfc96dd1bbdffd6e7a8e01f4cd37dfdca1196b66d4c33e426d6f61c811b8c9f8e3f3750dcbcae86d51e36881993bb19c57596595667c546b6a10203e2e164a44f0fce4273f49886e1b1711064230fbb068b09ea0c0c64e8c3f20439fcd39194ba4a9814203110242a03d02585d9325e7fefbef479975c619672070c393200ae416b0c5c42f2998b97229cd35b5b54ba00562755ba8d3f63de985c328e57ab5352908f09507fdf1c0309c8d07c5a4f24e7eccae81ac10d309d16d3381848503e93b27c01ddb1c2fd0fd77cebc1386bc3bfc3b0da24e32d730646cd961c8c1664e30ef041631e91001beb19039a27c5bc20b99188248e71df644ac848010980e04828162f992b2e4924be232c4697ffc119056bbfcb5ce1625e74514b7e40c67d8e79d77debc79f3fa183fe14742ba29268c4f3d55d71c3e9416d884c300110347ac57c6de94e0c4b8909294249331bbaef32328c77696c0a59c49306223e84ab02469d6344bd801071c4080e75e3f83667d53ad394480cb0ddc64d30ef0c1f84214515682cfc0aaabae3ae2d99a764f254240088c270268b5efbbefbecabed91a121613536f13cf80a49263adc9768391a85df96655f8570490b6d75b6f3dfc0851672262063d7787e820b02ebbecb2c6902825e1ef4c1338e4e1686c214410b5c9179d21eef611139ec81b98999250dd829974cbbf3d377a886b9aa5bd3dfdf4d377dd75d7963c616299c63ae1d6b233aa2e0484801010024260e210505ced897b65a3eb306e4c37dc7003d1e55091bee94d6f2247639bb6c91f897d362e0e9e4988fd4ccac612399bba9c62311fe7e688bf09e167165d6d3a565e97501ea46187be5938edf2861a5392f5133b72aae3b8bdd34e3b35e66315172e5c687236d71aeda5f6969d5175212004848010100293888044ed497c6ba3eb33e60748db04b4c6058accd22154f3b03d4058df68a38dc88c83a53531313efff9cf63e7806795497270c322bc9c27c1bf4da024fc9ffd515eb70de5b5d75e8ba61ff38cf5d75fbf0d9f9eea6254bdcb2ebba0d8c69504d57b4b9f51ce3358d6d2551c647b321fea0907b11502424008080121303e0848d41e9f7731a63d41dac6a2fa88238ed87aebad7d0cdda1ba8bd847da9715575c91580404b4c60a1c4b6224788c8931e2c4ee937430433144a63479f7e0830f268ed850759b11a38f47b94b5de4cea132f9356b6ed85a48d8d878a0d5a622f9711a78ad452d127b116f487c55493e3f6c67442f0484801010024240081802b2d5d697508440f04b28a2ae2142b78d0dc92db7dc824488904dccb8cd36db8c642bcdf27b937a06ef63b83de5294f213c50fb907635bdfe9f62444ffac910eebaebae95565a294f3cfaa798ad73f640b14d18b573ce39a7930ef0d2bb8df3d849afc44408080121200484c0042120517b825ed694743544a4673c2d8d1c90b689e36b514108eefbd0873eb43f8c2ebae8224cb4d75e7b6d84fb710ba48093e83aebac4332914d36d964d1a245928ffbfb0cc45908080121200484c05008c8806428b844dc0102c8a9c8c408d92de56cba827324f6d3a46bc1a09cc81b1d74ae9e85a585c77a64dce4ec3ffff9cfd8c1236793abeff2cb2f979c5dff0ef54408080121200484c0a81190567bd488abbdce11404d7ee38d37628e62c9653ae76f0cb1a630f5794ffcdbb0e5a441601614db6d98a8ae101002424008080121d0390212b53b87540c8580101002424008080121200484c05f11900189be032120048480101002424008080121d00b0212b57b81554c858010100242400808012120048480446d7d034240080801212004848010100242a01704246af702ab980a012120048480101002424008080189dafa068480101002424008080121200484402f0848d4ee05563115024240080801212004848010100212b5f50d0801212004848010100242400808815e1090a8dd0bac622a0484801010024240080801212004246aeb1b100242400808012120048480101002bd202051bb1758c554080801212004848010100242400848d4d6372004848010100242400808012120047a4140a2762fb08aa9101002424008080121200484801090a8ad6f400808012120048480101002424008f4828044ed5e601553212004848010100242400808012120515bdf801010024240080801212004848010e8050189dabdc02aa6424008080121200484801010024240a2b6be012120048480101002424008080121d00b0212b57b81554c858010100242400808012120048480446d7d034240080801212004848010100242a01704246af702ab980a012120048480101002424008080189dafa068480101002424008080121200484402f0848d4ee05563115024240080801212004848010100212b5f50d0801212004848010100242400808815e1090a8dd0bac622a0484801010024240080801212004246aeb1b100242400808012120048480101002bd202051bb1758c554080801212004848010100242400848d4d6372004848010100242400808012120047a4140a2762fb08aa9101002424008080121200484801090a8ad6f400808012120048480101002424008f4828044ed5e601553212004848010100242400808012120515bdf801010024240080801212004848010e80581ff0760a00a07253549f00000000049454e44ae426082}}\r\n{\\nonshppict{\\pict\\wmetafile8\\picw25770\\pich5450\\picwgoal14610\\pichgoal3090\\picscalex64\\picscaley64\\piccropl0\\piccropr0\\piccropt0\\piccropb0\\bliptag828800769\\blipupi96{\\*\\blipuid 31667f01aa37d87652db9ec8a1208a51}010009000003ba98040000009598040000000400000003010800050000000b0200000000050000000c02cf00cf03030000001e00040000000701040095980400410b2000cc00ce00ce0300000000ce00ce030000000028000000ce030000ce0000000100180000000000e830090000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdbababae4e4e4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefebababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbababac2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9565656000000727272ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7272720000009c9c9cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9232323000000707070fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfbfbfbfbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5444444000000454545fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a30000003c3c3cfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d5d5121212000000515151fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb9d9d9d5e5e5e2b2b2b070707313131858585ecececfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f53f3f3f0000001f1f1fedededfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1040404000000d7d7d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd050505000000636363fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2848484797979dcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8272727000000000000000000000000000000000000151515c8c8c8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff484848000000060606cbcbcbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd494949000000787878fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe909090000000000000828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff999999404040979797ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f03a3a3a0000001f1f1fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2525250000001f1f1f7b7b7bc2c2c2ecececc6c6c6242424000000000000d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff979797000000000000898989ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000181818fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa333333000000090909cfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7a7a7000000000000959595ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0353535000000101010d4d4d4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7d7d7a1a1a1fdfdfdffffffffffffffffffffffffb9b9b90000000000005e5e5effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2d2d20a0a0a000000313131fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5111111000000b2b2b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb010101000000313131fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9f0000000000009f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee353535000000040404c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7000000000000000000e6e6e6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f72a2a2a000000000000bebebefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe626262000000555555fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe747474000000000000969696ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff959595000000000000969696ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee2c2c2c0000000000009f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9191910000000000003f3f3ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb000000070707efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec040404000000141414f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7676760000000000009f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabababababababababababababababbbbbbbabababababacfcfcffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbababababababbbbbbbababababababbbbbbbbbbbbc1c1c1f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3f3f3f0000000000007b7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e5292929000000000000000000979797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc222222000000000000bababafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1b1b1b000000989898fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5252520000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb404040000000040404bababafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000171717616161ddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7575750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0a0a4a4a4ab6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6b6b6b000000000000565656fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbe5e5e5878787141414000000000000000000000000b3b3b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadad000000000000292929fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7373730000003e3e3efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa0000000000000f0f0fedededffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea2121210000000d0d0dd5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6b6b6b69393934949490000000000000000002c2c2c7b7b7b7b7b7b7b7b7b7c7c7c7c7c7c7c7c7c7b7b7b5c5c5c0101010000000000000c0c0c9c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9b9b9b99e9e9e6c6c6c0303030000000000000909097a7a7a7b7b7b7b7b7b7c7c7c7c7c7c7c7c7c7b7b7b7070701111110000000000000000006b6b6bf7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000000000242424fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdaeaeae4949491a1a1a000000000000000000000000000000000000131313f2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe3f3f3f000000000000909090ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece000000000000dfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f90f0f0f0000000000007c7c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9c9c90000000000001e1e1ee9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000707070fffffffffffffffffffffffffffffffffffffffffffefefecccccc1111110000000000000000009e9e9efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3737370000000000002b2b2bfefefeffffffffffffffffffffffffffffffffffffffffffebebeb373737000000000000000000585858ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4b4b4020202000000010101cacacafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f18989891c1c1c000000000000000000000000000000000000000000000000000000a1a1a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf000000000000000000e3e3e3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdefefefcbcbcbababab888888858585a1a1a1c2c2c2f6f6f6fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2f2f2f000000818181ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff676767000000000000151515f7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe757575000000000000313131f8f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000767676ffffffffffffffffffffffffffffffffffffffffffffffffffffffbcbcbc0000000000000000000c0c0ce1e1e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd373737000000000000313131fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffececec141414000000000000000000aaaaaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede0b0b0b000000000000787878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa8a8a81a1a1a000000000000000000000000000000000000000000000000000000000000929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000252525fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefed7d7d7565656000000000000000000000000000000000000000000060606464646c4c4c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000262626fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef7979797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a797979f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000000000000000b2b2b2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f3232323000000000000646464ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000777777fffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe3c3c3c0000000000000000007e7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000323232fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffff8181810000000000000000003b3b3bfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f83434340000000000002d2d2df8f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6f0000000000000000000000000000000000000000000000000000001010105b5b5bb7b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd474747000000000000606060fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f06464640303030000000000000000000707072a2a2a2d2d2d101010000000000000000000000000525252ecececffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3010101000000c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c4c4c4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9101010000000000000636363fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c0010101000000000000b5b5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b8b0000000000000000004d4d4dfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000323232fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffd1d1d1000000000000000000080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000000000cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8383830000000000000000000000000000000000000000000909096b6b6bbebebefbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0c0c0c0000000000009a9a9affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef333333000000000000242424a9a9a9dcdcdcfafafafdfdfdfcfcfcf9f9f98080800000000000000000000000001c1c1cdadadafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4343430000006a6a6afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f10606060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b9b9bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3e3e3e000000000000252525fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb676767000000000000141414ecececfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf9f9f9fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfafafafafafafdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef8f8f8fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefbfbfbf9f9f9fafafafdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacacac000000000000000000292929fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf9f9f9fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfafafafafafafbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf9f9f9fafafafdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd373737000000000000333333fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7000000000000000000000000dfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd030303000000000000818181ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8070707000000000000000000000000000000525252cacacafbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb000000000000000000d5d5d5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0353535000000080808828282f7f7f7ffffffffffffffffffffffffffffffffffffffffff5e5e5e000000000000000000000000303030f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b000000141414f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacacac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000767676ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6c6c6c000000000000000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb1a1a1a000000000000494949fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4b4b4b000000272727c2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8989890000001a1a1a8a8a8afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7f7f7f2929290c0c0c0b0b0b3232329a9a9afefefefffffffffffffffffffffffffffffffffffff6f6f64545450000000f0f0fa6a6a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e36161612424240808082f2f2f7b7b7bfafafaffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff919191000000000000000000545454fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8888880000001a1a1a898989ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1c1c11313130c0c0c565656fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0b0b0353535141414000000252525727272f2f2f2ffffffffffffffffffffffffffffffffffffffffff8383830000000303036b6b6bfffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f88282822c2c2c0f0f0f1818185d5d5ddadadafffffffffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000323232fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffd7d7d70000000000000000000d0d0dfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb313131000000000000222222f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff707070000000000000000000000000222222ddddddfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f000000000000020202fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000515151d3d3d3fffffffffffffffffffffffffffffffffffffffffffcfcfc3b3b3b0000000000000000000000007c7c7cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1070707000000afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000545454fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b000000000000000000aaaaaafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefea1a1a10000000000000000009d9d9dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8000000000000000000151515fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffcfcfc262626000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5858580000000000000e0e0e353535080808000000484848fefefeffffffffffffffffffffffffffffffd1d1d1000000000000000000151515fbfbfbffffffffffffffffffffffffffffffffffffffffffd3d3d30d0d0d0000000000001212120c0c0c0000003a3a3aeaeaeaffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5a5a5a000000000000000000909090fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd323232000000000000000000c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6b6b0000000000000000007b7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d0000000000000000003737371717170000001b1b1bdadadafffffffffffffffffffffffffffffffbfbfb1e1e1e000000000000000000c5c5c5fffffffffffffffffffffffffffffffffffffffffff7f7f73131310000000000000202021d1d1d000000151515c4c4c4fffffffffffffffffffffffffffffffffffffffffffdfdfd383838000000000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c0000000000000000004f4f4ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9090900000000000000000009d9d9dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1c1c1c000000000000000000373737fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd565656000000000000272727fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4f4f4f000000000000000000000000202020eeeeeeffffffffffffffffffffffffffffffffffffffffffacacac000000000000000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000555555fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5555550000000e0e0ea4a4a4b7b7b7b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b7b7b7b7b7b7a4a4a4888888202020000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f92b2b2b000000000000101010ecececfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1a1a1a000000000000000000b7b7b7fffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4d4d4d000000000000000000717171ffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8000000000000000000828282fcfcfcf9f9f94c4c4c0000004e4e4efefefefffffffffffffffffffffffffafafa070707000000000000000000b7b7b7fffffffffffffffffffffffffffffffffffffcfcfc3b3b3b000000000000212121eeeeeef1f1f1505050000000414141fcfcfcffffffffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e4030303000000000000323232f8f8f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5f5f5f000000000000000000707070ffffffffffffffffffffffffffffffffffffffffffffffffffffff9393930000000000000000002d2d2dfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffbfbfb171717000000000000404040fcfcfcf9f9f98c8c8c0000001e1e1ee1e1e1fffffffffffffffffffffffffdfdfd494949000000000000000000707070ffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000c7c7c7fbfbfb8c8c8c000000101010e6e6e6fffffffffffffffffffffffffffffffffffffdfdfd363636000000000000323232fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3030300000000000000c0c0cdbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9e9e9101010000000000000222222fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddddd000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1c1c1c0000000000004b4b4bfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb151515000000000000000000000000000000a1a1a1ffffffffffffffffffffffffffffffffffffffffffececec000000000000000000000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b1000000070707efefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f73131310000002b2b2be6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000121212fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f80707070000000000004f4f4ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5b5000000000000000000737373fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4d4d4d000000000000000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000000000323232fcfcfcffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000000000000000919191fffffffffffff9f9f9353535000000919191fffffffffffffffffffffffffdfdfd3b3b3b0000000000000000007c7c7cffffffffffffffffffffffffffffffffffffd1d1d10000000000000000005c5c5cfefefefffffffefefe2a2a2a000000a0a0a0ffffffffffffffffffffffffffffffffffffeeeeee000000000000000000777777fffffffffffffffffffffffffffffffffffffffffffffffff3f3f33f3f3f000000000000181818e0e0e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff959595000000000000000000313131fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffcccccc000000000000000000000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffc5c5c50000000000000000004e4e4efdfdfdfffffffefefe767676000000494949fdfdfdffffffffffffffffffffffff7f7f7f000000000000000000393939fcfcfcfffffffffffffffffffffffffffffffbfbfb1e1e1e000000000000151515fbfbfbffffffffffff6a6a6a0000005b5b5bfdfdfdfffffffffffffffffffffffffffffffdfdfd383838000000000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000040404acacacffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff636363000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c20000000000000000005f5f5ffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f30000000000000000006d6d6dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000000000969696fffffffffffffffffffffffffffffffffffffffffffafafa020202000000000000000000000000222222fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8141414000000979797ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea2c2c2c000000282828e5e5e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000efefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2121210000000000002e2e2efcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb434343000000000000070707e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000000000353535fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000ecececffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a0000000000000000005f5f5ffdfdfdffffffffffffcacaca0000000b0b0beeeeeeffffffffffffffffffffffff757575000000000000000000434343fdfdfdffffffffffffffffffffffffffffffa6a6a60000000000000000005b5b5bfefefeffffffffffffbababa000000242424fbfbfbffffffffffffffffffffffffffffffeeeeee000000000000000000767676fbfbfbfbfbfbfbfbfbfcfcfcfbfbfbfbfbfbfbfbfbaeaeae303030000000050505797979f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece000000000000000000000000e8e8e8fffffffffffffffffffffffffffffffffffffffffffffffffafafa121212000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffafafaf0000000000000000001b1b1bfafafafffffffffffffafafa202020000000b2b2b2ffffffffffffffffffffffffbcbcbc000000000000000000010101f1f1f1ffffffffffffffffffffffffffffffefefef000000000000000000151515fcfcfcffffffffffffececec151515000000d7d7d7fffffffffffffffffffffffffffffffdfdfd383838000000000000343434f9f9f9fbfbfbfbfbfbfcfcfcfbfbfbfbfbfbfbfbfbcecece555555000000000000515151dbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6020202000000000000282828fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a6a60000000000000000009d9d9dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada000000000000000000838383fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb303030000000000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffafafa161616000000000000000000000000000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d6d6d0000003e3e3efdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1373737000000252525e0e0e0fffffffffffffffffffffffffffffffffffffffffffffffff8f8f80b0b0b000000c9c9c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2f2f2f000000000000111111fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccccc0000000000000000005d5d5dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000000000000000000000efefeffffffffffffffffffffffffffffffffffffffffffffffffffafafa0a0a0a000000000000000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b000000000000000000161616fafafafffffffffffffdfdfd5252520000008e8e8effffffffffffffffffffffffb0b0b0000000000000000000000000f0f0f0ffffffffffffffffffffffffffffff959595000000000000000000363636fcfcfcfffffffffffffdfdfd2d2d2d000000c0c0c0ffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000000000000000000000000000000000000000000000242424a0a0a0edededfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa121212000000000000000000a7a7a7fffffffffffffffffffffffffffffffffffffffffffffffffefefe4b4b4b000000000000000000636363ffffffffffffffffffffffffffffffffffffffffffffffffe2e2e2000000000000000000000000c9c9c9ffffffffffffffffff9494940000004a4a4afefefefffffffffffffffffff1f1f1040404000000000000000000afafafffffffffffffffffffffffffffffffdddddd000000000000000000000000eaeaeaffffffffffffffffff727272000000797979fffffffffffffffffffffffffffffffdfdfd383838000000000000000000000000000000000000000000000000000000000000000000080808848484dededefefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000000000000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c60000000000000000008d8d8dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccccc131313000000000000000000888888fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc252525000000000000000000000000000000bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9c9c9000000000000dfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9e9e92323230000001b1b1bd5d5d5fffffffffffffffffffffffffffffffffffffffffffcfcfc3d3d3d000000a2a2a2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3d3d3d000000000000000000f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd474747000000000000010101d4d4d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f90a0a0a000000000000000000abababfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd484848000000000000000000686868ffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000000000000000c3c3c3ffffffffffffffffffacacac000000383838fcfcfcffffffffffffffffffededed000000000000000000000000b4b4b4ffffffffffffffffffffffffffffffaeaeae0000000000000000000a0a0afafafaffffffffffffffffff7a7a7a000000626262fefefeffffffffffffffffffffffffefefef000000000000000000595959bbbbbbbbbbbbbababababababababaacacac5a5a5a010101000000313131a8a8a8fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4c4c4c000000000000000000676767ffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000242424fbfbfbfffffffffffffffffffffffffffffffffffffffffffcfcfc2f2f2f0000000000000000007e7e7effffffffffffffffffededed070707000000e8e8e8fffffffffffffffffffdfdfd3b3b3b0000000000000000006e6e6efffffffffffffffffffffffffffffff3f3f3000000000000000000000000bdbdbdffffffffffffffffffc1c1c10000001f1f1ffafafafffffffffffffffffffffffffdfdfd393939000000000000282828babababbbbbbbababababababababab9b9b97373730c0c0c000000181818878787f5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf0101010000000000002f2f2ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd000000000000000000adadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b2000000000000000000989898ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6989898898989c9c9c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc252525000000000000000000000000000000d0d0d0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb262626000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9121212000000151515cdcdcdffffffffffffffffffffffffffffffffffffffffffd2d2d2b8b8b8dededefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4b4b4b000000000000000000dadadaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeaeae000000000000000000474747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4545450000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000000000292929fcfcfcfffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000000000747474fefefefffffffffffffafafa111111000000e1e1e1fffffffffffffffffffcfcfc343434000000000000000000777777ffffffffffffffffffffffffffffffd4d4d4000000000000000000000000e4e4e4ffffffffffffffffffcbcbcb000000101010fbfbfbffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffc5c5c5131313000000000000535353efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888888000000000000000000292929fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffcccccc000000000000000000000000ddddddffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a000000000000000000313131fbfbfbfffffffffffffefefe535353000000989898ffffffffffffffffffffffff787878000000000000000000343434fdfdfdfffffffffffffffffffffffffcfcfc2020200000000000000000009c9c9cfffffffffffffffffffbfbfb181818000000c5c5c5fffffffffffffffffffffffffdfdfd373737000000000000333333fdfdfdffffffffffffffffffffffffffffffffffffe9e9e93838380000000000002b2b2bd1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5656560000000000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece000000000000000000828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e9e9e000000000000000000a3a3a3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9121212000000000000000000000000000000f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484840000001f1f1ffcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c40404040000000c0c0cbcbcbcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe595959000000000000000000cfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9222222000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8383830000000000000000002e2e2efcfcfcffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7000000000000000000000000e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffff878787000000000000000000202020fafafaffffffffffffffffffccccccc6c6c6ffffffffffffffffffffffffffffff6e6e6e0000000000000000003d3d3dfdfdfdffffffffffffffffffffffffc9c9c9000000000000000000000000e7e7e7ffffffffffffffffffffffffd6d6d6cbcbcbffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffd0d0d0040404000000000000393939fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8000000000000000000000000e4e4e4fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1414140000000000000000009c9c9cffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000000000000000d2d2d2ffffffffffffffffffe2e2e2bdbdbdfcfcfcffffffffffffffffffffffffb4b4b4000000000000000000020202f0f0f0fffffffffffffffffffffffffafafa1313130000000000000000009e9e9effffffffffffffffffffffffecececc1c1c1fcfcfcfffffffffffffffffffffffffdfdfd373737000000000000333333fdfdfdfffffffffffffffffffffffffffffffffffffffffff3f3f32d2d2d0000000000000d0d0ddcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddddd0101010000000000000a0a0af2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f3010101000000000000585858ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000aeaeaefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f60000000000000000000000000000004e4e4effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000c5c5c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4a4a4000000000000050505a9a9a9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe676767000000000000000000c5c5c5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe888888000000000000000000545454ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000000000000000000000ebebebfffffffffffffffffffffffffffffffffffffffffffffffffafafa0b0b0b000000000000000000a5a5a5ffffffffffffffffffffffffffffffffffffffffffffffffdddddd000000000000000000000000c1c1c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000000000060606fbfbfbffffffffffffffffffffffff6d6d6d0000000000000000001b1b1bfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffff646464000000000000000000868686fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0f0f0f000000000000000000a4a4a4fffffffffffffffffffffffffffffffffffffffffffffffffdfdfd505050000000000000000000606060fefefefffffffffffffffffffffffffffffffffffffffffffcfcfc2727270000000000000000007a7a7affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef010101000000000000000000b4b4b4ffffffffffffffffffffffffb1b1b1000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd383838000000000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffa9a9a9000000000000000000414141fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a000000000000000000626262fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe2929290000000000002d2d2dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a000000000000000000b9b9b9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbcbcbc000000000000000000000000000000c5c5c5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4242420000006d6d6dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000888888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff707070000000000000000000bfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8060606000000000000010101e0e0e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6060606000000000000000000adadadfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd484848000000000000000000686868fffffffffffffffffffffffffffffffffffffffffffffffffdfdfd383838000000000000000000696969ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7000000000000000000000000bababaffffffffffffe4e4e46464640000000000000000000000009b9b9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9f0000000000000000003f3f3ffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4c4c4c000000000000000000686868ffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b8b000000000000000000232323fbfbfbffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000000000222222fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc353535000000000000000000737373fffffffffffff5f5f58a8a8a0c0c0c000000000000000000575757fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd373737000000000000333333fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000f2f2f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f10a0a0a000000000000000000c2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b5b5b000000000000040404f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000b0b0b0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe646464000000000000000000000000818181ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000151515fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5d5d5d000000000000000000636363fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe646464000000000000000000d0d0d0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb6262620000000000000000006b6b6bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd454545000000000000000000707070ffffffffffffffffffffffffffffffffffffffffffffffffffffff8484840000000000000000002d2d2dfcfcfcffffffffffffffffffffffffffffffffffffffffffffffff848484000000000000000000141414f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2d2d2d0000000000000000005c5c5cb3b3b3696969060606000000000000000000000000949494ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee0000000000000000007a7a7affffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb000000000000000000242424fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8989890000000000000000002c2c2cfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffcacaca000000000000000000000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb000000000000000000000000c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7171710000000000000000002a2a2ab7b7b7848484181818000000000000000000000000565656fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd383838000000000000343434fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffcfcfc010101000000000000000000dadadaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9a9a9a000000000000000000262626fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a6a6000000000000000000d0d0d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3030303000000000000000000656565fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed070707000000b7b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f73d3d3d0000000000000000004b4b4bfafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe545454000000000000000000e3e3e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbababa000000000000000000080808eeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff838383000000000000000000343434fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000000000000000010101edededffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8000000000000000000000000bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff696969000000000000000000000000000000000000000000000000000000414141bcbcbcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000797979ffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b0000000000000000004c4c4cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcacaca000000000000000000000000edededfffffffffffffffffffffffffffffffffffffffffffffffffafafa111111000000000000000000a1a1a1fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1f1f1f000000000000000000737373ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf0000000000000000000000000000000000000000000000000000002c2c2c909090fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd383838000000000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000000000090909fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3e3e3e000000000000000000858585fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa171717000000000000838383ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929292000000000000000000999999fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdc2c2c21e1e1e000000000000030303969696fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5252520000005f5f5ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf1212120000000000000000004b4b4bfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd454545000000000000000000f8f8f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6111111000000000000000000919191ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000000000000000020202f1f1f1fffffffffffffffffffffffffffffffffffffffffffffffff8f8f80b0b0b000000000000000000abababfffffffffffffffffffffffffffffffffffffffffffffffffcfcfc282828000000000000000000787878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a5000000000000000000000000000000000000525252aeaeaee3e3e3fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000767676fffffffffffffffffffffffffffffffffffffffffffffffffefefe3f3f3f000000000000000000a6a6a6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb101010000000000000000000aaaaaafffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4d4d4d000000000000000000656565ffffffffffffffffffffffffffffffffffffffffffffffffffffff6c6c6c000000000000000000343434fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffececec0000000000000000000000000000000000003030309c9c9ccfcfcffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000323232fdfdfdffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000616161ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6000000000000000000010101e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7777770000000000001b1b1bf9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a6a60000000000000000008d8d8dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeaeae7979797979796969695555554242420303030000000000002f2f2fc2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffababab0000000b0b0bf5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b70000000000000000000000005b5b5bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3535350000000000000d0d0dfafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc6060600000000000000000003e3e3efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d0d0cfcfcffffffffffffffffffffafafa0c0c0c000000000000000000b3b3b3fffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4646460000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffff7575750000000000000000003a3a3afdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e40000000000000000000000002c2c2c000000161616d3d3d3fffffffffffffffffffffffffffffffffffffffffffffffffefefeffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000727272ffffffffffffffffffffffffffffffffffffffffffffffff9797970000000000000000003e3e3efcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e4c2c2c2fefefefffffffffffffdfdfd4f4f4f0000000000000000006e6e6effffffffffffffffffffffffffffffffffffffffffffffffffffff8989890000000000000000002b2b2bfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffbababa000000000000000000000000edededfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3131310000000000000000002020200a0a0a010101a3a3a3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3838380000000000002d2d2dfefefeffffffffffffffffffffffffffffffffffffffffffd1d1d10c0c0c000000000000131313ddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000000000444444fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000000000a7a7a7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000828282fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4d4d4d000000000000000000000000000000000000474747f4f4f4fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5101010000000a7a7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4040400000000000000000000000008e8e8efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2525250000000000001f1f1ffbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadad000000000000000000000000e9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000bebebefffffffffffffdfdfd444444000000000000000000676767ffffffffffffffffffffffffffffffffffffffffffffffffffffff848484000000000000000000292929fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffb0b0b0000000000000000000080808fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb292929000000000000000000717171b6b6b60f0f0f151515cacacaffffffffffffffffffffffffffffffffffffc6c6c6525252666666cdcdcdfffffffffffffffffffcfcfcf5f5f5cccccc969696000000000000000000414141f3f3f3fbfbfbfbfbfbfbfbfbfbfbfbfcfcfceaeaea8b8b8b010101000000000000353535eeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000787878ffffffffffffffffff888888000000000000000000292929fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8000000000000000000000000d8d8d8fffffffffffffffffffffffffffffffffffffffffffffffff9f9f9000000000000000000000000b7b7b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6e6e6e0000000000000000002d2d2ddbdbdb303030010101999999ffffffffffffffffffffffffffffffffffffe9e9e96c6c6c505050aaaaaafdfdfdfffffffffffffdfdfdfafafad9d9d9b9b9b9141414000000000000121212dcdcdcfcfcfcfbfbfbfcfcfcfbfbfbfbfbfbf7f7f7a9a9a91d1d1d000000000000151515c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb232323000000000000000000888888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5959590000000000003d3d3dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e30000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4b4b47979796d6d6d4343430707070000000000000000002b2b2bb6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6464640000004f4f4ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c60000000000000000000000000b0b0be7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa151515000000000000303030fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f20808080000000000000000008e8e8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6c6c6c0000006d6d6dffffffffffffffffff808080000000000000000000000000bebebeffffffffffffffffffffffffffffffffffffffffffffffffb8b8b80000000000000000000000007a7a7affffffffffffffffffffffffffffffffffffffffffffffffd9d9d9000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe656565000000000000000000383838fcfcfcd9d9d92525250b0b0bbababaffffffffffffffffffffffffcfcfcf000000000000000000000000999999fffffffdfdfd3030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000606067d7d7dfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b3000000292929fcfcfcffffffffffffc8c8c80000000000000000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffafafa0000000000000000000000003a3a3afcfcfcfffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000898989ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffababab000000000000000000000000ebebebf2f2f24d4d4d0000007f7f7ffffffffffffffffffffffffffafafa202020000000000000000000525252fefefeffffff757575000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000545454e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7000000000000000000000000cfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0060606000000000000d0d0d0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0606060000000000004a4a4afdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef2f2f28b8b8b000000000000000000000000848484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbebebe000000040404e9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd333333000000000000000000000000747474fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa010101000000000000575757fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5252520000000000000000003b3b3bfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbcbcbc000000272727fbfbfbffffffffffffbbbbbb0000000000000000000000001c1c1ceaeaeaffffffffffffffffffffffffffffffffffffffffffd0d0d0000000000000000000000000000000bebebefffffffffffffffffffffffffffffffffffffffffffafafa000000000000000000000000bdbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1a1a1000000000000000000000000f2f2f2ffffffe6e6e62a2a2a0000009f9f9fffffffffffffffffffa6a6a6000000000000000000000000111111fbfbfbfefefe9494947c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b7b7c7c7c989898e2e2e2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0e0e0e000000dbdbdbfffffffffffffafafa070707000000000000000000000000bdbdbdfffffffffffffffffffffffffffffffffffffffffffcfcfc1b1b1b0000000000000000000000007d7d7dfefefefffffffffffffffffffffffffffffffffffffdfdfd4c4c4c000000000000000000767676ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8000000000000000000000000afafaffffffffbfbfb5a5a5a000000616161fdfdfdffffffffffffeeeeee000000000000000000000000000000c3c3c3ffffffb8b8b87c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b7b8a8a8acacacaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6f0000000000000000001a1a1afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000000000414141fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000000000252525fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff999999000000000000000000000000909090fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb202020000000929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000000000131313f5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9000000000000000000949494ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0a0a0000000000000000000000000e4e4e4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1a1a1a000000d4d4d4ffffffffffffe8e8e8000000000000000000000000000000484848fafafaffffffffffffffffffffffffffffffffffffd0d0d00000000000000000000000000000001b1b1bd9d9d9fffffffffffffffffffffffffffffffffffffcfcfc1a1a1a000000000000000000dcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000b8b8b8ffffffffffffe9e9e92f2f2f0000007e7e7effffffffffffd7d7d7000000000000000000000000000000d0d0d0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5d5d5d0000008c8c8cfffffffffffffdfdfd313131000000000000000000000000191919d8d8d8fffffffffffffffffffffffffffffffffffffbfbfb1c1c1c000000000000000000000000000000aaaaaafffffffffffffffffffffffffffffffffffffefefe606060000000000000000000979797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2d2d2d000000000000000000717171fffffffffffffdfdfd616161000000444444f1f1f1fffffffbfbfb2828280000000000000000000000008a8a8affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2020200000000000000000005d5d5dfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f42424240000000000008e8e8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff626262000000000000020202f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb393939000000000000000000000000b8b8b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b7b0000003b3b3bfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddddddb9b9b9b9b9b9e0e0e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000000000c2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000000000000000d4d4d4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e50000000000000000000000008c8c8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff717171000000656565fefefefffffff9f9f90000000000000000000d0d0d242424000000474747f8f8f8fefefeffffffffffffffffffffffffaaaaaa0000000000000000004040406969690000001b1b1bd5d5d5fdfdfdffffffffffffffffffffffffebebeb000000000000000000171717fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000787878fffffffffffffffffff0f0f0464646000000595959fdfdfdffffff898989000000000000000000000000c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b8000000252525fbfbfbfffffffdfdfd3d3d3d0000000000000000003232320000001a1a1ad4d4d4fdfdfdffffffffffffffffffffffffeaeaea0000000000000000000000009e9e9e000000000000a6a6a6fcfcfcfffffffffffffffffffffffffbfbfb3b3b3b000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a000000000000000000353535fcfcfcffffffffffffffffff7d7d7d0000002c2c2ce0e0e0ffffffbcbcbc1111110000000000000000007d7d7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece000000000000000000000000a1a1a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece050505000000070707d7d7d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000000000000000d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa9a9a90000000000000000000000003e3e3efcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede000000000000dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c0070707000000000000080808c1c1c1ffffffffffffffffffffffffffffffffffffffffffffffffebebeb000000000000000000000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff636363000000000000191919fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000424242ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e50c0c0c000000b4b4b4fefefea9a9a9000000000000000000636363ececec3232320000002323239c9c9cf6f6f6fafafaffffffe8e8e8373737000000000000000000a1a1a1ffffff7676760000000c0c0c7b7b7be7e7e7f9f9f9fefefefafafa6c6c6c0000000000000000008b8b8bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6262620000000000000000003c3c3cfdfdfdfffffffffffffffffffcfcfc6b6b6b0000001c1c1c919191ecececd0d0d0424242000000000000eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3f3f3f000000757575fcfcfce5e5e50a0a0a000000000000202020fcfcfc6464640000000a0a0a797979e6e6e6f9f9f9fefefefafafa6f6f6f000000000000000000595959ffffffb2b2b20a0a0a000000575757d0d0d0f8f8f8fcfcfcfcfcfcb0b0b0000000000000000000494949fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa8a8a8000000000000000000000000f0f0f0ffffffffffffffffffffffffa5a5a5090909090909727272dadadae9e9e96d6d6d000000000000a3a3a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282000000000000000000000000e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000000000303030fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada0000000000000000009d9d9dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb7a7a7a828282bdbdbdfefefefffffffffffffffffffffffffffffffffffff4f4f4000000000000000000000000000000bfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3939390000007c7c7cfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3a3a3a0000000000000000000000002f2f2ffcfcfcfffffffffffffffffffffffffffffffffffffffffff7f7f70000000000000000000000000000008b8b8bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2a2a2a000000000000565656fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5e5e5e000000000000000000060606f8f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a30000000000002a2a2a0000000000000000000f0f0fe2e2e2fffffff2f2f25353530000000000000707072424243838380808080000000000000000003c3c3cfefefeffffffffffffafafaf1616160000000000001c1c1c3838381414140000000000000000004f4f4ffcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0a0a0000000000000000000000000f9f9f9fffffffffffffffffffffffffdfdfd9b9b9b000000000000000000313131000000000000464646fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb1111110000001f1f1f0e0e0e000000000000000000abababffffffffffff8484840000000000000000001c1c1c383838141414000000000000000000161616dadadaffffffffffffd5d5d53535350000000000001414143434342929290000000000000000001f1f1fe5e5e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7000000000000000000000000b1b1b1ffffffffffffffffffffffffffffffcbcbcb2020200000000000002929290d0d0d0000000e0e0eedededffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000000000000000323232fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a4a4a0000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb202020000000000000646464fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e5101010000000000000000000797979fefefefffffffffffffffffffffffffffffffbfbfb1515150000000000000000000000006c6c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939393000000202020fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffff4f4f4010101000000000000000000000000000000f2f2f2ffffffffffffffffffffffffffffffffffffffffffe2e2e20000000000000000000000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb000000000000000000929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff969696000000000000000000000000bcbcbcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1a1a1151515000000000000000000343434d1d1d1ffffffffffffffffffffffffbebebe5353531313130000000000000000000000001f1f1f939393ffffffffffffffffffffffffffffffe8e8e87d7d7d2222220000000000000000000000000f0f0f959595fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000b7b7b7ffffffffffffffffffffffffffffffffffffdadada4747470000000000000000002c2c2cdcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece333333000000000000000000181818a6a6a6ffffffffffffffffffffffffdfdfdf6b6b6b2828280000000000000000000000000c0c0c6e6e6eecececfffffffffffffffffffffffffcfcfc9b9b9b3a3a3a000000000000000000000000000000696969eeeeeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2d2d2d000000000000000000717171fffffffffffffffffffffffffffffffffffff2f2f27272720101010000000000000f0f0fb0b0b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f00000000000000000000000006a6a6afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f32727270000000101019e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6e6e6e000000000000292929fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000000000000000000000dcdcdcfffffffffffffffffffffffffffffffcfcfc303030000000000000000000000000424242fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee040404000000c3c3c3fffffffffffffffffffffffffffffffffffffffffffffffff1f1f10000000000000000000000000000000b0b0bfafafaffffffffffffffffffffffffffffffffffffffffffc9c9c9000000000000000000000000000000bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeaeae000000000000000000d2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd1d1d10000000000000000000000007b7b7bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbc7c7c7cacacae8e8e8fdfdfdfffffffffffffffffffffffffffffffffffffffffffcfcfce4e4e4c3c3c3b8b8b8c4c4c4fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffdfdfde8e8e8c8c8c8c3c3c3dededefbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000787878fffffffffffffffffffffffffffffffffffffffffffefefee7e7e7c5c5c5d5d5d5fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcd7d7d7c2c2c2e0e0e0fcfcfcfffffffffffffffffffffffffffffffffffffffffffdfdfdf1f1f1cdcdcdb8b8b8bababafafafafffffffffffffffffffffffffffffffffffffffffffffffffefefef3f3f3d1d1d1bebebed6d6d6fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a000000000000000000343434fcfcfcfffffffffffffffffffffffffffffffffffffffffff1f1f1cfcfcfc5c5c5f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbababa000000000000000000000000979797ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e82d2d2d0000000000007c7c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6000000000000000000d9d9d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd525252000000000000000000000000000000abababfffffffffffffffffffffffffffffffefefe4b4b4b000000000000000000000000272727fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4f4f4f000000686868fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc1d1d1d0000000000000000000000005a5a5afefefeffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000000000060606f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000000000333333fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f81212120000000000000000003c3c3cfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff616161000000000000000000383838fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa8a8a8000000000000000000000000edededffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848484000000000000000000000000c6c6c6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2454545000000000000676767fffffffdfdfde8e8e8bdbdbdb9b9b9bababae0e0e0fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc363636000000000000737373ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff656565000000000000000000000000030303d6d6d6fffffffffffffffffffffffffffffffdfdfd3d3d3d0000000000000000000000005e5e5efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa9a9a9000000101010f7f7f7fffffffffffffffffffffffffffffffffffffffffffefefe424242000000000000101010656565f3f3f3ffffffffffffffffffffffffffffffffffffffffffededed0f0f0f0000000000000000000000004a4a4afdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa232323000000000000a8a8a8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa4d4d4d000000000000000000030303f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000000000000000030303f2f2f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8000000000000000000000000b0b0b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd505050000000000000000000010101f3f3f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6d6d6d000000000000595959636363000000000000000000000000000000545454f6f6f6ffffffffffffffffffffffffffffffffffffffffffb2b2b2000000000000181818f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8686860000000000000000000e0e0e828282fffffffffffffffffffffffffffffffffffffafafa131313000000000000000000000000a0a0a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f50f0f0f000000aeaeaeffffffffffffffffffffffffffffffffffffffffffffffffababab000000000000c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b7b000000000000000000000000000000c5c5c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b2000000000000252525fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc7c7c7c000000000000000000000000bebebeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e1000000000000000000000000b7b7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2d2d2d000000000000000000707070ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1b1b1b0000000000000000002a2a2afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b31212120000000000000000000000000000000000000000000000007c7c7cfffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000000000acacacffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e51717170000000a0a0ac8c8c8ffffffffffffffffffffffffffffffffffffffffffdedede000000000000000000000000272727f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff676767000000555555fefefefffffffffffffffffffffffffffffffffffffffffffefefe626262000000262626dededeffffffffffffffffffffffffffffffffffffffffffaaaaaa050505000000000000000000000000626262fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc4a4a4a000000000000989898ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e9e9e000000000000000000000000919191fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000787878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6b6b000000000000000000353535fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000000000565656fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5c5c5000000000000000000000000000000000000000000060606b3b3b3ffffffffffffffffffffffffffffffffffffffffffffffffc7c7c70000000000002d2d2dfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbebebe0101010000005c5c5cefefeffffffffffffffffffffffffffffffff0f0f0383838000000000000000000010101c5c5c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3000000070707eeeeeefffffffffffffffffffffffffffffffffffffffffffffffff3f3f32222220000000e0e0e9a9a9afcfcfcfefefefffffffcfcfcfafafa9c9c9c020202000000000000000000000000444444fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d90000000000001a1a1af6f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000636363fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6363630000000000000000003c3c3cfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000000000030303f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdb4b4b4828282585858464646787878b4b4b4fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf000000000000000000000000838383ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa9a9a9000000383838b5b5b58282827b7b7b9b9b9bc5c5c5fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe545454000000000000aaaaaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9393930000000000000b0b0b4c4c4c7a7a7aa0a0a0a8a8a87373732d2d2d0000000000000000001c1c1cb9b9b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2424240000009d9d9dffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d32f2f2f0000000000002525255d5d5d6e6e6e4444441919190000000000000000000000000404047e7e7ef9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe707070000000000000888888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb000000000000000000000000373737fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a3000000000000000000020202f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000000000000000b1b1b1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf4040400000000000001313133232323d3d3d1f1f1f2a2a2acececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff979797000000000000000000000000b1b1b1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000494949fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdcdcdc060606000000232323f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d34a4a4a000000000000000000000000000000000000000000000000040404585858eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000004a4a4afdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9808080050505000000000000000000000000000000000000000000000000363636d4d4d4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece080808000000373737f7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9181818000000000000000000090909fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7000000000000000000000000bababafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc323232000000000000000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b70c0c0c000000060606b6b6b6fbfbfbfdfdfdfefefef6f6f6585858151515eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6f000000000000000000000000d4d4d4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa9a9a9000000303030fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909090000000000000787878fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdc5c5c58f8f8f6b6b6b4747473d3d3d3c3c3c5c5c5ca9a9a9eeeeeefdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d68f8f8f5d5d5d2e2e2e0707072f2f2f575757818181b3b3b3fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f12323230000001f1f1fe9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3d3d3d000000000000000000000000d8d8d8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2b2b2b0000000000000000007e7e7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6f0000000000000000003a3a3afdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6131313000000030303b6b6b6fffffffffffffffffffffffffffffff6f6f6272727555555fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4a4a4a000000000000000000000000f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000c0c0cfafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe565656000000040404c6c6c6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfbfbfbfbfcfcfcfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4a4a4a0000008b8b8bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfcfbfbfbfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5252520000000d0d0dd4d4d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe616161000000000000000000000000aaaaaafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfb464646000000000000000000444444fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfc898989000000000000000000040404f5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4848480000000000004c4c4cfefefeffffffffffffffffffffffffffffffffffff969696000000e1e1e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2727270000000000000000000c0c0cfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4f3a3a3afdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f83d3d3d0000001b1b1be9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a30000002c2c2cfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000020202b9b9b9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000000000848484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbababa3e3e3e2d2d2d0d0d0d0000000000000000000000000c0c0cfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8454545353535151515000000000000000000000000000000bebebeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d5d5000000000000000000abababfffffffffffffffffffffffffffffffffffffffffff5f5f5bababafcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa080808000000000000000000242424fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f02f2f2f000000424242fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f20e0e0e000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf070707000000979797ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a3000000000000000000000000676767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a3000000000000000000000000000000000000000000000000cacacaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea000000000000000000000000000000000000000000000000838383ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a5000000000000000000e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e10000000000000000000000003b3b3bfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0555555000000777777fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe656565000000aaaaaafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7212121010101939393ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b80000000000000000000000004a4a4afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f14848483939392222220b0b0b0000000000000000000000009b9b9bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6d6d6d3b3b3b282828121212000000000000000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000000000040404fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c0000000000000000000000000535353fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefebbbbbbe9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefecececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbcececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000002f2f2ffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfbfbfbfbfbfbfafafae0e0e0cfcfcfbfbfbffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2acacac8989896b6b6b4a4a4a4b4b4b646464868686bfbfbff6f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8b2b2b28e8e8e6f6f6f4f4f4f474747606060808080bababaf2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefee6e6e6b2b2b28181815252523c3c3c3c3c3c535353aeaeaef8f8f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfbfbfbf7f7f7e5e5e5d4d4d4c2c2c2e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7272723d3d3d4545454b4b4b5353535959596161616868686f6f6f7979797979797979797979797a7a7a7979797a7a7a7979796666664f4f4f4c4c4cfdfdfdffffffffffffffffffffffffffffffffffffffffffffffff6161610000000000001a1a1afdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0a0a00000000000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2e2e2000000000000000000000000121212fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f79595951a1a1a0000000000000000000000000000000000000000000000001515158b8b8bf7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f77e7e7e4747476d6d6de7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfba9a9a92727270000000000000000000000000000000000000000000000000b0b0b787878f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5353534141414848485050505858585f5f5f6767676e6e6e7979797979797a7a7a6c6c6c6363635a5a5a5151514848483f3f3f858585fffffffffffffffffffffffffffffffafafa3c3c3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3c3ce3e3e3fffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f56969690000000000000000000000000000000000000000000000001a1a1a959595fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe464646000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adadadffffffffffffffffffffffffffffffffffffffffffffffff8e8e8e000000000000030303fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff838383000000000000000000000000838383fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7000000000000000000000000000000f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c62222220000000000000202022323234646466c6c6c5a5a5a262626000000000000000000000000242424ccccccfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3d3d3d000000000000000000171717eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffdadada3333330000000000000000001e1e1e4141416464646767672e2e2e020202000000000000000000171717b9b9b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1f1f1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000626262fefefefffffffffffffffffffffffff9f9f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffcccccc2626260000000000001a1a1a5252527272727a7a7a656565050505000000000000000000363636eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf3d3d3d3d3d3d2f2f2f1d1d1d0909090000000000000000000000000000000000000000000000000000002e2e2e3d3d3d3c3c3c3c3c3c3c3c3cb7b7b7ffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf000000000000000000dfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d6d6d0000000000000000000000009a9a9afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8151515000000000000000000000000d2d2d2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d3111111000000000000626262eaeaeafbfbfbfdfdfdfffffffffffffbfbfba8a8a8000000000000000000000000040404b9b9b9ffffffffffffffffffffffffffffffffffffffffffffffffa8a8a8000000000000000000000000000000797979ffffffffffffffffffffffffffffffffffffffffffe6e6e6232323000000000000515151dededefbfbfbfdfdfdfffffffffffffcfcfcc4c4c4090909000000000000000000000000999999fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc5454543d3d3d3d3d3d3c3c3c3a3a3a0606060000000000000000000000000000000000001f1f1f3d3d3d3c3c3c3c3c3c3c3c3c868686fffffffffffffffffffffffffffffffcfcfc3030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e7e7effffffffffffffffffffffffffffffffffffffffffdfdfdf0b0b0b0000000d0d0d9b9b9bf4f4f4fbfbfbfffffffdfdfdfafafadadada3535350000000000000000001e1e1ee6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefefdfdfdfcfcfcfcfcfcefefefbdbdbd1515150000000000000000000000006b6b6bfbfbfbfbfbfbfcfcfcfdfdfdfdfdfdfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0010101000000000000bfbfbffffffffffffffffffffffffffffffffbfbfbbbbbbbcbcbcbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe595959000000000000000000000000b4b4b4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f92a2a2a000000000000000000000000bdbdbdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7e7e7edcdcdcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcdadada8888886262624646465252527777779a9a9adbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e11d1d1d0000000e0e0ec6c6c6fefefeffffffffffffffffffffffffffffffffffffffffff8e8e8e0000000000000000000000000c0c0cd7d7d7ffffffffffffffffffffffffffffffffffffffffff7d7d7d000000000000000000000000000000555555fdfdfdfffffffffffffffffffffffffffffff0f0f0303030000000020202a9a9a9fdfdfdffffffffffffffffffffffffffffffffffffffffffaeaeae000000000000000000000000030303bcbcbcfffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfdfdfdfefefefdfdfd6666660000000000000000000000009c9c9cfbfbfbfcfcfcfefefefdfdfdfefefefefefeffffffffffffffffffffffffffffffffffffe3e3e31a1a1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a5a5afefefefffffffffffffffffffffffffffffffdfdfd4f4f4f0000001f1f1fd3d3d3fffffffffffffffffffffffffffffffffffffffffff3f3f3393939000000000000000000444444fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff676767000000000000000000000000656565fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe616161000000000000696969ffffffffffffffffffffffffffffff5b5b5b000000000000979797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd444444000000000000000000000000c3c3c3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa3f3f3f000000000000000000000000afafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2323237f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdb7b7b73636360000000000000000000000000000000000000000000a0a0a999999fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6b6b000000000000000000181818b6b6b6fffffffffffffffffffffffffffffffffffffffffffefefe484848000000000000000000000000242424efefefffffffffffffffffffffffffffffffffffffb4b4b4000000000000000000000000000000828282ffffffffffffffffffffffffffffffffffff9090900000000000000000000f0f0f9a9a9affffffffffffffffffffffffffffffffffffffffffffffff6b6b6b000000000000000000000000111111dbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c5c5c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7040404000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000383838fcfcfcffffffffffffffffffffffffffffffa9a9a9000000040404c6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede0000000000000000000000008c8c8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeaeae000000000000000000000000232323fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed1a1a1a000000010101d2d2d2fffffffffffffffffff5f5f50000000000000000003d3d3dfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc303030000000000000000000000000cbcbcbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa4c4c4c000000000000000000000000a0a0a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2d2d2d3a3a3afcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada494949000000000000000000000000000000000000000000000000000000000000000000535353f5f5f5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3232320000000000000000000000000d0d0de7e7e7ffffffffffffffffffffffffffffffffffffffffffa8a8a80000000000000000000000000000008a8a8afffffffffffffffffffffffffffffffffffffefefe6767670000000000000000002c2c2cf1f1f1fffffffffffffffffffffffffffffffefefe555555000000000000000000000000030303cbcbcbffffffffffffffffffffffffffffffffffffffffffcecece000000000000000000000000000000676767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e9e9e000000040404a0a0a0d5d5d5e5e5e5f6f6f6f8f8f8f8f8f8f8f8f8f9f9f9f8f8f8f8f8f8e5e5e5c9c9c94a4a4a000000151515fbfbfbfffffffffffffffffffffffffdfdfd4242420000002d2d2da3a3a3f4f4f4fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3f3f3f000000000000000000070707e0e0e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef000000000000000000000000000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb9b9b90707070000002f2f2fe1e1e1fefefefffffffcfcfc1d1d1d000000000000656565fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1b1b1b000000000000000000000000d4d4d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb535353000000000000000000000000939393fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe494949000000e0e0e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc9090900909090000000000000000000c0c0c5c5c5c9f9f9fe8e8e8d4d4d4a4a4a46b6b6b111111000000000000595959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffe1e1e1000000000000000000000000000000565656fefefefffffffffffffffffffffffffffffffffffffefefeb8b8b8838383afafaff9f9f9fffffffffffffffffffffffffffffffffffffbfbfb181818000000000000000000000000000000818181fffffffffffffffffffffffffffffffffffffffffffbfbfb0a0a0a000000000000000000000000333333fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000141414c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b2000000000000efefeffffffffffffffffffffffffffbfbfb131313000000000000000000202020f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffff878787000000000000000000000000717171ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc353535000000000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d0d01f1f1f000000111111545454747474575757212121000000131313dbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea4949493d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d898989fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0d0d0d000000000000000000000000dbdbdbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc5a5a5a000000000000000000000000848484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939393000000333333f3f3f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefea5a5a52121210000000000000000002a2a2a909090f3f3f3fffffffffffffffffffffffffffffffffffff0f0f0868686000000000000969696ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9e9e9000000000000000000000000000000000000aeaeaefffffffffffffffffffffffffffffffffffffffffff8f8f8000000000000000000000000000000222222fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb0f0f0f0000000000000000000000000000008a8a8afffffffffffffffffffffffffffffffffffffffffffbfbfb1d1d1d000000000000000000000000040404f5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c8c8c8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7171710000000b0b0bb6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef000000000000cbcbcbffffffffffffffffffffffffdedede000000000000000000000000000000898989ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b60000000000000000000000001d1d1dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff717171000000000000000000000000666666fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f07474744646461c1c1c0505051d1d1d353535838383eeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c2c2cfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa080808000000000000000000000000e2e2e2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc6060600000000000000000000000007b7b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea0b0b0b000000434343e1e1e1fffffffffffffffffffffffffffffffffffffffffffefefec7c7c73737370000000000000000001a1a1a9e9e9efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2a2a20000001c1c1cfbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc414141000000000000000000000000151515ecececfffffffffffffffffffffffffffffffffffffffffffafafa0c0c0c000000000000000000000000000000e7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd636363000000000000000000000000070707d5d5d5fffffffffffffffffffffffffffffffffffffffffffcfcfc303030000000000000000000000000000000c1c1c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c8c8c8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe7d7d7d000000030303a8a8a8fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2d2d2d000000a8a8a8ffffffffffffffffffffffffc2c2c2000000000000000000000000000000686868ffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000000000e3e3e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b1000000000000000000000000292929fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcbb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e3e3e3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa030303000000000000000000000000ebebebfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd676767000000000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282000000000000070707787878d0d0d0fafafafdfdfdfbfbfbfafafab1b1b1484848000000000000000000000000717171f2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe505050000000e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e43434340000000000001c1c1cc4c4c4fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb171717000000000000000000000000000000c8c8c8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f34d4d4d0000000000000f0f0fabababfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3c3c3c000000000000000000000000000000a3a3a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000c9c9c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5c5c5c000000000000979797fffffffffffffffffffffffffffffffffffffffffffefefe5e5e5e000000848484ffffffffffffffffffffffffe6e6e60202020000000000000000000000009b9b9bffffffffffffffffffffffffffffffffffffffffffffffffd3d3d3000000000000000000000000000000c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2030303000000000000000000000000e7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9000000000000000000000000000000f3f3f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6d6d6d000000000000000000000000727272ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff454545000000000000000000000000000000303030272727090909000000000000000000000000202020c1c1c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000b3b3b3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbd5d5d5cbcbcbf7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb151515000000000000000000000000000000e8e8e8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfddcdcdcc6c6c6f3f3f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc393939000000000000000000000000000000c1c1c1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cacacafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa4242420000000000008d8d8dfffffffffffffffffffffffffffffffffffffffffffbfbfbf8f8f8fbfbfbffffffffffffffffffffffffffffff7e7e7e000000000000000000454545fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffe2e2e2000000000000000000000000000000b2b2b2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc383838000000000000000000000000a5a5a5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4000000000000000000000000000000fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafe9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7373730000000000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafc3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8383830808080000000000000000000000000000000000000000000000000707076c6c6cf1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb0000008d8d8dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7020202000000000000000000000000131313fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa252525000000000000000000000000000000e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cbcbcbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2282828000000000000717171fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf848484a9a9a9fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea000000000000000000000000000000c8c8c8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4b4b4afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafc2c2c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000000000000000000000696969ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff484848000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a0000000000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8282820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d3d3dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb8888882121210000000000000000000000003636367e7e7ee8e8e8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc1f1f1faeaeaeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddddd000000000000000000000000000000797979fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f70b0b0b000000000000000000000000575757ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cbcbcbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada1616160000000000005a5a5afafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb000000000000000000000000000000f2f2f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b3b3bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0b0b00000000000000000000000002b2b2bfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed0000000000000000000000000d0d0dfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff484848000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d7d7d0000000000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8282820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d3d3dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafacbcbcbb9b9b9d1d1d1f9f9f9fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff999999000000000000000000000000171717e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd000000000000000000000000080808d2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c70808080000000000003c3c3ceeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000001e1e1efbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b3b3bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed010101000000000000000000000000e7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f40000000000000000000000000d0d0dfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff707070363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636c6c6c6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7575750000000000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636676767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000000000000000000000bdbdbdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5c5c5c0000000000000000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4a4a4000000000000000000252525dbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4b4b4000000000000000000000000444444fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff434343363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636666666ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc343434000000000000000000000000a6a6a6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb0000000000000000000000000b0b0bfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6e6e6e000000000000000000000000737373ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d7d7ddadadafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfddbdbdb8989896161614545455e5e5e929292cbcbcbfbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd8f8f8f0000000000000000000d0d0db0b0b0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeb4b4b4000000000000000000030303999999ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cececeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000171717d7d7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8e8e000000000000000000000000a1a1a1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff727272000000000000000000000000676767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfdfdfdfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfdfdfdfdfdfdfdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb080808000000000000000000050505fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe666666000000000000000000000000787878fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2323237d7d7dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeb8b8b8363636000000000000000000000000000000000000000000262626bdbdbdfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefdfdfdfcfcfcf8f8f87d7d7d030303000000000000242424d3d3d3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefdfdfdfdfdfdfafafa9595950b0b0b000000000000121212bfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb333333000000000000000000171717dcdcdcfffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc111111202020c5c5c5fffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4c4c4c0000000000000000003b3b3bfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b3000000000000000000000000282828fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf4545453d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3c3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c848484fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc101010000000000000000000000000fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe6060600000000000000000000000007d7d7dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2d2d2d3a3a3afcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb494949000000000000000000000000000000000000000000000000000000000000000000636363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7777773c3c3c3c3c3c2b2b2b171717030303000000000000131313727272eeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9292923c3c3c3c3c3c2e2e2e1a1a1a0707070000000000000c0c0c636363e1e1e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000cfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd010101000000000000000000222222e9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffafafa0000000000001a1a1ae8e8e8ffffffffffffffffffffffffffffffffffffffffffdedede050505000000000000020202cfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f3030303000000000000000000000000e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbcbcbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d2d2dfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd181818000000000000000000000000fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe585858000000000000000000000000828282fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4a4a4a000000dfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd9292920c0c0c0000000000000000000c0c0c5151517e7e7eaeaeae9595956666662e2e2e000000000000000000808080fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc4141410000000000000000000000000000000000005a5a5af5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff646464000000000000000000000000000000000000404040ebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff575757000000000000000000000000525252fffffffffffffffffffffffffffffffffffffffffffffffff8f8f8000000000000000000262626c9c9c9fefefefffffffffffffffffffffffff4f4f44343430000000000000000006c6c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc383838000000000000000000000000a6a6a6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e6e6e6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe1e1e1e000000000000000000000000e5e5e5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5151510000000000000000000000008d8d8dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939393000000333333f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7d7d73c3c3c0000000000000000002a2a2a909090f2f2f2ffffffffffffffffffffffffffffffffffffc1c1c14e4e4e000000080808ddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadadab8b8b8a8a8a87a7a7a1a1a1a0000000000000000002525259c9c9cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6b8b8b8adadad8282822727270000000000000000001919198d8d8dfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8020202000000000000000000000000bfbfbffffffffffffffffffffffffffffffffffffffffffff5f5f50000000000000c0c0c000000010101575757b6b6b6dededef4f4f4aeaeae323232000000000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000000000000000000000696969ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff262626000000000000000000000000d4d4d4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd494949000000000000000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea0b0b0b000000434343e3e3e3fffffffffffffffffffffffffffffffffffffffffffefefeefefef727272000000000000000000090909909090fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000555555fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8828282000000000000000000000000585858fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc9e9e9e0202020000000000000000003a3a3af4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5d5d5d0000000000000000000000004b4b4bfefefefffffffffffffffffffffffffffffffffffff4f4f40000000000009f9f9f8080800c0c0c0000000000000000000000000000000000000000000f0f0faeaeaeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb4b4b40000000000000000000000002d2d2dfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2d2d2d000000000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc414141000000000000000000000000b7b7b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828282000000000000070707777777d0d0d0fbfbfbfdfdfdfcfcfcfbfbfbc3c3c36f6f6f1515150000000000000000003a3a3ad9d9d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe505050000000f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000000000606060ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000000000000000444444f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacacac000000000000000000000000000000e2e2e2fffffffffffffffffffffffffffffffffffff1f1f1000000000000a4a4a4fffffff3f3f3969696565656292929050505212121464646868686e1e1e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2030303000000000000000000000000edededfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f3f3f000000000000000000000000b1b1b1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3b3b3b000000000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4545450000000000000000000000000000003030302727270808080000000000000000000000001414149c9c9cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000bebebefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc292929000000000000000000000000a9a9a9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4f4f4f000000000000000000000000858585ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede9292928f8f8fd5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000a4a4a4fffffffffffffffffffffffffffffffffffff1f1f1000000000000a2a2a2fffffffffffffffffffcfcfcfafafafafafafcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa262626000000d9d9d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3c3c3c000000000000000000000000abababffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5a5a5a000000000000000000000000a0a0a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc292929000000000000000000000000e0e0e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe717171000000000000000000000000000000000000000000000000000000070707696969ebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea000000919191fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdffffffffffffffffffffffffffffffffffffffffffffffff9f9f9f000000000000000000000000383838fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6000000000000000000000000191919f6f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9c9c9111111000000000000050505a7a7a7fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb0a0a0a000000000000000000000000858585fffffffffffffffffffffffffffffffffffff1f1f1000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe595959000000868686ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7777770000000000000000000000006b6b6bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8b8b8b000000494949fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7575750000000000000000000000008f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0f0f0f000000000000000000000000f8f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb5151510c0c0c0000000000000000000000003636367d7d7de6e6e6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2c2c2cacacacffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0a0a03c3c3c474747818181f9f9f9ffffffffffffffffffffffffffffffffffffececec000000000000000000000000000000c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb3c3c3c434343767676f1f1f1fffffffffffffffffffffffffffffffffffffbfbfb151515000000000000000000000000999999ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3e3e3e000000000000000000000000090909f8f8f8fffffffffffffffffffffffffffffffffffffffffffbfbfb0e0e0e000000000000000000000000777777fffffffffffffffffffffffffffffffffffff1f1f1000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a6a6000000292929fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b80000000000000000000000002f2f2ffbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf000000222222fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9191910000000000000000000000007e7e7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef000000000000000000000000151515fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafacbcbcbb8b8b8d0d0d0f8f8f8fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb000000000000000000000000545454fdfdfdfffffffffffffffffffffffffffffffafafa0d0d0d000000000000000000000000707070ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9050505000000000000000000323232fcfcfcfffffffffffffffffffffffffffffffcfcfc3232320000000000000000000000004d4d4dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa060606000000000000000000000000000000dadadafffffffffffffffffffffffffffffffffffffffffff4f4f40000000000000000000000000000008e8e8efffffffffffffffffffffffffffffffffffff2f2f2000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef000000000000c7c7c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9000000000000000000000000000000ebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf000000000000f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacacac0000000000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d3000000000000000000000000353535fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5b5b5b000000000000000000000000000000dcdcdcfffffffffffffffffffffffffffffffbfbfb292929000000000000000000000000474747fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d7d7d000000000000000000000000000000b5b5b5fffffffffffffffffffffffffffffffdfdfd4d4d4d000000000000000000000000232323fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1e1e1e000000000000000000000000010101f4f4f4ffffffffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000afafaffffffffffffffffffffffffffffffffffffff1f1f1000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd494949000000686868fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3d3d3d000000000000000000000000abababffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed000000000000c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8000000000000000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000535353fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd494949000000000000000000000000000000b9b9b9fffffffffffffffffffffffffffffffdfdfd3e3e3e000000000000000000000000414141fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6b6b6b000000000000000000000000000000929292ffffffffffffffffffffffffffffffffffff6363630000000000000000000000001d1d1dfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4c4c4c0000000000000000000000006a6a6affffffffffffffffffffffffffffffffffffffffffffffff949494000000000000000000000000050505f0f0f0fffffffffffffffffffffffffffffffffffff1f1f1000000000000a2a2a2fdfdfdfcfcfcfbfbfbfcfcfcfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff999999000000080808e0e0e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000000000000000707070fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e4000000000000000000000000363636fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c000000000000000000000000717171ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff727272000000000000000000000000191919f1f1f1fffffffffffffffffffffffffffffffbfbfb242424000000000000000000000000888888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff959595000000000000000000000000020202dfdfdffffffffffffffffffffffffffffffffdfdfd474747000000000000000000000000656565fdfdfdfffffffffffffffffffffffffffffffffffffffffffbfbfbfbfbfbfcfcfcfefefeffffffffffff8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7b7b0000000000004545459b9b9bfdfdfdfffffffffffffffffffffffffffffffffffffffffff5f5f51e1e1e0000000000000000000000004d4d4dfdfdfdfffffffffffffffffffffffffffffffffffff1f1f10000000000005050505c5c5c3131310707070e0e0e2222223a3a3a7d7d7ddbdbdbfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8040404000000565656fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b8000000000000000000000000303030fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef000000000000767676fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa030303000000000000000000151515fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000000000000000909090ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a30000000000000000000f0f0fbbbbbbfffffffffffffffffffffffffffffffffffff2f2f2010101000000000000000000000000d5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7000000000000000000060606a3a3a3fffffffffffffffffffffffffffffffffffffbfbfb202020000000000000000000000000b1b1b1ffffffffffffffffffffffffffffffffffffffffffd8d8d80000001818183f3f3f6d6d6d9b9b9bdbdbdb8a8a8a000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede0f0f0f0000008e8e8effffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f000000000000000000000000010101d0d0d0fffffffffffffffffffffffffffffffffffffffffff1f1f10000000000000000000000000000000000000000000000000000000000000000003e3e3ed2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4b4b4b000000000000a8a8a8fffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1000000000000000000000000000000e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffbababa000000000000535353fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb202020000000000000000000000000f2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe676767000000000000000000000000b1b1b1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f22a2a2a0000002c2c2ce5e5e5ffffffffffffffffffffffffffffffffffffffffffb3b3b3000000000000000000000000585858fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd454545000000161616d5d5d5ffffffffffffffffffffffffffffffffffffffffffd7d7d7000000000000000000000000383838f9f9f9ffffffffffffffffffffffffffffffffffffffffffd8d8d8000000000000000000000000000000000000151515000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a30000000c0c0cd2d2d2ffffffffffffffffffffffffffffffffffffffffffa9a9a90a0a0a0000000000000000000000007d7d7dfffffffffffffffffffffffffffffffffffffffffffffffff1f1f10000000000000000000000000000000000000000000000000000000000000000000000000606067d7d7dfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa2a2a20000000000000000007d7d7df2f2f2fffffffffffffffffffffffffffffffffffffffffffdfdfd3b3b3b0000000000000000000000009d9d9dfffffffffffffffffffffffffffffffffffffffffffffffff5f5f54444440000000000002d2d2dfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd444444000000000000000000000000c9c9c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4e4e4e000000000000000000000000d5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7d7d70e0e0e000000464646c0c0c0fcfcfcfffffffffffffffffffefefed0d0d00e0e0e000000000000000000202020ecececffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec212121000000333333b2b2b2fbfbfbffffffffffffffffffffffffe3e3e32323230000000000000000000e0e0ed5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffebebeb7979796868684d4d4d2a2a2a000000000000000000000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5a5a5a000000090909818181e2e2e2fbfbfbfdfdfdfafafad7d7d77a7a7a000000000000000000000000000000696969fffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000424242f6f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f10b0b0b0000000000000000000a0a0a5b5b5b8282829090909e9e9eacacacbabababababaa2a2a2363636000000000000000000000000383838aaaaaacccccce1e1e1f9f9f9e3e3e3cdcdcdb4b4b47474741e1e1e000000000000000000070707fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6f000000000000000000000000a7a7a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc333333000000000000000000070707fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7101010000000000000262626767676a1a1a1a3a3a3636363090909000000000000000000555555ebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf1c1c1c0000000000001c1c1c6d6d6d9b9b9baaaaaa6f6f6f1010100000000000000000003e3e3edbdbdbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdecececa5a5a53a3a3a000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f87575750101010000000000001c1c1c3333330909090000000000000000000000000000001c1c1caeaeaefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d3d3df6f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c000000000000000000000000858585fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0a0a0a0000000000000000002b2b2bfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e65757570000000000000000000000000000000000000000000303033e3e3e9b9b9bfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f26e6e6e0000000000000000000000000000000000000000000000003333338b8b8bf9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefecdcdcd4a4a4a000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb2a2a2a0000000000000000000000000000000000000000000101016b6b6befefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0505050000002323235959597f7f7fa0a0a0c2c2c2e1e1e1f0f0f0c7c7c7a5a5a5828282464646070707000000000000abababffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb000000000000000000000000636363fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8c1c1c1f1f1f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f4d4d4d4bebebedbdbdbfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d5d5000000000000000000000000525252fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8c5c5c5f7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdb8b8b8d7d7d7fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8888889c9c9cf9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefed9d9d99b9b9b8c8c8cdfdfdffbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c48f8f8f6d6d6d444444515151707070a3a3a3eaeaeafbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd1d1d19494947070704545454d4d4d696969969696e2e2e2fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe9999994f4f4fe7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafad2d2d29f9f9f6f6f6f454545696969919191bdbdbdecececfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd767676b6b6b6fafafafdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefef3f3f3aeaeae5d5d5ddcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b8c8c8ceaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8a7a7a7868686d1d1d1fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbebebeedededfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6d6d6d6bdbdbdd7d7d7fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8bababab8b8b8b8b8b8b8b8b8b9b9b9b8b8b8b8b8b8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc000000000000000000000000404040fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbababa0303030000000d0d0dcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a030303000000000000000000232323b5b5b5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a50000000000000000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc5c5c5c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3c3cb2b2b2ffffffffffffffffffffffffffffffffffffffffffffffffa7a7a70000000000001d1d1de7e7e7ffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000474747f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffff6969690000000000001f1f1fadadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea4444440000000000000000000000004d4d4dd9d9d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c0000000000000f0f0f888888fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe646464000000000000000000000000343434c0c0c0fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece050505000000060606bebebeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c0b0b0b000000000000000000191919a3a3a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2a2a2a0000000000000000000e0e0efafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1a1a1000000000000000000424242fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000000000000000535353484848000000000000929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff767676000000000000000000000000aeaeaefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2d2d2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d6d6dffffffffffffffffffffffffffffffffffffffffffffffff696969000000000000000000646464fffffffffffffffffffffffffffffffffffffffffffbfbfb151515000000000000000000888888fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb282828000000000000000000000000dbdbdbfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2a2a2a0000000000000000000000000000000000000909099c9c9cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5b5b5b000000000000000000000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffffffff5858580000000000000000000000000000000000000000006f6f6ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb000000000000000000262626fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b1000000000000000000474747525252000000000000787878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff565656000000000000000000000000d8d8d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d5d5000000000000000000040404f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1b1b1b0000000000001c1c1cfbfbfbfcfcfcb1b1b1070707000000a8a8a8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd494949000000000000000000000000e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000464646fdfdfdffffffffffffffffffffffffffffffffffffffffffa8a8a80000000000000000000f0f0ff8f8f8ffffffffffffffffffffffffffffffffffffc8c8c80000000000000000000000008b8b8bfffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000000000000000000000939393ffffffffffffffffffffffffffffffffffffffffffffffff919191000000000000000000000000424242535353000000000000000000abababffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000000000606060fefefeffffffffffffffffffffffffffffffffffffffffffc4c4c40000000000000000000000002929296565650f0f0f000000000000777777ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000dcdcdcfffffffffffffffffffffffffffffffffffffffffffffffffdfdfd363636000000000000070707f5f5f5fdfdfdc1c1c10f0f0f0000008e8e8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f000000000000000000000000a5a5a5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb101010000000000000000000b2b2b2ffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf000000000000000000272727fbfbfbffffffffffffb4b4b4000000141414e7e7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1c1c1c000000000000000000232323fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f93b3b3b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000212121fcfcfcfffffffffffffffffffffffffffffffffffffffffffcfcfc2b2b2b000000000000000000b9b9b9ffffffffffffffffffffffffffffffffffff909090000000000000000000020202e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffff939393000000000000000000000000525252fefefefffffffffffffffffffffffffffffffffffffefefe5c5c5c000000000000000000000000bdbdbdfefefea6a6a6000000000000070707d0d0d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c80000000000000000000000001c1c1cfbfbfbffffffffffffffffffffffffffffffffffffffffff8e8e8e000000000000000000000000878787fefefecfcfcf121212000000000000a1a1a1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2c2c2c000000000000000000999999fffffffffffffffffffffffffffffffffffffffffffffffff5f5f50000000000000000000e0e0efbfbfbffffffffffffc9c9c9020202040404d8d8d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8000000000000000000000000747474fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4c4c4c0000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb000000000000000000000000edededfffffffffffffdfdfd444444000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e7000000000000000000000000575757fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea1f1f1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020202f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffff9696960000000000000000006d6d6dffffffffffffffffffffffffffffffffffff646464000000000000000000545454fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d3000000000000000000000000151515fbfbfbfffffffffffffffffffffffffffffffffffffefefe5d5d5d000000000000000000000000858585ffffffffffff7d7d7d000000000000393939fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0c0c0c000000000000000000000000d8d8d8ffffffffffffffffffffffffffffffffffffffffff909090000000000000000000000000525252fdfdfdffffffb0b0b0000000000000131313eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe636363000000000000000000585858fefefefffffffffffffffffffffffffffffffffffffffffff2f2f2010101000000000000000000d4d4d4fffffffffffffefefe5b5b5b0000005c5c5cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe1a1a1a000000000000000000454545fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000000000303030fcfcfcfffffffffffffffffffffffffffffffffffffffffffbfbfb1e1e1e000000000000000000a8a8a8ffffffffffffffffffbcbcbc000000121212f7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b8000000000000000000000000969696ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada161616000000888888f9f9f9fafafafbfbfbfafafafafafafafafafafafaf9f9f9f9f9f9f4f4f4d4d4d47c7c7c000000000000d8d8d8fffffffffffffffffffffffffffffffffffffffffffffffff3f3f3111111000000000000262626fcfcfcfffffffffffffffffffffffffefefe5b5b5b000000000000000000989898fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa161616000000000000000000000000d0d0d0ffffffffffffffffffffffffffffffffffffffffff8e8e8e0000000000000000000000003d3d3dfcfcfcfffffffbfbfb181818000000000000b8b8b8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4b4b4b000000000000000000000000989898ffffffffffffffffffffffffffffffffffffffffffc2c2c20000000000000000000000000b0b0bfafafafffffffdfdfd494949000000000000858585ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9f000000000000000000171717fbfbfbfffffffffffffffffffffffffffffffffffffffffffcfcfc373737000000000000000000909090ffffffffffffffffffd5d5d5000000040404e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6565650000000000000000000e0e0efafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffff666666000000000000000000555555fdfdfdfffffffffffffcfcfc222222000000afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000000000000000000000e3e3e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d0d00e0e0e0000008c8c8cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1020202000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffff737373000000000000000000dfdfdfffffffffffffffffffffffffffffff5d5d5d000000000000000000d5d5d5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd535353000000000000000000000000919191ffffffffffffffffffffffffffffffffffffffffffd4d4d4000000000000000000000000000000e6e6e6ffffffffffff7c7c7c000000000000626262fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000005f5f5ffefefefffffffffffffffffffffffffffffffffffffbfbfb0f0f0f000000000000000000000000b1b1b1ffffffffffffb0b0b0000000000000303030fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e3000000000000000000000000d0d0d0ffffffffffffffffffffffffffffffffffffffffffffffff7e7e7e0000000000000000003e3e3efcfcfcfffffffffffffdfdfd424242000000959595ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffababab000000000000000000000000d1d1d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f90c0c0c000000000000000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffb4b4b4000000000000000000060606eeeeeeffffffffffffffffff9090900a0a0a808080fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3f3f3f000000000000000000313131fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6080808000000858585fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb323232000000949494ffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e1010101000000000000989898ffffffffffffffffffffffffffffff656565000000000000060606fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f000000000000000000000000535353fefefefffffffffffffffffffffffffffffffffffffbfbfb272727000000000000000000000000919191ffffffffffffe3e3e3000000000000444444fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000000000000000000000222222fbfbfbfffffffffffffffffffffffffffffffffffffefefe5c5c5c000000000000000000000000606060fefefefffffffbfbfb242424000000131313f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb242424000000000000000000909090ffffffffffffffffffffffffffffffffffffffffffffffffcecece000000000000000000000000dededeffffffffffffffffffa5a5a50b0b0b6e6e6efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef020202000000000000000000888888fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd484848000000000000000000696969fffffffffffffffffffffffffffffffffffffffffffffffff7f7f70f0f0f0000000000000000009b9b9bfffffffffffffffffffffffff9f9f9fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2070707000000000000000000787878ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaeaeae010101000000787878fefefefffffffffffffffffffffffffffffffffffffffffffefefe656565000000707070fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd525252000000000000585858fefefeffffffffffffffffffffffff6f6f6f0000000000002d2d2dfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000000000000000111111fbfbfbffffffffffffffffffffffffffffffffffffffffff7777770000000000000000000000003e3e3efcfcfcfffffffffffffafafaf9f9f9fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f80b0b0b000000000000000000000000e0e0e0ffffffffffffffffffffffffffffffffffffffffffababab0000000000000000000000000c0c0cf7f7f7fffffffffffffbfbfbf9f9f9fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe626262000000000000000000525252fefefefffffffffffffffffffffffffffffffffffffffffffcfcfc252525000000000000000000838383fffffffffffffffffffffffff8f8f8fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3d3d3d000000000000000000444444fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8383830000000000000000002e2e2efcfcfcffffffffffffffffffffffffffffffffffffffffffffffff626262000000000000000000424242fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000c3c3c3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff999999000000000000616161fbfbfbffffffffffffffffffffffffffffffffffffffffff9898980000004c4c4cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd000000000000151515fafafaffffffffffffffffffffffff858585000000000000444444fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa121212000000000000000000000000cdcdcdffffffffffffffffffffffffffffffffffffffffffcfcfcf000000000000000000000000000000e4e4e4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd464646000000000000000000000000999999fffffffffffffffffffffffffffffffffffffffffffafafa0e0e0e000000000000000000000000afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b000000000000000000131313fbfbfbffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a0000000000000000002b2b2bfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadadaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000000000050505f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1c1c1000000000000000000010101ecececffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000020202e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7272720000000000000000001d1d1dfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0a0a0000000000000515151f8f8f8fffffffffffffffffffffffffffffffffffffefefefafafafbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2e2e2e000000000000cececeffffffffffffffffffffffffa5a5a50000000000004f4f4ffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd5050500000000000000000000000008b8b8bfffffffffffffffffffffffffffffffffffffffffffbfbfb252525000000000000000000000000939393ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000000000000000595959fefefefffffffffffffffffffffffffffffffffffffefefe595959000000000000000000000000616161fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdcdcdc000000000000000000000000d2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf000000000000000000000000cfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc202020898989ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9000000000000000000000000aeaeaefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6070707000000000000000000acacacfffffffffffffffffffffffffffffffffffffffffffffffff7f7f70d0d0d0000000000000000008b8b8bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3333330000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f0000000000004a4a4af4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9292920000000000008e8e8effffffffffffffffffffffffc7c7c7000000000000595959ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000000000494949fdfdfdffffffffffffffffffffffffffffffffffffffffff6c6c6c000000000000000000000000454545fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf000000000000000000000000151515fbfbfbffffffffffffffffffffffffffffffffffffffffff9f9f9f000000000000000000000000111111fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1e1e1e000000000000000000939393fffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1f1f1f000000000000000000717171ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c5c5c262626fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3c3c3c000000000000000000686868fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4242420000000000000000006f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffefefe5353530000000000000000003d3d3dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb000000000000000000000000c7c7c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5c5c5c000000000000393939eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e80202020000004e4e4efdfdfdfffffffffffffffffff3f3f3000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcacaca0000000000000000000000000a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffb4b4b4000000000000000000000000000000fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9080808000000000000000000000000d1d1d1ffffffffffffffffffffffffffffffffffffffffffe9e9e9000000000000000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5a5a5a000000000000000000575757fefefeffffffffffffffffffffffffffffffffffffffffffffffff6b6b6b000000000000000000242424fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000c9c9c9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c000000000000000000202020fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000000000000000353535fcfcfcffffffffffffffffffffffffffffffffffffffffffffffff9e9e9e000000000000000000020202f2f2f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff959595000000000000000000232323fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9434343000000000000232323d5d5d5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4848480000000f0f0ff9f9f9fffffffffffffffffffbfbfb1f1f1f0000004a4a4afdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f80b0b0b000000000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffff7f7f7090909000000000000000000000000b2b2b2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc4141410000000000000000000000008d8d8dfffffffffffffffffffffffffffffffffffffffffffcfcfc3838380000000000000000000000007e7e7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff979797000000000000000000181818fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000dcdcdcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1616166c6c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f50a0a0a000000000000000000bdbdbdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f87a7a7a949494ffffffffffffffffffc0c0c0000000000000000000030303efefefffffffffffffffffffffffffffffffffffffffffffffffffebebeb010101000000000000000000b4b4b4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3e3e3e0000000000000000007c7c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb2626260000000000000f0f0fbcbcbcfffffffffffffffffffffffffffffffffffffffffffffffff7f7f7cdcdcdffffffffffffffffffffffffffffffffffffffffff9f9f9f000000000000c6c6c6fffffffffffffffffffdfdfd4e4e4e000000343434fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4b4b4b0000000000000000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffefefe4d4d4d000000000000000000000000757575ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000000000000000474747fdfdfdffffffffffffffffffffffffffffffffffffffffff7f7f7f000000000000000000000000424242fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181888888ffffffffffffffffffd8d8d8000000000000000000000000d8d8d8fffffffffffffffffffffffffffffffffffffffffffffffff7f7f70e0e0e0000000000000000009a9a9affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a0e0e0ef7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff626262000000000000000000626262fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee000000050505eeeeeefffffffffffff7f7f7090909000000000000000000939393fffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2c2c2c000000000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e1000000000000000000010101dfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd4d4d4070707000000000000050505b9b9b9fffffffffffffffffffffffffffffffffffffefefe717171000000616161ffffffffffffffffffffffffffffffffffffefefef060606000000898989ffffffffffffffffffffffff858585000000111111fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000000000000000000000141414efefefffffffffffffffffffffffffffffffffffffffffff838383000000000000000000000000464646fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb000000000000000000000000000000c9c9c9ffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000121212fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb0f0f0f000000dadadafffffffffffffbfbfb1b1b1b0000000000000000007a7a7afffffffffffffffffffffffffffffffffffffffffffffffffdfdfd444444000000000000000000666666ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5c5c50000000000000000000f0f0ff5f5f5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc343434000000a2a2a2fffffffffffffdfdfd3f3f3f000000000000000000090909d5d5d5fffffffffffffffffffffffffffffffffffffffffffdfdfd5151510000000000000000005d5d5dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585000000000000000000494949fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000040404bbbbbbffffffffffffffffffffffffffffffffffffd6d6d60303030000006b6b6bfffffffffffffffffffffffffffffffefefe5757570000004f4f4ffdfdfdffffffffffffffffffbdbdbd000000000000eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5c5c5000000000000000000000000000000646464ffffffffffffffffffffffffffffffffffffffffffa8a8a8000000000000000000000000222222fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9070707000000000000000000000000363636fdfdfdffffffffffffffffffffffffffffffffffffdedede000000000000000000000000000000eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd4d4d4d000000888888fffffffffffffefefe585858000000000000000000020202c2c2c2ffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a000000000000000000454545fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc1b1b1b4c4c4cfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff242424000000000000000000a5a5a5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484840000004e4e4efcfcfcffffffffffff787878000000000000000000000000343434f6f6f6ffffffffffffffffffffffffffffffffffffffffff797979000000000000000000555555fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2f2f2f000000000000000000aeaeaeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d0d0070707dadadafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb2a2a2a0000000000000000000b0b0bcececeffffffffffffffffffffffffffffffffffff818181000000000000515151edededffffffffffffffffffffffffadadad000000121212fafafafffffffffffffffffff0f0f0020202000000c7c7c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0c0c0c000000000000000000000000000000979797ffffffffffffffffffffffffffffffffffffc3c3c3000000000000000000000000171717fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3e3e3e000000000000000000000000000000656565fdfdfdfffffffffffffffffffffffffffffffafafa000000000000000000000000000000ddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000353535fbfbfbffffffffffff929292000000000000000000000000212121edededffffffffffffffffffffffffffffffffffffffffff9090900000000000000000003e3e3efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff787878020202eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfdfdfdfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000000000000000424242fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada000000040404e2e2e2ffffffffffff9e9e9e000000000000000000000000000000545454f8f8f8ffffffffffffffffffffffffffffffffffff7d7d7d0000000000000000007a7a7affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd4d4d4000000000000000000272727fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec0101017d7d7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a5000000000000000000000000252525f9f9f9fffffffffffffffffffffffffffffffefefe4e4e4e0000000000001919196d6d6d8a8a8aa1a1a1b7b7b7b0b0b00303030000009d9d9db8b8b8b8b8b8b8b8b8b7b7b7202020000000797979b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e1e1e1fffffffffffffffffffffffffffffffffffffdfdfd4646460000000000000000000000000000000000005e5e5ef2f2f2ffffffffffffffffffffffff8e8e8e000000000000000000000000414141fdfdfdfffffffffffffffffffffffffffffffbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7979790000000000000000000000000000000000003e3e3ee2e2e2ffffffffffffffffffffffffc3c3c30000000000000000000000000d0d0dfafafafffffffffffffffffffffffffffffffcfcfcfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffededed070707000000ccccccffffffffffffb6b6b60000000000000000000000000000003f3f3ff0f0f0ffffffffffffffffffffffffffffffffffff949494000000000000000000636363fefefefffffffffffffffffffffffffffffffefefefbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbffffffffffffffffffffffffffffffffffffffffffd9d9d90000008f8f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefed9d9d97171714040401111112121215b5b5b929292e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa1c1c1c000000000000000000d2d2d2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe444444000000737373ffffffffffff8888880000000000000000004b4b4b222222000000505050ebebebfdfdfdfffffffffffffffffffcfcfc4c4c4c000000000000000000abababfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe686868000000000000000000949494fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe3f3f3f212121fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2b2b2b0000000000000000000000008e8e8efffffffffffffffffffffffffffffffffffff7f7f73d3d3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111c1c1c1ffffffffffffffffffffffffffffffffffff8484840000000000000000000000000000000000000000002222229a9a9afafafafcfcfcdadada343434000000000000000000000000737373fffffffffffffffffffffffffffffffcfcfc0d0d0d000000000000000000000000000000000000000000000000000000000000000000000000525252fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000000000000000000000101010828282ecececfafafaeaeaea575757000000000000000000000000414141fdfdfdfffffffffffffffffffffffffefefe414141000000000000000000000000000000000000000000000000000000000000000000000000202020fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffff5c5c5c0000005c5c5cfefefeffffffa1a1a10000000000000000003f3f3f2e2e2e0000003d3d3de5e5e5fcfcfcfffffffffffffffffffdfdfd626262000000000000000000939393ffffffffffffffffffffffffffffffffffff969696000000000000000000000000000000000000000000000000000000000000000000000000000000bfbfbffffffffffffffffffffffffffffffffffffffdfdfd323232363636fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f16969690303030000001818183434342828280606060000000d0d0d8f8f8ffbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff969696000000000000000000616161fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9c9c90101010101019e9e9ee0e0e0353535000000000000020202c8c8c8e7e7e72e2e2e000000131313868686c7c7c7e7e7e7ebebeb8a8a8a0000000000000000002a2a2af4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8080808000000000000151515f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929292000000c4c4c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e8e8e0000000000000000000000001e1e1efafafafffffffffffffffffffffffffffffffffffff4f4f4414141000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000434343fdfdfdffffffffffffffffffffffffffffffc0c0c00000000000000000000000000000001414140000000000000000000707073030300000000000000000000000000000001b1b1be1e1e1ffffffffffffffffffffffffffffffffffff4343430000000000000000000000000000000000000000000000000000000000000000000000002c2c2cfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f10000000000000000000000000000001212120000000000000000000000002b2b2b0b0b0b000000000000000000000000080808c0c0c0ffffffffffffffffffffffffffffffffffff777777000000000000000000000000000000000000000000000000000000000000000000000000000000f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffdcdcdc0808080000008f8f8fe3e3e3474747000000000000000000b3b3b3f0f0f03d3d3d0000000a0a0a787878c4c4c4e4e4e4f0f0f09a9a9a0808080000000000001c1c1cebebebffffffffffffffffffffffffffffffffffffd0d0d0040404000000000000000000000000000000000000000000000000000000000000000000000000909090ffffffffffffffffffffffffffffffffffffffffff8b8b8b000000dadadafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd505050000000636363ebebebfcfcfcfefefefdfdfdebebeb2828280000000000003a3a3afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f91c1c1c000000000000050505e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff919191000000000000000000000000000000010101a2a2a2fffffffffffff0f0f0606060000000000000000000000000000000000000000000000000111111d5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff787878000000000000000000868686ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed060606636363ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddddd000000000000000000000000000000b4b4b4fffffffffffffffffffffffffffffffffffffffffffefefe8a8a8a1818180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a3a3afdfdfdfffffffffffffffffffffffffffffffafafa080808000000000000000000000000bcbcbc6e6e6e000000000000000000000000000000000000000000000000181818d1d1d1ffffffffffffffffffffffffffffffffffffffffffd3d3d3111111000000000000000000000000000000000000000000000000000000000000000000030303fafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3939390000000000000000000000009595958d8d8d141414000000000000000000000000000000000000000000070707abababffffffffffffffffffffffffffffffffffffffffffefefef282828000000000000000000000000000000000000000000000000000000000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7a7a70101010000000000000000000000000000008e8e8efffffffffffff8f8f8727272020202000000000000000000000000000000000000000000090909c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffa7a7a70000000000000000000000000000000000000000000000000000000000000000000000006c6c6cffffffffffffffffffffffffffffffffffffffffffe6e6e60101017a7a7affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f000000282828c6c6c6ffffffffffffffffffffffffffffffdbdbdb010101000000000000898989ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9595950000000000000000007f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b24141410707071b1b1b4f4f4fcbcbcbffffffffffffffffffffffffffffffd2d2d27d7d7d4040401d1d1d030303181818333333818181efefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f01010100000000000001b1b1bf6f6f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5353530a0a0af4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccccc5e5e5e4a4a4a848484fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1b1b1b000000000000000000000000757575fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbcdcdcdb2b2b2adadada8a8a8a2a2a29d9d9d9898989292928e8e8e8989898383837e7e7e7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7979797b7b7bddddddfffffffffffffffffffffffffffffffffffffdfdfd434343000000000000000000000000949494ffffffdedede7474744949492020200000001d1d1d3b3b3b969696fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffc9c9c90d0d0d262626b5b5b5bababababababababababababababab7b7b7969696313131000000ddddddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000000000000000000000606060fefefeefefef8181815050502b2b2b0000001717173434347e7e7eebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e72626260f0f0fa6a6a6babababababababababababababababababa9e9e9e4e4e4e000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbebebe4949490b0b0b171717454545bfbfbfffffffffffffffffffffffffffffffdadada8484844444441f1f1f0404041616162e2e2e727272e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000757575babababbbbbbbabababababababababababaafafaf7f7f7f0000004a4a4afffffffffffffffffffffffffffffffffffffffffffefefe464646191919fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc151515000000000000010101dfdfdffffffffffffffffffffffffffdfdfd3f3f3f000000000000080808d8d8d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f71d1d1d000000000000131313f1f1f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfafafafafafafdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfcfafafafbfbfbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff888888000000000000000000989898ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadad000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece080808000000000000000000525252fefefefffffffffffffffffffffffffffffffffffffffffffdfdfd3a3a3a000000000000000000000000575757fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e7e7e000000000000000000000000515151fefefefffffffffffffdfdfdfbfbfbfafafafcfcfcfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2040404444444f6f6f6ffffffffffffffffffffffffffffffffffff9e9e9e000000b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b20000000000000000000000001d1d1dfcfcfcfffffffffffffefefefcfcfcfafafafbfbfbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0131313232323e0e0e0ffffffffffffffffffffffffffffffffffffd4d4d4000000828282fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfafafafafafafdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfcfafafafbfbfbfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4a4a4a040404a9a9a9fffffffffffffffffffffffffffffffffffffefefe2e2e2e292929fdfdfdffffffffffffffffffffffffffffffffffffffffffa0a0a0000000bdbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8d8d8000000000000000000000000989898ffffffffffffffffffffffffffffff6f6f6f000000000000000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a5000000000000000000888888fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa1818180000000000002d2d2dfcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9101010464646fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000000000000000000000000000cdcdcdfffffffffffffffffffffffffffffffffffffffffffdfdfd3a3a3a000000000000000000000000494949fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbcbcbc000000000000000000000000101010fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a50202023b3b3bf2f2f2ffffffffffffffffffffffffffffffd8d8d8000000909090fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0000000000000000000000000000000d7d7d7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccccc0f0f0f1a1a1ad9d9d9fffffffffffffffffffffffffffffffcfcfc1212125e5e5efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f63f3f3f0000009d9d9dffffffffffffffffffffffffffffffffffff686868070707fcfcfcfffffffffffffffffffffffffffffffffffffffffff4f4f40a0a0a626262fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee080808000000000000000000cbcbcbffffffffffffffffffffffffffffff8080800000000000000000003f3f3ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe484848000000000000181818f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c000000000000000000c1c1c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfdfdfdffffffffffffffffffffffffffffffffffffffffff676767020202e5e5e5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeacacac6c6c6c555555444444757575aeaeaeecececfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc363636000000000000000000000000000000aaaaaafffffffffffffffffffffffffffffffffffffffffffafafa1b1b1b0000000000000000000000005f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5070707000000000000000000000000d2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa4a4a4030303333333eeeeeefffffffffffffffffffffffffdfdfd484848929292fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3535350000000000000000000000009c9c9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcecece111111181818d5d5d5fffffffffffffffffffffffffefefe7070706c6c6cfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f53f3f3f000000959595ffffffffffffffffffffffffffffffb1b1b13d3d3debebebfffffffffffffffffffffffffffffffffffffffffffefefe5d5d5d0a0a0af7f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb2b2b2b181818949494ffffffffffffffffffffffffffffffffffff8e8e8e000000000000000000252525fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e50b0b0b0000000000008a8a8affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf090909000000000000575757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe3f3f3f000000000000000000000000000000000000000000000000000000000000000000000000262626fdfdfdffffffffffffffffffffffffffffffffffffc2c2c20000008c8c8cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd3b3b3b0000000000000707073131310404040000000202026d6d6decececfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe555555000000000000000000000000000000d5d5d5fffffffffffffffffffffffffffffffffffffffffff3f3f30000000000000000000000000000007f7f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc3e3e3e000000000000000000000000989898ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a50000002f2f2fe9e9e9fffffffffffffffffffffffffdfdfdfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff707070000000000000000000000000656565ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcacaca090909131313ccccccfffffffffffffffffffffffffefefefdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f4f43a3a3a0000008b8b8bfffffffffffffffffffffffffffffffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffb9b9b9000000a6a6a6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdffffffffffffffffffffffffffffffffffffffffff7474740000000000000000004d4d4dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff949494000000000000121212eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe555555000000000000111111e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e5e5e000000000000000000000000000000000000000000000000000000000000000000000000000000f3f3f3fffffffffffffffffffffffffffffffffffffdfdfd1f1f1f313131fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e11212120000005f5f5fcdcdcdf9f9f9fdfdfdf1f1f17d7d7d000000000000141414bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000000000000000727272fefefeffffffffffffffffffffffffffffffffffffffffffa2a2a2000000000000000000000000000000c5c5c5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfccacacab9b9b9b8b8b84b4b4b0000000000000000000000004e4e4eb9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c4c4c4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000272727e3e3e3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdddddddb9b9b9b9b9b9707070000000000000000000000000282828b7b7b7b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9bababafefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b10101010e0e0ec5c5c5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec222222000000808080fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb1919194b4b4bfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4343430000000000000000007a7a7affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3333330000000000005d5d5dfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1c1c10000000000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec272727000000000000000000000000000000000000000000000000000000000000000000000000ccccccffffffffffffffffffffffffffffffffffffffffff7a7a7a000000d2d2d2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa3c3c3c000000505050f3f3f3ffffffffffffffffffffffffffffff5b5b5b000000000000161616e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf000000000000575757c8c8c8fefefefffffffffffffffffffffffffffffffffffffffffff9f9f92626260000000000000000000000001f1f1ffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfb333333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3a3a3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5353530000001a1a1ad3d3d3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd6363630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff878787000000070707b3b3b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2d2d2090909000000676767fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff747474030303eaeaeafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc0f0f0f000000000000272727e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9050505000000000000c0c0c0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd252525000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e72626260d0d0d7979797b7b7b7c7c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b4b4b4b000000a8a8a8ffffffffffffffffffffffffffffffffffffffffffd9d9d9000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbb0000000000000000004f4f4fffffffffffffffffffffffffffffffd9d9d90000000000000000004d4d4dfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f62929290000003c3c3cfefefeffffffffffffffffffffffffffffffffffffffffffffffff9a9a9a000000000000000000000000000000a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000696969ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffededed0e0e0e000000121212ccccccfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363636fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff333333000000010101a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000545454fbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccccc0000008e8e8effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000000000272727e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b000000000000242424fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7070700000000000002b2b2bf4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf131313505050f9f9f9ffffffffffffffffffffffffffffffffffffd4d4d4000000828282fffffffffffffffffffffffffffffffffffffffffffdfdfd333333191919fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000000000000000000000f3f3f3fffffffffffffffffffffffffdfdfd141414000000000000000000d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf040404000000737373fbfbfbffffffffffffffffffffffffffffffffffffadadad0505050000000000000000000000004d4d4dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8282824848483d3d3d3333331515150000000000000000000000000000000000003636363d3d3d3d3d3d3d3d3d3d3d3d3f3f3f565656717171e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3060606000000101010d5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d5656563d3d3d3737371b1b1b0000000000000000000000000000000000002e2e2e3d3d3d3d3d3d3d3d3d3d3d3d3e3e3e5151516b6b6bccccccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e4e41c1c1c000000020202adadadfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe575757000000000000545454fcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd212121323232fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfbf0f0f0cfcfcf727272000000000000333333e9e9e9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6a6a6a000000000000565656fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3c3c3000000000000111111dbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b1000000404040f0f0f0fffffffffffffffffffffffffffffffcfcfc1111115d5d5dffffffffffffffffffffffffffffffffffffffffffffffff8e8e8e000000b9b9b9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f0000000000000000000e0e0efcfcfcfffffffffffffffffffffffffdfdfd272727000000000000000000a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000353535c0c0c0fafafafbfbfbf9f9f9e1e1e1646464030303000000000000000000000000414141f7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf8f8f8f6f6f63232320000000000000000000000005d5d5dfbfbfbfcfcfcfcfcfcfdfdfdfcfcfcfdfdfdfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff676767000000000000282828f4f4f4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf9f9f9f7f7f76565650000000000000000000000002c2c2cf8f8f8fcfcfcfcfcfcfdfdfdfcfcfcfdfdfdfdfdfdfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c0000000000000d0d0ddbdbdbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef1010100000000000006a6a6affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808080000000d2d2d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff505050000000000000000000000000555555bbbbbbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc383838000000000000939393fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1222222000000000000b4b4b4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c9c9c0000002b2b2be1e1e1fffffffffffffffffffffffffefefe474747393939fefefeffffffffffffffffffffffffffffffffffffffffffebebeb0101015c5c5cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f65b5b5b101010333333aaaaaafffffffffffffffffffffffffffffffdfdfd373737000000000000000000797979ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1a1a11c1c1c0000000000001515153636361c1c1c000000000000000000000000000000181818a1a1a1fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b33b3b3b2727270909090000000000000000000000000000001e1e1efbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada020202000000000000717171ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede3b3b3b3232320f0f0f000000000000000000000000000000000000e3e3e3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f61c1c1c0000000000003f3f3ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818181000000000000000000bdbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e1000000757575ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdcdcdcb7b7b78383832929290000000202025f5f5fe7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffebebeb1f1f1f000000040404c8c8c8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4d4d4d000000000000828282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9d9d9d000000151515cfcfcffffffffffffffffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefe4c4c4c0a0a0af4f4f4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefbfbfbfcfcfcfffffffffffffffffffffffffffffffffffffdfdfd2929290000000000000000009e9e9efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f27b7b7b222222000000000000000000000000000000000000212121717171f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000000000000000000000000000000000000000000000d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff535353000000000000030303eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1e1e1000000000000000000000000000000000000000000000000000000a0a0a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000000000000000bbbbbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3e3e30000000000000000004e4e4efefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe3b3b3b191919fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd696969000000000000232323e4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3d3d30b0b0b000000181818e5e5e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a0000000000004f4f4ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c7c7c0000000f0f0fc7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa7a7a7000000a1a1a1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2010101000000000000000000cfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef9f9f9e9e9e9b4b4b48484847a7a7abebebeeeeeeefafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffececec0000000000000000000000000000000000000000000000000000009b9b9bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb5b5b58f8f8fe9e9e9ffffffffffffffffffffffffffffffffffff8d8d8d0000000000000000009a9a9afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc2c2c2c000000000000000000000000000000000000000000000000686868fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcacaca898989d6d6d6ffffffffffffffffffffffffffffffffffffc3c3c3000000000000000000686868ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeaea8d8d8db1b1b1fffffffffffffffffffffffffffffffffffffdfdfd292929000000000000050505fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff969696000000bcbcbcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2a2a2a000000000000353535fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafaf000000000000373737fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaaa000000000000343434f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff515151000000070707b4b4b4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f70e0e0e494949fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8b8b8000000000000000000666666ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b37878786262624d4d4d3c3c3c2c2c2c1e1e1e0e0e0e0000008d8d8dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff717171000000000000171717edededffffffffffffffffffffffffffffffb4b4b4000000000000000000747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c87e7e7e6565655151513f3f3f2f2f2f212121111111000000606060fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa5a5a5000000000000030303c9c9c9ffffffffffffffffffffffffffffffebebeb000000000000000000404040fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7e7e71a1a1a000000000000797979fffffffffffffffffffffffffffffffefefe414141000000000000000000e1e1e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1040404606060fffffffffffffffffffffffffffffffffffffffffffffffffefefed7d7d7e5e5e5ffffffffffffffffffffffffffffff8d8d8d000000000000000000b9b9b9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff979797000000000000565656fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5c5c50909090000002f2f2fedededfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5252525000000010101a4a4a4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff656565020202eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeeeeee313131000000000000666666fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfefefefcfcfcfafafafafafaf9f9f9fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd1a1a1a0000000000000000009c9c9cffffffffffffffffffffffffffffff9c9c9c000000000000000000828282fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefdfdfdfcfcfcfbfbfbfafafafafafafcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4e4e4e000000000000000000696969ffffffffffffffffffffffffffffffd1d1d10000000000000000004f4f4ffefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa3a3a3000000000000000000131313fcfcfcfffffffffffffffffffffffffdfdfd2d2d2d000000000000070707f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe5252520a0a0af7f7f7fffffffffffffffffffffffffffffffffffffefefe656565000000000000868686ffffffffffffffffffffffffcfcfcf000000000000000000585858fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9999990000000000006c6c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d6d6121212000000363636eeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf060606000000010101adadadffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4c4c4000000969696fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfbe4e4e4c5c5c5323232000000000000737373fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2a2a2a000000000000000000b4b4b4ffffffffffffffffffffffffffffff797979000000000000000000b8b8b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5d5d5d0000000000000000007d7d7dffffffffffffffffffffffffffffffaeaeae000000000000000000838383ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b3000000000000000000282828fcfcfcfffffffffffffffffffffffffbfbfb0a0a0a000000000000343434fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadadad000000a6a6a6ffffffffffffffffffffffffffffffffffffd6d6d6000000000000000000060606fbfbfbffffffffffffffffffececec0000000000000000002a2a2afdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff979797000000000000878787ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e82222220000003c3c3cf0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8686860000000000000b0b0bdcdcdcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd272727414141fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f90303030000000000000000000000005e5e5ed8d8d8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5151510000000e0e0e6d6d6dfffffffffffffffffffffffffffffffbfbfb292929000000000000000000efefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff868686000000040404525252f0f0f0fffffffffffffffffffffffffefefe5a5a5a000000000000000000bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedede000000000000333333bebebeffffffffffffffffffffffffffffffb0b0b0000000000000000000646464fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa0f0f0f4c4c4cfefefeffffffffffffffffffffffffffffffe3e3e3000000000000000000121212fafafaffffffffffffffffffeeeeee000000000000000000303030fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff969696000000000000d3d3d3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd505050000000686868fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f61616160000000000003e3e3efefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff838383000000e6e6e6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484847b7b7b5d5d5d000000000000262626c0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd000000898989ffffffffffffffffffffffffffffffffffff969696000000000000000000676767ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2e2e20f0f0f545454fefefeffffffffffffffffffffffffffffffc8c8c8000000000000000000373737fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4b4b4b0f0f0fe7e7e7fffffffffffffffffffffffffffffff7f7f72e2e2e000000000000070707d0d0d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff696969040404ebebebfffffffffffffffffffffffffffffffdfdfd2a2a2a0000001a1a1ab7b7b7ffffffffffffffffffffffffc5c5c50000000000000000006c6c6cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcacacab9b9b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf8f8f8fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff757575000000000000000000bcbcbcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e0000000888888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd0d0d0d0000000000009e9e9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7272720a0a0abfbfbffefefefffffffffffffdfdfd8a8a8a010101000000000000262626f5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa9a9a9000000979797fcfcfcfffffffffffffdfdfdb9b9b90c0c0c000000000000080808dadadaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8161616292929c9c9c9fffffffffffffefefee7e7e73636360000000000000000008f8f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c70000008e8e8effffffffffffffffffffffffffffffffffffbebebe000000707070efefeffffffffffffffffffffdfdfd646464000000000000151515e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2d2d2bababadbdbdbffffffffffffffffffffffffffffffffffffc0c0c0000000000000000000676767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd3e3e3e2e2e2efdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb1b1b1000000000000010101afafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f86363630000002828286464645656561818180000000000000000003e3e3edcdcdcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8989890303031a1a1a5656566969692c2c2c000000000000000000212121bebebeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c8c81d1d1d0000003e3e3e6e6e6e3e3e3e040404000000000000060606828282fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe262626373737fdfdfdffffffffffffffffffffffffffffffffffff9494940404041515156666669d9d9d989898434343000000000000313131cacacaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3b3b3000000000000020202d5d5d5ffffffffffffffffffffffffffffffe6e6e6000000000000000000404040fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff989898000000d2d2d2fffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfbfdfdfdfffffffffffffffffffffffffefefe2525250000000000001f1f1ff9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeaeaeae2e2e2e030303000000000000060606323232a2a2a2fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcbcbcb3e3e3e080808000000000000020202272727818181f7f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0636363171717000000000000000000181818575757dededeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f000000ddddddffffffffffffffffffffffffffffffffffffffffffd3d3d34646460606060000000000000c0c0c595959a9a9a9fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe545454000000000000000000767676ffffffffffffffffffffffffffffffdadada0000000000000000004f4f4ffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1070707727272fffffffffffffffffffffffffffffffffffffffffff0f0f0292929000000121212d6d6d6ffffffffffffffffffffffff717171000000000000000000b0b0b0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf5f5f5c8c8c8d8d8d8fbfbfbfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfafafad2d2d2ccccccf7f7f7fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfde5e5e5c4c4c4edededfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbdbdb000000808080fffffffffffffffffffffffffffffffffffffffffffffffffdfdfdf9f9f9c9c9c9d8d8d8f9f9f9fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe4b4b4b0000000000000000007c7c7cffffffffffffffffffffffffffffffb6b6b6000000000000000000838383fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe565656191919fbfbfbffffffffffffffffffffffffffffffffffff8a8a8a000000000000000000666666ffffffffffffffffffffffff8d8d8d0000000000000000007e7e7efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe444444252525fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff626262000000040404535353f0f0f0ffffffffffffffffffffffffffffff787878000000000000000000bababaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2b2b2000000b8b8b8ffffffffffffffffffffffffffffffffffff7d7d7d0000000000000000005d5d5dffffffffffffffffffffffff9a9a9a000000000000000000858585ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9f000000e7e7e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2c2c2000000525252fefefeffffffffffffffffffffffffffffffe5e5e50b0b0b000000000000373737fbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafa1414145d5d5dfefefeffffffffffffffffffffffffffffffbababa000000000000191919d8d8d8ffffffffffffffffffffffff777777000000000000000000c2c2c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefed5d5d5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7a7a7a000000979797fefefefffffffffffffefefee2e2e2323232000000000000090909d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7070700a0a0af4f4f4fffffffffffffffffffffffffffffffbfbfb3f3f3f101010cececefffffffffffffffffffffffffbfbfb3a3a3a000000000000555555fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc575757000000373737949494a7a7a76a6a6a141414000000000000252525bdbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000a3a3a3ffffffffffffffffffffffffffffffffffffe4e4e41c1c1c0404046e6e6eb7b7b7ecececbebebe5050500000000000004b4b4bf1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeb9b9b93c3c3c080808000000000000020202272727818181f6f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd2929294d4d4dfefefefffffffffffffffffffffffffffffffffffff5f5f58888882c2c2c000000000000000000000000373737959595fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcf9f9f9d1d1d1ccccccf6f6f6fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585050505e9e9e9fffffffffffffffffffffffffffffffffffffffffffffffffcfcfceeeeeebdbdbdbababae1e1e1fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5e5e5040404909090ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe484848434343fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2e2e2b8b8b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000040000002701ffff030000000000}}}}}\r\n{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\r\n\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\r\n\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\r\n\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\r\n\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}\\pard\\plain\\itap0\\s0\\ilvl0\\fi0\\sb0\\sa0\\aspalpha\\aspnum\\adjustright\\brdrt\\brdrl\\brdrb\\brdrr\\brdrbtw\r\n\\brdrbar\\widctlpar\\ltrpar\\li0\\lin0\\ri0\\rin0\\ql\\faauto\\sl276\\slmult1\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\strike0\\ulnone\\cf1{\\rtlch\\ab0\\ai0\\af2\\afs22\\ltrch\\b0\\i0\\fs22\\loch\\af2\\dbch\\af2\\hich\\f2\\insrsid10976062\\strike0\\ulnone\\cf1\\par}{\r\n\\*\\latentstyles\\lsdstimax267\\lsdlockeddef0\\lsdsemihiddendef0\\lsdunhideuseddef0\\lsdqformatdef0\\lsdprioritydef0{\\lsdlockedexcept\\lsdqformat1 Normal;\\lsdqformat1 heading 1;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 2;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 3;\r\n\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 4;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 5;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 6;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 7;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 8;\r\n\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 heading 9;\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1 caption;\\lsdqformat1 Title;\\lsdqformat1 Subtitle;\\lsdqformat1 Strong;\\lsdqformat1 Emphasis;\\lsdsemihidden1\\lsdpriority99 Placeholder Text;\\lsdqformat1\\lsdpriority1 No Spacing;\r\n\\lsdpriority60 Light Shading;\\lsdpriority61 Light List;\\lsdpriority62 Light Grid;\\lsdpriority63 Medium Shading 1;\\lsdpriority64 Medium Shading 2;\\lsdpriority65 Medium List 1;\\lsdpriority66 Medium List 2;\\lsdpriority67 Medium Grid 1;\\lsdpriority68 Medium Grid 2;\r\n\\lsdpriority69 Medium Grid 3;\\lsdpriority70 Dark List;\\lsdpriority71 Colorful Shading;\\lsdpriority72 Colorful List;\\lsdpriority73 Colorful Grid;\\lsdpriority60 Light Shading Accent 1;\\lsdpriority61 Light List Accent 1;\\lsdpriority62 Light Grid Accent 1;\\lsdpriority63 Medium Shading 1 Accent 1;\r\n\\lsdpriority64 Medium Shading 2 Accent 1;\\lsdpriority65 Medium List 1 Accent 1;\\lsdsemihidden1\\lsdpriority99 Revision;\\lsdqformat1\\lsdpriority34 List Paragraph;\\lsdqformat1\\lsdpriority29 Quote;\\lsdqformat1\\lsdpriority30 Intense Quote;\\lsdpriority66 Medium List 2 Accent 1;\r\n\\lsdpriority67 Medium Grid 1 Accent 1;\\lsdpriority68 Medium Grid 2 Accent 1;\\lsdpriority69 Medium Grid 3 Accent 1;\\lsdpriority70 Dark List Accent 1;\\lsdpriority71 Colorful Shading Accent 1;\\lsdpriority72 Colorful List Accent 1;\\lsdpriority73 Colorful Grid Accent 1;\r\n\\lsdpriority60 Light Shading Accent 2;\\lsdpriority61 Light List Accent 2;\\lsdpriority62 Light Grid Accent 2;\\lsdpriority63 Medium Shading 1 Accent 2;\\lsdpriority64 Medium Shading 2 Accent 2;\\lsdpriority65 Medium List 1 Accent 2;\\lsdpriority66 Medium List 2 Accent 2;\r\n\\lsdpriority67 Medium Grid 1 Accent 2;\\lsdpriority68 Medium Grid 2 Accent 2;\\lsdpriority69 Medium Grid 3 Accent 2;\\lsdpriority70 Dark List Accent 2;\\lsdpriority71 Colorful Shading Accent 2;\\lsdpriority72 Colorful List Accent 2;\\lsdpriority73 Colorful Grid Accent 2;\r\n\\lsdpriority60 Light Shading Accent 3;\\lsdpriority61 Light List Accent 3;\\lsdpriority62 Light Grid Accent 3;\\lsdpriority63 Medium Shading 1 Accent 3;\\lsdpriority64 Medium Shading 2 Accent 3;\\lsdpriority65 Medium List 1 Accent 3;\\lsdpriority66 Medium List 2 Accent 3;\r\n\\lsdpriority67 Medium Grid 1 Accent 3;\\lsdpriority68 Medium Grid 2 Accent 3;\\lsdpriority69 Medium Grid 3 Accent 3;\\lsdpriority70 Dark List Accent 3;\\lsdpriority71 Colorful Shading Accent 3;\\lsdpriority72 Colorful List Accent 3;\\lsdpriority73 Colorful Grid Accent 3;\r\n\\lsdpriority60 Light Shading Accent 4;\\lsdpriority61 Light List Accent 4;\\lsdpriority62 Light Grid Accent 4;\\lsdpriority63 Medium Shading 1 Accent 4;\\lsdpriority64 Medium Shading 2 Accent 4;\\lsdpriority65 Medium List 1 Accent 4;\\lsdpriority66 Medium List 2 Accent 4;\r\n\\lsdpriority67 Medium Grid 1 Accent 4;\\lsdpriority68 Medium Grid 2 Accent 4;\\lsdpriority69 Medium Grid 3 Accent 4;\\lsdpriority70 Dark List Accent 4;\\lsdpriority71 Colorful Shading Accent 4;\\lsdpriority72 Colorful List Accent 4;\\lsdpriority73 Colorful Grid Accent 4;\r\n\\lsdpriority60 Light Shading Accent 5;\\lsdpriority61 Light List Accent 5;\\lsdpriority62 Light Grid Accent 5;\\lsdpriority63 Medium Shading 1 Accent 5;\\lsdpriority64 Medium Shading 2 Accent 5;\\lsdpriority65 Medium List 1 Accent 5;\\lsdpriority66 Medium List 2 Accent 5;\r\n\\lsdpriority67 Medium Grid 1 Accent 5;\\lsdpriority68 Medium Grid 2 Accent 5;\\lsdpriority69 Medium Grid 3 Accent 5;\\lsdpriority70 Dark List Accent 5;\\lsdpriority71 Colorful Shading Accent 5;\\lsdpriority72 Colorful List Accent 5;\\lsdpriority73 Colorful Grid Accent 5;\r\n\\lsdpriority60 Light Shading Accent 6;\\lsdpriority61 Light List Accent 6;\\lsdpriority62 Light Grid Accent 6;\\lsdpriority63 Medium Shading 1 Accent 6;\\lsdpriority64 Medium Shading 2 Accent 6;\\lsdpriority65 Medium List 1 Accent 6;\\lsdpriority66 Medium List 2 Accent 6;\r\n\\lsdpriority67 Medium Grid 1 Accent 6;\\lsdpriority68 Medium Grid 2 Accent 6;\\lsdpriority69 Medium Grid 3 Accent 6;\\lsdpriority70 Dark List Accent 6;\\lsdpriority71 Colorful Shading Accent 6;\\lsdpriority72 Colorful List Accent 6;\\lsdpriority73 Colorful Grid Accent 6;\r\n\\lsdqformat1\\lsdpriority19 Subtle Emphasis;\\lsdqformat1\\lsdpriority21 Intense Emphasis;\\lsdqformat1\\lsdpriority31 Subtle Reference;\\lsdqformat1\\lsdpriority32 Intense Reference;\\lsdqformat1\\lsdpriority33 Book Title;\\lsdsemihidden1\\lsdunhideused1\\lsdpriority37 Bibliography;\r\n\\lsdsemihidden1\\lsdunhideused1\\lsdqformat1\\lsdpriority39 TOC Heading;}}}"
  },
  {
    "path": "backend/tests/unit_tests/fixtures/sample.txt",
    "content": "﻿🦜️ LangChain\r\n\r\n\r\n\r\n\r\nUnderline\r\n\r\n\r\nBold\r\n\r\n\r\nItalics\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tCol 1\r\n\tCol 2\r\n\tRow 1\r\n\t1\r\n\t2\r\n\tRow 2\r\n\t3\r\n\t4\r\n\t\r\n\r\n\r\n\r\nLink: https://www.langchain.com/\r\n\r\n\r\n\r\n\r\n* Item 1\r\n* Item 2\r\n* Item 3\r\n* We also love cats 🐱\r\n\r\n\r\nImage"
  },
  {
    "path": "backend/tests/unit_tests/test_imports.py",
    "content": "\"\"\"Shallow tests that make sure we can at least import the code.\"\"\"\n\n\ndef test_import_app() -> None:\n    \"\"\"Test import app\"\"\"\n    import app  # noqa: F401\n"
  },
  {
    "path": "backend/tests/unit_tests/utils.py",
    "content": "\"\"\"Test ingestion utilities.\"\"\"\nfrom typing import Any, Dict, Iterable, List, Optional, Sequence, Type\n\nfrom langchain.schema import Document\nfrom langchain.schema.embeddings import Embeddings\nfrom langchain.schema.vectorstore import VST, VectorStore\n\n\nclass InMemoryVectorStore(VectorStore):\n    \"\"\"In-memory implementation of VectorStore using a dictionary.\"\"\"\n\n    def __init__(self) -> None:\n        \"\"\"Vector store interface for testing things in memory.\"\"\"\n        self.store: Dict[str, Document] = {}\n\n    def delete(self, ids: Optional[Sequence[str]] = None, **kwargs: Any) -> None:\n        \"\"\"Delete the given documents from the store using their IDs.\"\"\"\n        if ids:\n            for _id in ids:\n                self.store.pop(_id, None)\n\n    async def adelete(self, ids: Optional[Sequence[str]] = None, **kwargs: Any) -> None:\n        \"\"\"Delete the given documents from the store using their IDs.\"\"\"\n        if ids:\n            for _id in ids:\n                self.store.pop(_id, None)\n\n    def add_documents(\n        self,\n        documents: Sequence[Document],\n        *,\n        ids: Optional[Sequence[str]] = None,\n        **kwargs: Any,\n    ) -> List[str]:\n        \"\"\"Add the given documents to the store (insert behavior).\"\"\"\n        if ids and len(ids) != len(documents):\n            raise ValueError(\n                f\"Expected {len(ids)} ids, got {len(documents)} documents.\"\n            )\n\n        if not ids:\n            start_idx = max(self.store.keys(), default=0)\n            ids = [str(x) for x in (range(start_idx, start_idx + len(documents)))]\n\n        for _id, document in zip(ids, documents):\n            if _id in self.store:\n                raise ValueError(\n                    f\"Document with uid {_id} already exists in the store.\"\n                )\n            self.store[_id] = document\n        return ids\n\n    async def aadd_documents(\n        self,\n        documents: Sequence[Document],\n        *,\n        ids: Optional[Sequence[str]] = None,\n        **kwargs: Any,\n    ) -> List[str]:\n        if ids and len(ids) != len(documents):\n            raise ValueError(\n                f\"Expected {len(ids)} ids, got {len(documents)} documents.\"\n            )\n\n        if not ids:\n            start_idx = max(self.store.keys(), default=0)\n            ids = [str(x) for x in (range(start_idx, start_idx + len(documents)))]\n\n        for _id, document in zip(ids, documents):\n            if _id in self.store:\n                raise ValueError(\n                    f\"Document with uid {_id} already exists in the store.\"\n                )\n            self.store[_id] = document\n        return list(ids)\n\n    def add_texts(\n        self,\n        texts: Iterable[str],\n        metadatas: Optional[List[Dict[Any, Any]]] = None,\n        **kwargs: Any,\n    ) -> List[str]:\n        \"\"\"Add the given texts to the store (insert behavior).\"\"\"\n\n        raise NotImplementedError()\n\n    @classmethod\n    def from_texts(\n        cls: Type[VST],\n        texts: List[str],\n        embedding: Embeddings,\n        metadatas: Optional[List[Dict[Any, Any]]] = None,\n        **kwargs: Any,\n    ) -> VST:\n        \"\"\"Create a vector store from a list of texts.\"\"\"\n        raise NotImplementedError()\n\n    def similarity_search(\n        self, query: str, k: int = 4, **kwargs: Any\n    ) -> List[Document]:\n        \"\"\"Find the most similar documents to the given query.\"\"\"\n        raise NotImplementedError()\n"
  },
  {
    "path": "docker-compose-prod.yml",
    "content": "version: \"3\"\n\nservices:\n  postgres:\n    image: pgvector/pgvector:pg16\n    healthcheck:\n      test: pg_isready -U $POSTGRES_USER\n      start_interval: 1s\n      start_period: 5s\n      interval: 5s\n      retries: 5\n    ports:\n      - \"5433:5432\"\n    env_file:\n      - .env\n    volumes:\n      - ./postgres-volume:/var/lib/postgresql/data\n  postgres-setup:\n    image: migrate/migrate\n    depends_on:\n      postgres:\n        condition: service_healthy\n    volumes:\n      - ./backend/migrations:/migrations\n    env_file:\n      - .env\n    command: [\"-path\", \"/migrations\", \"-database\", \"postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@postgres:$POSTGRES_PORT/$POSTGRES_DB?sslmode=disable\", \"up\"]\n  backend:\n    container_name: opengpts-backend\n    image: docker.io/langchain/open-gpts:latest\n    ports:\n      - \"8100:8000\" # Backend is accessible on localhost:8100 and serves the frontend\n    depends_on:\n      postgres-setup:\n        condition: service_completed_successfully\n    env_file:\n      - .env\n    environment:\n      POSTGRES_HOST: \"postgres\"\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: \"3\"\n\nservices:\n  postgres:\n    image: pgvector/pgvector:pg16\n    healthcheck:\n      test: pg_isready -U $POSTGRES_USER\n      start_interval: 1s\n      start_period: 5s\n      interval: 5s\n      retries: 5\n    ports:\n      - \"5433:5432\"\n    env_file:\n      - .env\n    volumes:\n      - ./postgres-volume:/var/lib/postgresql/data\n  postgres-setup:\n    image: migrate/migrate\n    depends_on:\n      postgres:\n        condition: service_healthy\n    volumes:\n      - ./backend/migrations:/migrations\n    env_file:\n      - .env\n    command: [\"-path\", \"/migrations\", \"-database\", \"postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@postgres:$POSTGRES_PORT/$POSTGRES_DB?sslmode=disable\", \"up\"]\n  backend:\n    container_name: opengpts-backend\n    build:\n      context: backend\n    ports:\n      - \"8100:8000\" # Backend is accessible on localhost:8100\n    depends_on:\n      postgres-setup:\n        condition: service_completed_successfully\n    env_file:\n      - .env\n    volumes:\n      - ./backend:/backend\n    environment:\n      POSTGRES_HOST: \"postgres\"\n    command:\n      - --reload\n  frontend:\n    container_name: opengpts-frontend\n    build:\n      context: frontend\n    depends_on:\n      backend:\n        condition: service_healthy\n    volumes:\n      - ./frontend/src:/frontend/src\n    ports:\n      - \"5173:5173\" # Frontend is accessible on localhost:5173\n    environment:\n      VITE_BACKEND_URL: \"http://backend:8000\"\n"
  },
  {
    "path": "frontend/.eslintrc.cjs",
    "content": "module.exports = {\n  root: true,\n  env: { browser: true, es2020: true },\n  extends: [\n    \"eslint:recommended\",\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:react-hooks/recommended\",\n  ],\n  ignorePatterns: [\"dist\", \".eslintrc.cjs\"],\n  parser: \"@typescript-eslint/parser\",\n  plugins: [\"react-refresh\"],\n  rules: {\n    \"react-refresh/only-export-components\": [\n      \"warn\",\n      { allowConstantExport: true },\n    ],\n    \"@typescript-eslint/no-unused-vars\": 0,\n  },\n};\n"
  },
  {
    "path": "frontend/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "frontend/Dockerfile",
    "content": "# Frontend Dockerfile\nFROM node:20\n\n# Set the working directory\nWORKDIR /frontend\n\n# Copy the package.json and yarn.lock\nCOPY ./package.json ./\nCOPY ./yarn.lock ./\n\n# Install Yarn and dependencies\nRUN yarn install\n\n# Copy the rest of the frontend code\nCOPY . .\n\n# Expose the port the frontend runs on\nEXPOSE 5173\n\n# Command to start the frontend\nCMD [\"yarn\", \"dev\"]\n"
  },
  {
    "path": "frontend/README.md",
    "content": "# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\n   parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n   },\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n"
  },
  {
    "path": "frontend/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>OpenGPTs</title>\n    <link rel=\"stylesheet\" href=\"https://rsms.me/inter/inter.css\">\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "frontend/package.json",
    "content": "{\n  \"name\": \"frontend\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"packageManager\": \"yarn@1.22.19\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite --host\",\n    \"build\": \"tsc && vite build\",\n    \"lint\": \"prettier -c src && tsc --noEmit && eslint src --ext ts,tsx --report-unused-disable-directives\",\n    \"preview\": \"vite preview\",\n    \"format\": \"prettier -w src\"\n  },\n  \"dependencies\": {\n    \"@codemirror/lang-json\": \"^6.0.1\",\n    \"@headlessui/react\": \"^1.7.17\",\n    \"@heroicons/react\": \"^2.0.18\",\n    \"@microsoft/fetch-event-source\": \"^2.0.1\",\n    \"@tailwindcss/forms\": \"^0.5.6\",\n    \"@tailwindcss/typography\": \"^0.5.10\",\n    \"@uiw/react-codemirror\": \"^4.21.25\",\n    \"clsx\": \"^2.0.0\",\n    \"dompurify\": \"^3.0.6\",\n    \"lodash\": \"^4.17.21\",\n    \"marked\": \"^9.1.5\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-dropzone\": \"^14.2.3\",\n    \"react-query\": \"^3.39.3\",\n    \"react-router-dom\": \"^6.22.3\",\n    \"tailwind-merge\": \"^2.0.0\",\n    \"uuid\": \"^9.0.1\"\n  },\n  \"devDependencies\": {\n    \"@types/dompurify\": \"^3.0.4\",\n    \"@types/lodash\": \"^4.14.201\",\n    \"@types/react\": \"^18.2.15\",\n    \"@types/react-dom\": \"^18.2.7\",\n    \"@types/uuid\": \"^9.0.8\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n    \"@typescript-eslint/parser\": \"^6.0.0\",\n    \"@vitejs/plugin-react\": \"^4.0.3\",\n    \"autoprefixer\": \"^10.4.16\",\n    \"eslint\": \"^8.45.0\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-refresh\": \"^0.4.3\",\n    \"postcss\": \"^8.4.31\",\n    \"prettier\": \"^3.2.5\",\n    \"tailwindcss\": \"^3.3.5\",\n    \"typescript\": \"^5.0.2\",\n    \"vite\": \"^4.4.5\"\n  }\n}\n"
  },
  {
    "path": "frontend/postcss.config.js",
    "content": "export default {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "frontend/src/App.tsx",
    "content": "import { useCallback, useState } from \"react\";\nimport { InformationCircleIcon } from \"@heroicons/react/24/outline\";\nimport { Chat } from \"./components/Chat\";\nimport { ChatList } from \"./components/ChatList\";\nimport { Layout } from \"./components/Layout\";\nimport { NewChat } from \"./components/NewChat\";\nimport { useChatList } from \"./hooks/useChatList\";\nimport { useSchemas } from \"./hooks/useSchemas\";\nimport { useStreamState } from \"./hooks/useStreamState\";\nimport {\n  useConfigList,\n  Config as ConfigInterface,\n} from \"./hooks/useConfigList\";\nimport { Config } from \"./components/Config\";\nimport { MessageWithFiles } from \"./utils/formTypes.ts\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useThreadAndAssistant } from \"./hooks/useThreadAndAssistant.ts\";\nimport { Message } from \"./types.ts\";\nimport { OrphanChat } from \"./components/OrphanChat.tsx\";\n\nfunction App(props: { edit?: boolean }) {\n  const navigate = useNavigate();\n  const [sidebarOpen, setSidebarOpen] = useState(false);\n  const { chats, createChat, updateChat, deleteChat } = useChatList();\n  const { configs, saveConfig, deleteConfig } = useConfigList();\n  const { startStream, stopStream, stream } = useStreamState();\n  const { configSchema, configDefaults } = useSchemas();\n\n  const { currentChat, assistantConfig, isLoading } = useThreadAndAssistant();\n\n  const startTurn = useCallback(\n    async (\n      message: MessageWithFiles | null,\n      thread_id: string,\n      assistantType: string,\n      config?: Record<string, unknown>,\n    ) => {\n      const files = message?.files || [];\n      if (files.length > 0) {\n        const formData = files.reduce((formData, file) => {\n          formData.append(\"files\", file);\n          return formData;\n        }, new FormData());\n        formData.append(\n          \"config\",\n          JSON.stringify({ configurable: { thread_id } }),\n        );\n        await fetch(`/ingest`, {\n          method: \"POST\",\n          body: formData,\n        });\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      let input: Message[] | Record<string, any> | null = null;\n\n      if (message) {\n        // Set the input to an array of messages. This is the default input\n        // format for all assistant types.\n        input = [\n          {\n            content: message.message,\n            additional_kwargs: {},\n            type: \"human\",\n            example: false,\n            id: `human-${Math.random()}`,\n          },\n        ];\n\n        if (assistantType === \"chat_retrieval\") {\n          // The RAG assistant type requires an object with a `messages` field.\n          input = {\n            messages: input,\n          };\n        }\n      }\n\n      await startStream(input, thread_id, config);\n    },\n    [startStream],\n  );\n\n  const startChat = useCallback(\n    async (config: ConfigInterface, message: MessageWithFiles) => {\n      const chat = await createChat(message.message, config.assistant_id);\n      navigate(`/thread/${chat.thread_id}`);\n      const assistantType = config.config.configurable?.type as string;\n      return startTurn(message, chat.thread_id, assistantType);\n    },\n    [createChat, navigate, startTurn],\n  );\n\n  const selectChat = useCallback(\n    async (id: string | null) => {\n      if (currentChat) {\n        stopStream?.(true);\n      }\n      if (!id) {\n        const firstAssistant = configs?.[0]?.assistant_id ?? null;\n        navigate(firstAssistant ? `/assistant/${firstAssistant}` : \"/\");\n        window.scrollTo({ top: 0 });\n      } else {\n        navigate(`/thread/${id}`);\n      }\n      if (sidebarOpen) {\n        setSidebarOpen(false);\n      }\n    },\n    [currentChat, sidebarOpen, stopStream, configs, navigate],\n  );\n\n  const selectConfig = useCallback(\n    (id: string | null) => {\n      navigate(id ? `/assistant/${id}` : \"/\");\n    },\n    [navigate],\n  );\n\n  return (\n    <Layout\n      subtitle={\n        assistantConfig ? (\n          <span className=\"inline-flex gap-1 items-center\">\n            {assistantConfig.name}\n            <InformationCircleIcon\n              className=\"h-5 w-5 cursor-pointer text-indigo-600\"\n              onClick={() => {\n                selectConfig(assistantConfig.assistant_id);\n              }}\n            />\n          </span>\n        ) : null\n      }\n      sidebarOpen={sidebarOpen}\n      setSidebarOpen={setSidebarOpen}\n      sidebar={\n        <ChatList\n          chats={chats}\n          configs={configs}\n          enterChat={selectChat}\n          deleteChat={deleteChat}\n          enterConfig={selectConfig}\n        />\n      }\n    >\n      {currentChat && assistantConfig && (\n        <Chat startStream={startTurn} stopStream={stopStream} stream={stream} />\n      )}\n      {currentChat && !assistantConfig && (\n        <OrphanChat chat={currentChat} updateChat={updateChat} />\n      )}\n      {!currentChat && assistantConfig && !props.edit && (\n        <NewChat\n          startChat={startChat}\n          configSchema={configSchema}\n          configDefaults={configDefaults}\n          configs={configs}\n          saveConfig={saveConfig}\n          enterConfig={selectConfig}\n          deleteConfig={deleteConfig}\n        />\n      )}\n      {!currentChat && assistantConfig && props.edit && (\n        <Config\n          className=\"mb-6\"\n          config={assistantConfig}\n          configSchema={configSchema}\n          configDefaults={configDefaults}\n          saveConfig={saveConfig}\n          enterConfig={selectConfig}\n          edit={props.edit}\n        />\n      )}\n      {!currentChat && !assistantConfig && !isLoading && (\n        <Config\n          className=\"mb-6\"\n          config={null}\n          configSchema={configSchema}\n          configDefaults={configDefaults}\n          saveConfig={saveConfig}\n          enterConfig={selectConfig}\n        />\n      )}\n      {isLoading && <div>Loading...</div>}\n    </Layout>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "frontend/src/api/assistants.ts",
    "content": "import { Config } from \"../hooks/useConfigList\";\n\nexport async function getAssistant(\n  assistantId: string,\n): Promise<Config | null> {\n  try {\n    const response = await fetch(`/assistants/${assistantId}`);\n    if (!response.ok) {\n      return null;\n    }\n    return (await response.json()) as Config;\n  } catch (error) {\n    console.error(\"Failed to fetch assistant:\", error);\n    return null;\n  }\n}\n\nexport async function getAssistants(): Promise<Config[] | null> {\n  try {\n    const response = await fetch(`/assistants/`);\n    if (!response.ok) {\n      return null;\n    }\n    return (await response.json()) as Config[];\n  } catch (error) {\n    console.error(\"Failed to fetch assistants:\", error);\n    return null;\n  }\n}\n"
  },
  {
    "path": "frontend/src/api/threads.ts",
    "content": "import { Chat } from \"../types\";\n\nexport async function getThread(threadId: string): Promise<Chat | null> {\n  try {\n    const response = await fetch(`/threads/${threadId}`);\n    if (!response.ok) {\n      return null;\n    }\n    return (await response.json()) as Chat;\n  } catch (error) {\n    console.error(\"Failed to fetch assistant:\", error);\n    return null;\n  }\n}\n"
  },
  {
    "path": "frontend/src/components/Chat.tsx",
    "content": "import { useEffect, useRef, useState } from \"react\";\nimport { StreamStateProps } from \"../hooks/useStreamState\";\nimport { useChatMessages } from \"../hooks/useChatMessages\";\nimport TypingBox from \"./TypingBox\";\nimport { MessageViewer } from \"./Message\";\nimport {\n  ArrowDownCircleIcon,\n  CheckCircleIcon,\n} from \"@heroicons/react/24/outline\";\nimport { MessageWithFiles } from \"../utils/formTypes.ts\";\nimport { useParams } from \"react-router-dom\";\nimport { useThreadAndAssistant } from \"../hooks/useThreadAndAssistant.ts\";\nimport { useMessageEditing } from \"../hooks/useMessageEditing.ts\";\nimport { MessageEditor } from \"./MessageEditor.tsx\";\nimport { Message } from \"../types.ts\";\n\ninterface ChatProps extends Pick<StreamStateProps, \"stream\" | \"stopStream\"> {\n  startStream: (\n    message: MessageWithFiles | null,\n    thread_id: string,\n    assistantType: string,\n  ) => Promise<void>;\n}\n\nfunction usePrevious<T>(value: T): T | undefined {\n  const ref = useRef<T>();\n  useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n}\n\nfunction CommitEdits(props: {\n  editing: Record<string, Message>;\n  commitEdits: () => Promise<void>;\n}) {\n  const [inflight, setInflight] = useState(false);\n  return (\n    <div className=\"bg-blue-50 text-blue-800 rounded-md ring-1 ring-inset ring-blue-800/60 flex flex-row h-9 items-center\">\n      <div className=\"flex-1 rounded-l-md pl-4\">\n        {Object.keys(props.editing).length} message(s) edited.\n      </div>\n      <button\n        onClick={async () => {\n          setInflight(true);\n          await props.commitEdits();\n          setInflight(false);\n        }}\n        className={\n          \"self-stretch -ml-px inline-flex items-center gap-x-1.5 rounded-r-md px-3 \" +\n          \"text-sm font-semibold ring-1 ring-inset ring-blue-800/60 hover:bg-blue-100 \"\n        }\n      >\n        <CheckCircleIcon\n          className=\"w-6 h-6 cursor-pointer stroke-2 opacity-80 hover:opacity-100 transition-opacity duration-100\"\n          onMouseUp={props.commitEdits}\n        />\n\n        {inflight ? \"Saving...\" : \"Save\"}\n      </button>\n    </div>\n  );\n}\n\nexport function Chat(props: ChatProps) {\n  const { chatId } = useParams();\n  const { messages, next, refreshMessages } = useChatMessages(\n    chatId ?? null,\n    props.stream,\n    props.stopStream,\n  );\n  const { currentChat, assistantConfig, isLoading } = useThreadAndAssistant();\n  const { editing, recordEdits, commitEdits, abandonEdits } = useMessageEditing(\n    chatId,\n    refreshMessages,\n  );\n\n  const prevMessages = usePrevious(messages);\n  useEffect(() => {\n    scrollTo({\n      top: document.body.scrollHeight,\n      behavior:\n        prevMessages && prevMessages?.length === messages?.length\n          ? \"smooth\"\n          : undefined,\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [messages]);\n\n  if (isLoading) return <div>Loading...</div>;\n  if (!currentChat || !assistantConfig) return <div>No data.</div>;\n\n  return (\n    <div className=\"flex-1 flex flex-col items-stretch pb-[76px] pt-2\">\n      {messages?.map((msg, i) =>\n        editing[msg.id] ? (\n          <MessageEditor\n            key={msg.id}\n            message={editing[msg.id]}\n            onUpdate={recordEdits}\n            abandonEdits={() => abandonEdits(msg)}\n          />\n        ) : (\n          <MessageViewer\n            {...msg}\n            key={msg.id}\n            runId={\n              i === messages.length - 1 && props.stream?.status === \"done\"\n                ? props.stream?.run_id\n                : undefined\n            }\n            startEditing={() => recordEdits(msg)}\n            alwaysShowControls={i === messages.length - 1}\n          />\n        ),\n      )}\n      {(props.stream?.status === \"inflight\" || messages === null) && (\n        <div className=\"leading-6 mb-2 animate-pulse font-black text-gray-400 text-lg\">\n          ...\n        </div>\n      )}\n      {props.stream?.status === \"error\" && (\n        <div className=\"flex items-center rounded-md bg-yellow-50 px-2 py-1 text-xs font-medium text-yellow-800 ring-1 ring-inset ring-yellow-600/20\">\n          An error has occurred. Please try again.\n        </div>\n      )}\n      {next.length > 0 &&\n        props.stream?.status !== \"inflight\" &&\n        Object.keys(editing).length === 0 && (\n          <div\n            className=\"flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-800 ring-1 ring-inset ring-yellow-600/20 cursor-pointer\"\n            onClick={() =>\n              props.startStream(\n                null,\n                currentChat.thread_id,\n                assistantConfig.config.configurable?.type as string,\n              )\n            }\n          >\n            <ArrowDownCircleIcon className=\"h-5 w-5 mr-1\" />\n            Click to continue.\n          </div>\n        )}\n      <div className=\"fixed left-0 lg:left-72 bottom-0 right-0 p-4\">\n        {commitEdits && Object.keys(editing).length > 0 ? (\n          <CommitEdits editing={editing} commitEdits={commitEdits} />\n        ) : (\n          <TypingBox\n            onSubmit={(msg) =>\n              props.startStream(\n                msg,\n                currentChat.thread_id,\n                assistantConfig.config.configurable?.type as string,\n              )\n            }\n            onInterrupt={\n              props.stream?.status === \"inflight\" ? props.stopStream : undefined\n            }\n            inflight={props.stream?.status === \"inflight\"}\n            currentConfig={assistantConfig}\n            currentChat={currentChat}\n          />\n        )}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/ChatList.tsx",
    "content": "import { PlusIcon, EllipsisVerticalIcon } from \"@heroicons/react/24/outline\";\nimport { useState, useEffect } from \"react\";\n\nimport { ChatListProps } from \"../hooks/useChatList\";\nimport { cn } from \"../utils/cn\";\nimport { useThreadAndAssistant } from \"../hooks/useThreadAndAssistant.ts\";\nimport { ConfigListProps } from \"../hooks/useConfigList.ts\";\n\nexport function ChatList(props: {\n  chats: ChatListProps[\"chats\"];\n  configs: ConfigListProps[\"configs\"];\n  enterChat: (id: string | null) => void;\n  deleteChat: (id: string) => void;\n  enterConfig: (id: string | null) => void;\n}) {\n  const { currentChat, assistantConfig } = useThreadAndAssistant();\n\n  // State for tracking which chat's menu is visible\n  const [visibleMenu, setVisibleMenu] = useState<string | null>(null);\n\n  // Event listener to close the menu when clicking outside of it\n  useEffect(() => {\n    const closeMenu = () => setVisibleMenu(null);\n    window.addEventListener(\"click\", closeMenu);\n    return () => window.removeEventListener(\"click\", closeMenu);\n  }, []);\n\n  return (\n    <>\n      <div\n        onClick={() => props.enterChat(null)}\n        className={cn(\n          !currentChat && assistantConfig\n            ? \"bg-gray-50 text-indigo-600\"\n            : \"text-gray-700 hover:text-indigo-600 hover:bg-gray-50\",\n          \"group flex gap-x-3 rounded-md -mx-2 p-2 leading-6 font-semibold cursor-pointer\",\n        )}\n      >\n        <span\n          className={cn(\n            !currentChat && assistantConfig\n              ? \"text-indigo-600 border-indigo-600\"\n              : \"text-gray-400 border-gray-200 group-hover:border-indigo-600 group-hover:text-indigo-600\",\n            \"flex h-6 w-6 shrink-0 items-center justify-center rounded-lg border text-[0.625rem] font-medium bg-white\",\n          )}\n        >\n          <PlusIcon className=\"h-4 w-4\" />\n        </span>\n        <span className=\"truncate\">New Chat</span>\n      </div>\n\n      <div\n        onClick={() => props.enterConfig(null)}\n        className={cn(\n          !assistantConfig\n            ? \"bg-gray-50 text-indigo-600\"\n            : \"text-gray-700 hover:text-indigo-600 hover:bg-gray-50\",\n          \"mt-1 group flex gap-x-3 rounded-md -mx-2 p-2 leading-6 font-semibold cursor-pointer\",\n        )}\n      >\n        <span\n          className={cn(\n            !assistantConfig\n              ? \"text-indigo-600 border-indigo-600\"\n              : \"text-gray-400 border-gray-200 group-hover:border-indigo-600 group-hover:text-indigo-600\",\n            \"flex h-6 w-6 shrink-0 items-center justify-center rounded-lg border text-[0.625rem] font-medium bg-white\",\n          )}\n        >\n          <PlusIcon className=\"h-4 w-4\" />\n        </span>\n        <span className=\"truncate\">New Bot</span>\n      </div>\n\n      <div className=\"text-xs font-semibold leading-6 text-gray-400 mt-4\">\n        Your chats\n      </div>\n      <ul role=\"list\" className=\"-mx-2 mt-2 space-y-1\">\n        {props.chats?.map((chat) => (\n          <li\n            key={chat.thread_id}\n            className={cn(\n              chat.thread_id === currentChat?.thread_id\n                ? \"bg-gray-50 text-indigo-600\"\n                : \"text-gray-700 hover:text-indigo-600 hover:bg-gray-50\",\n              \"flex justify-between items-center p-2 rounded-md hover:bg-gray-50 cursor-pointer\",\n            )}\n          >\n            <div\n              onClick={() => props.enterChat(chat.thread_id)}\n              className={cn(\n                \"group flex items-center gap-x-3 rounded-md px-2 leading-6 cursor-pointer flex-grow min-w-0\",\n              )}\n            >\n              <span\n                className={cn(\n                  chat.thread_id === currentChat?.thread_id\n                    ? \"text-indigo-600 border-indigo-600\"\n                    : \"text-gray-400 border-gray-200 group-hover:border-indigo-600 group-hover:text-indigo-600\",\n                  \"flex h-6 w-6 shrink-0 items-center justify-center rounded-lg border text-[0.625rem] font-medium bg-white\",\n                )}\n              >\n                {chat.name?.[0] ?? \" \"}\n              </span>\n              <div className=\"flex flex-col truncate\">\n                <span className=\"truncate flex-grow min-w-0\">{chat.name}</span>\n                <span className=\"truncate flex-grow min-w-0 text-xs text-gray-400\">\n                  {\n                    props.configs?.find(\n                      (config) => config.assistant_id === chat.assistant_id,\n                    )?.name\n                  }\n                </span>\n              </div>\n            </div>\n            {/* Ellipsis Button */}\n            <button\n              onClick={(event) => {\n                event.stopPropagation(); // Prevent triggering click for the chat item\n                setVisibleMenu(\n                  visibleMenu === chat.thread_id ? null : chat.thread_id,\n                );\n              }}\n              className=\"p-1 rounded-full hover:bg-gray-200\"\n            >\n              <EllipsisVerticalIcon className=\"h-5 w-5\" />\n            </button>\n            {/* Menu Dropdown */}\n            {visibleMenu === chat.thread_id && (\n              <div className=\"origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none z-10\">\n                <div\n                  className=\"py-1\"\n                  role=\"menu\"\n                  aria-orientation=\"vertical\"\n                  aria-labelledby=\"options-menu\"\n                >\n                  <a\n                    href=\"#\"\n                    className=\"text-gray-700 block px-4 py-2 text-sm hover:bg-gray-100\"\n                    role=\"menuitem\"\n                    onClick={(event) => {\n                      event.preventDefault();\n                      if (\n                        window.confirm(\n                          `Are you sure you want to delete chat \"${chat.name}\"?`,\n                        )\n                      ) {\n                        props.deleteChat(chat.thread_id);\n                      }\n                    }}\n                  >\n                    Delete\n                  </a>\n                </div>\n              </div>\n            )}\n          </li>\n        )) ?? (\n          <li className=\"leading-6 p-2 animate-pulse font-black text-gray-400 text-lg\">\n            ...\n          </li>\n        )}\n      </ul>\n    </>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/Config.tsx",
    "content": "import { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { ShareIcon } from \"@heroicons/react/24/outline\";\nimport { useDropzone } from \"react-dropzone\";\nimport { orderBy, last } from \"lodash\";\nimport { v4 as uuidv4 } from \"uuid\";\n\nimport {\n  ConfigListProps,\n  Config as ConfigInterface,\n} from \"../hooks/useConfigList\";\nimport { SchemaField, Schemas } from \"../hooks/useSchemas\";\nimport { cn } from \"../utils/cn\";\nimport { FileUploadDropzone } from \"./FileUpload\";\nimport { Combobox, Disclosure, Switch, Transition } from \"@headlessui/react\";\nimport { DROPZONE_CONFIG, TYPES } from \"../constants\";\nimport { Tool, ToolConfig, ToolSchema } from \"../utils/formTypes.ts\";\nimport { useToolsSchemas } from \"../hooks/useToolsSchemas.ts\";\nimport {\n  ChevronUpDownIcon,\n  TrashIcon,\n  PlusIcon,\n  MinusIcon,\n  RocketLaunchIcon,\n} from \"@heroicons/react/20/solid\";\nimport { marked } from \"marked\";\n\nfunction Types(props: {\n  field: SchemaField;\n  value: string;\n  readonly: boolean;\n  setValue: (value: string) => void;\n  alwaysExpanded?: boolean;\n}) {\n  const options =\n    props.field.enum?.map((id) => TYPES[id as keyof typeof TYPES]) ?? [];\n  return (\n    <div className=\"-mx-8 mt-6 pt-4 border-t-2 border-dotted mb-8\">\n      <div className=\"mx-8 md:hidden\">\n        <label htmlFor=\"tabs\" className=\"sr-only\">\n          Select a tab\n        </label>\n        <select\n          id=\"tabs\"\n          name=\"tabs\"\n          className={cn(\n            \"block w-full rounded-md border-gray-300 focus:border-indigo-500 focus:ring-indigo-500\",\n          )}\n          defaultValue={options.find((o) => o.id === props.value)?.id}\n          onChange={(e) => props.setValue(e.target.value)}\n          disabled={props.readonly}\n        >\n          {options.map((option) => (\n            <option key={option.id}>{option.title}</option>\n          ))}\n        </select>\n      </div>\n      <div className=\"mx-8 hidden md:block\">\n        <div className=\"border-b border-gray-200\">\n          <nav className=\"-mb-px flex\" aria-label=\"Tabs\">\n            {options.map((option) => (\n              <div\n                key={option.id}\n                className={cn(\n                  props.value === option.id\n                    ? \"border-indigo-500 text-indigo-600\"\n                    : \"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700\",\n                  \"w-1/4 border-b-2 py-4 px-1 text-center text-sm font-medium\",\n                  props.readonly\n                    ? props.value === option.id\n                      ? \"cursor-default\"\n                      : \"cursor-default opacity-50 pointer-events-none\"\n                    : \"cursor-pointer\",\n                )}\n                aria-current={props.value === option.id ? \"page\" : undefined}\n                onClick={\n                  !props.readonly ? () => props.setValue(option.id) : undefined\n                }\n                aria-disabled={props.readonly}\n              >\n                {option.title}\n              </div>\n            ))}\n          </nav>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction Label(props: { id?: string; title: string; description?: string }) {\n  return (\n    <label\n      htmlFor={props.id}\n      className=\"flex flex-col font-medium leading-6 text-gray-400 mb-2\"\n    >\n      <div>{props.title}</div>\n      {props.description && (\n        <div className=\"font-normal text-sm text-gray-600 whitespace-pre-line\">\n          {props.description}\n        </div>\n      )}\n    </label>\n  );\n}\n\nfunction StringField(props: {\n  id: string;\n  field: SchemaField;\n  value: string;\n  title: string;\n  readonly: boolean;\n  setValue: (value: string) => void;\n}) {\n  return (\n    <div>\n      <Label\n        id={props.id}\n        title={props.title}\n        description={props.field.description}\n      />\n      <textarea\n        rows={4}\n        name={props.id}\n        id={props.id}\n        className=\"block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6\"\n        value={props.value}\n        readOnly={props.readonly}\n        disabled={props.readonly}\n        onChange={(e) => props.setValue(e.target.value)}\n      />\n    </div>\n  );\n}\n\nexport default function SingleOptionField(props: {\n  id: string;\n  field: SchemaField;\n  value: string;\n  title: string;\n  readonly: boolean;\n  setValue: (value: string) => void;\n}) {\n  return (\n    <div>\n      <Label\n        id={props.id}\n        title={props.field.title}\n        description={props.field.description}\n      />\n      <fieldset>\n        <legend className=\"sr-only\">{props.field.title}</legend>\n        <div className=\"space-y-2\">\n          {orderBy(props.field.enum)?.map((option) => (\n            <div key={option} className=\"flex items-center\">\n              <input\n                id={`${props.id}-${option}`}\n                name={props.id}\n                type=\"radio\"\n                checked={option === props.value}\n                className=\"h-4 w-4 border-gray-300 text-indigo-600 focus:ring-indigo-600\"\n                disabled={props.readonly}\n                onChange={() => props.setValue(option)}\n              />\n              <label\n                htmlFor={`${props.id}-${option}`}\n                className=\"ml-3 block leading-6 text-gray-900\"\n              >\n                {option}\n              </label>\n            </div>\n          ))}\n        </div>\n      </fieldset>\n    </div>\n  );\n}\n\nconst ToolDisplay = (props: {\n  tool: Tool;\n  onRemoveTool: () => void;\n  onUpdateToolConfig: (conf: ToolConfig) => void;\n  readonly: boolean;\n}) => {\n  const { tool, onRemoveTool, onUpdateToolConfig, readonly } = props;\n  const confs = Object.entries(tool.config);\n  return (\n    <Disclosure\n      as=\"div\"\n      key={\"tool-\" + tool.id}\n      className=\"flex flex-col max-w-2xl p-2 mt-2 mb-2 border rounded-md border-gray-200\"\n      defaultOpen={!readonly}\n    >\n      {({ open }) => (\n        <>\n          <div className=\"flex\">\n            {Object.keys(tool.config).length > 0 ? (\n              <Disclosure.Button className=\"text-sm leading-6 flex justify-between items-center mr-2\">\n                {open ? (\n                  <MinusIcon className=\"w-5 h-5 text-gray-500 hover:text-indigo-600\" />\n                ) : (\n                  <PlusIcon className=\"w-5 h-5 text-gray-500 hover:text-indigo-600\" />\n                )}\n              </Disclosure.Button>\n            ) : (\n              <div className=\"text-sm leading-6 flex justify-between items-center mr-2\">\n                <RocketLaunchIcon className=\"w-5 h-5 text-gray-500\" />\n              </div>\n            )}\n            <div className=\"flex flex-col flex-auto\">\n              <label>{tool.name}</label>\n              {tool.description && (\n                <div\n                  className=\"text-gray-500 prose prose-sm prose-a:text-gray-500\"\n                  dangerouslySetInnerHTML={{\n                    __html: marked(tool.description),\n                  }}\n                ></div>\n              )}\n            </div>\n            {!readonly && (\n              <button\n                onClick={onRemoveTool}\n                className={\n                  \"text-gray-400\" + (readonly ? \"\" : \" hover:text-red-600\")\n                }\n              >\n                <TrashIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n              </button>\n            )}\n          </div>\n          {confs.length > 0 && (\n            <Disclosure.Panel className=\"pt-4 flex flex-col mb-2 pl-5 pr-5\">\n              {confs.map(([key, value]) => (\n                <div className=\"flex flex-col pt-2\" key={key}>\n                  <label\n                    htmlFor={`${tool.id}-${key}`}\n                    className=\"pl-2 prose-sm\"\n                  >\n                    {key}\n                  </label>\n                  <input\n                    id={`${tool.id}-${key}`}\n                    value={value}\n                    onChange={(e) =>\n                      onUpdateToolConfig({ [key]: e.target.value })\n                    }\n                    className=\"rounded-md border-gray-300 shadow-sm prose-sm \"\n                    autoComplete=\"off\"\n                    readOnly={readonly}\n                  />\n                </div>\n              ))}\n            </Disclosure.Panel>\n          )}\n        </>\n      )}\n    </Disclosure>\n  );\n};\n\nfunction ToolSelectionField(props: {\n  readonly: boolean;\n  retrievalOn: boolean;\n  selectedTools: Tool[];\n  onAddTool: (tool: Tool) => void;\n  onRemoveTool: (toolId: string) => void;\n  onUpdateToolConfig: (\n    toolId: string,\n    config: {\n      [key: string]: string;\n    },\n  ) => void;\n}) {\n  const { onAddTool, onRemoveTool, retrievalOn, selectedTools } = props;\n  const { tools: availableTools, loading } = useToolsSchemas();\n  const [query, setQuery] = useState(\"\");\n  const [filteredTools, setFilteredTools] = useState<ToolSchema[]>([]);\n\n  const handleSelectTool = useCallback(\n    (toolSchema: ToolSchema) => {\n      // Initialize config object based on ToolSchema\n      const config: { [key: string]: string } = {};\n      Object.keys(toolSchema.config.properties).forEach((key) => {\n        const property = toolSchema.config.properties[key];\n        // Use the default value if specified, otherwise initialize to an empty string\n        config[key] = property.default || \"\";\n      });\n\n      // Create a new tool object with initialized config\n      const tool: Tool = {\n        id: toolSchema.name === \"Retrieval\" ? \"retrieval\" : uuidv4(),\n        type: toolSchema.type,\n        name: toolSchema.name,\n        description: toolSchema.description,\n        config: config,\n      };\n\n      onAddTool(tool);\n      setQuery(\"\"); // Clear the query\n    },\n    [onAddTool],\n  );\n\n  useEffect(() => {\n    const retrieval = availableTools.find((t) => t.name === \"Retrieval\");\n    if (!retrieval) return;\n    const retrievalSelected = selectedTools.some((t) => t.name === \"Retrieval\");\n    if (retrievalOn && !retrievalSelected) {\n      handleSelectTool(retrieval);\n    }\n    if (!retrievalOn && retrievalSelected) {\n      onRemoveTool(\"retrieval\");\n    }\n  }, [\n    retrievalOn,\n    onRemoveTool,\n    availableTools,\n    handleSelectTool,\n    selectedTools,\n  ]);\n\n  useEffect(() => {\n    let toolSchemas = availableTools.filter(\n      (tool) => tool.name !== \"Retrieval\",\n    );\n    if (query !== \"\") {\n      toolSchemas = toolSchemas.filter((tool) =>\n        tool.name\n          .toLowerCase()\n          .replace(/\\s+/g, \"\")\n          .includes(query.toLowerCase().replace(/\\s+/g, \"\")),\n      );\n    }\n    toolSchemas = toolSchemas.filter(\n      (tool) =>\n        !selectedTools.some((t) => t.name === tool.name && !tool.multiUse),\n    );\n    setFilteredTools(toolSchemas);\n  }, [query, availableTools, selectedTools]);\n\n  if (loading) {\n    return <div>Loading...</div>;\n  }\n\n  return (\n    <div>\n      <Label title=\"Tools\" />\n      {props.selectedTools.map((t) => (\n        <ToolDisplay\n          key={`tool-display-${t.id}`}\n          tool={t}\n          onRemoveTool={() => props.onRemoveTool(t.id)}\n          onUpdateToolConfig={(conf) => props.onUpdateToolConfig(t.id, conf)}\n          readonly={props.readonly || t.name === \"Retrieval\"}\n        />\n      ))}\n      <div className=\"w-full max-w-2xl\">\n        <Combobox value={null} onChange={handleSelectTool}>\n          <div className=\"relative mt-1\">\n            <div className=\"relative mt-1\">\n              <div className=\"w-full h-10 border border-gray-300 bg-white py-2 text-sm leading-5 text-gray-900 rounded-md flex items-center\">\n                <Combobox.Button as=\"div\" className=\"relative flex-grow\">\n                  <Combobox.Input\n                    className=\"w-full h-full rounded-md focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 border-0 bg-transparent text-gray-900 placeholder-gray-400 text-sm\"\n                    onChange={(event) => setQuery(event.target.value)}\n                    displayValue={() => query}\n                    placeholder=\"Add a tool\"\n                    autoComplete=\"off\"\n                    readOnly={props.readonly}\n                  />\n                  <span className=\"absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none\">\n                    <ChevronUpDownIcon\n                      className=\"h-5 w-5 text-gray-400\"\n                      aria-hidden=\"true\"\n                    />\n                  </span>\n                </Combobox.Button>\n              </div>\n            </div>\n            <Transition\n              as={Fragment}\n              leave=\"transition ease-in duration-100\"\n              leaveFrom=\"opacity-100\"\n              leaveTo=\"opacity-0\"\n            >\n              <Combobox.Options className=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\">\n                {filteredTools.length === 0 && query !== \"\" ? (\n                  <div className=\"relative cursor-default select-none py-2 px-4 text-gray-700\">\n                    Nothing found.\n                  </div>\n                ) : (\n                  filteredTools.map((tool) => (\n                    <Combobox.Option\n                      key={\"tool-schema-\" + tool.name}\n                      value={tool}\n                      className={({ active }) =>\n                        `relative cursor-default select-none py-2 pl-2 pr-4 ${active ? \"bg-indigo-100 text-indigo-900\" : \"text-gray-900\"}`\n                      }\n                    >\n                      <span className={`block truncate font-normal`}>\n                        {tool.name}\n                      </span>\n                    </Combobox.Option>\n                  ))\n                )}\n              </Combobox.Options>\n            </Transition>\n          </div>\n        </Combobox>\n      </div>\n    </div>\n  );\n}\n\nfunction PublicLink() {\n  const link = window.location.href;\n  return (\n    <div className=\"flex rounded-md shadow-sm mb-4\">\n      <button\n        type=\"submit\"\n        className=\"relative -ml-px inline-flex items-center gap-x-1.5 rounded-l-md px-3 py-2 text-sm font-semibold text-gray-900 border border-gray-300 hover:bg-gray-50 bg-white\"\n        onClick={async (e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          await navigator.clipboard.writeText(link);\n          window.alert(\"Copied to clipboard!\");\n        }}\n      >\n        <ShareIcon\n          className=\"-ml-0.5 h-5 w-5 text-gray-400\"\n          aria-hidden=\"true\"\n        />\n        Copy Public Link\n      </button>\n      <a\n        className=\"rounded-none rounded-r-md py-1.5 px-2 text-gray-900 border border-l-0 border-gray-300 text-sm leading-6 line-clamp-1 flex-1 underline\"\n        href={link}\n      >\n        {link}\n      </a>\n    </div>\n  );\n}\n\nfunction PublicToggle(props: {\n  enabled: boolean;\n  setEnabled: (enabled: boolean) => void;\n  className?: string;\n}) {\n  return (\n    <Switch.Group as=\"div\" className={cn(\"flex items-center\", props.className)}>\n      <Switch\n        checked={props.enabled}\n        onChange={props.setEnabled}\n        className={cn(\n          props.enabled ? \"bg-indigo-600\" : \"bg-gray-200\",\n          \"relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2\",\n        )}\n      >\n        <span\n          aria-hidden=\"true\"\n          className={cn(\n            props.enabled ? \"translate-x-5\" : \"translate-x-0\",\n            \"pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out\",\n          )}\n        />\n      </Switch>\n      <Switch.Label as=\"span\" className=\"ml-3 text-sm\">\n        <span className=\"font-medium text-gray-900\">Public?</span>\n      </Switch.Label>\n    </Switch.Group>\n  );\n}\n\nfunction fileId(file: File) {\n  return `${file.name}-${file.size}-${file.lastModified}`;\n}\n\nconst ORDER = [\n  \"system_message\",\n  \"retrieval_description\",\n  \"interrupt_before_action\",\n  \"tools\",\n  \"llm_type\",\n  \"agent_type\",\n];\n\nfunction assignDefaults(\n  config: ConfigInterface[\"config\"] | undefined | null,\n  configDefaults: Schemas[\"configDefaults\"],\n) {\n  return config\n    ? {\n        ...config,\n        configurable: {\n          ...configDefaults?.configurable,\n          ...config.configurable,\n        },\n      }\n    : configDefaults;\n}\n\nexport function Config(props: {\n  className?: string;\n  configSchema: Schemas[\"configSchema\"];\n  configDefaults: Schemas[\"configDefaults\"];\n  config: ConfigInterface | null;\n  saveConfig: ConfigListProps[\"saveConfig\"];\n  enterConfig: (id: string | null) => void;\n  edit?: boolean;\n}) {\n  const [values, setValues] = useState(\n    assignDefaults(props.config?.config, props.configDefaults),\n  );\n  const [selectedTools, setSelectedTools] = useState<Tool[]>([]);\n  const typeKey = \"type\";\n  const typeField =\n    props.configSchema?.properties.configurable.properties[typeKey];\n  const typeValue = values?.configurable?.[typeKey];\n  const typeSpec = typeValue ? TYPES[typeValue as keyof typeof TYPES] : null;\n  const [files, setFiles] = useState<File[]>([]);\n  const dropzone = useDropzone(DROPZONE_CONFIG);\n  const [isPublic, setPublic] = useState(props.config?.public ?? false);\n\n  useEffect(() => {\n    if (!values) return;\n    if (!values.configurable) return;\n    const tools = (values.configurable[\"type==agent/tools\"] as Tool[]) ?? [];\n    setSelectedTools((oldTools) =>\n      oldTools !== tools ? [...tools] : oldTools,\n    );\n  }, [values]);\n\n  const handleAddTool = (tool: Tool) => {\n    setSelectedTools([...selectedTools, tool]);\n  };\n\n  const handleRemoveTool = (toolId: string) => {\n    setSelectedTools(selectedTools.filter((tool) => tool.id !== toolId));\n  };\n\n  const handleUpdateToolConfig = (toolId: string, config: ToolConfig) => {\n    const updatedTools = selectedTools.map((tool) =>\n      tool.id === toolId\n        ? { ...tool, config: { ...tool.config, ...config } }\n        : tool,\n    );\n    setSelectedTools(updatedTools);\n  };\n\n  useEffect(() => {\n    setValues(assignDefaults(props.config?.config, props.configDefaults));\n  }, [props.config, props.configDefaults]);\n  useEffect(() => {\n    if (dropzone.acceptedFiles.length > 0) {\n      const acceptedFileIds = dropzone.acceptedFiles.map(fileId);\n      setFiles((files) => [\n        ...files.filter((f) => !acceptedFileIds.includes(fileId(f))),\n        ...dropzone.acceptedFiles,\n      ]);\n    }\n  }, [dropzone.acceptedFiles, setFiles]);\n  const [inflight, setInflight] = useState(false);\n  const readonly = !!props.config && !props.edit && !inflight;\n\n  const settings = !readonly ? (\n    <div className=\"flex flex-row gap-4\">\n      <div className=\"flex flex-row flex-1\">\n        <div className=\"relative flex flex-grow items-stretch focus-within:z-10\">\n          <input\n            type=\"text\"\n            name=\"key\"\n            id=\"key\"\n            autoComplete=\"off\"\n            className=\"block w-full rounded-none rounded-l-md border-0 py-1.5 pl-4 text-gray-900 ring-1 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6 ring-inset ring-gray-300\"\n            placeholder=\"Name your bot\"\n            defaultValue={props.config?.name}\n          />\n        </div>\n        <button\n          type=\"submit\"\n          className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-r-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-600\"\n        >\n          {inflight ? \"Saving...\" : \"Save\"}\n        </button>\n      </div>\n\n      <PublicToggle enabled={isPublic} setEnabled={setPublic} />\n    </div>\n  ) : (\n    <>{props.config?.public && <PublicLink />}</>\n  );\n  return (\n    <form\n      className={cn(\"flex flex-col\", props.className)}\n      onSubmit={async (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        const form = e.target as HTMLFormElement;\n        const key = form.key.value;\n        if (!key) return;\n        setInflight(true);\n        const vals = { ...values };\n        if (vals?.configurable) {\n          vals.configurable = { ...vals.configurable };\n          vals.configurable[\"type==agent/tools\"] = [...selectedTools];\n          setSelectedTools([]);\n        }\n        const assistantId = await props.saveConfig(\n          key,\n          vals!,\n          files,\n          isPublic,\n          props.config?.assistant_id,\n        );\n        props.enterConfig(assistantId);\n        setInflight(false);\n      }}\n    >\n      {settings}\n      {typeField && (\n        <Types\n          field={typeField}\n          value={typeValue as string}\n          setValue={(value: string) =>\n            setValues({\n              ...values,\n              configurable: { ...values!.configurable, [typeKey]: value },\n            })\n          }\n          readonly={readonly}\n        />\n      )}\n\n      {typeSpec?.description && (\n        <>\n          <Label title=\"Description\" />\n          <div className=\"prose mb-8\">{typeSpec.description}</div>\n        </>\n      )}\n\n      {!props.config && typeSpec?.files && (\n        <FileUploadDropzone\n          state={dropzone}\n          files={files}\n          setFiles={setFiles}\n          className=\"mb-8\"\n        />\n      )}\n      <div\n        className={cn(\n          \"flex flex-col gap-8\",\n          readonly && \"opacity-50 cursor-not-allowed\",\n        )}\n      >\n        {orderBy(\n          Object.entries(\n            props.configSchema?.properties.configurable.properties ?? {},\n          ),\n          ([key]) => ORDER.indexOf(last(key.split(\"/\"))!),\n        ).map(([key, value]) => {\n          const title = value.title;\n          if (key.split(\"/\")[0].includes(\"==\")) {\n            const [parentKey, parentValue] = key.split(\"/\")[0].split(\"==\");\n            if (values?.configurable?.[parentKey] !== parentValue) {\n              return null;\n            }\n          } else {\n            return null;\n          }\n          if (\n            last(key.split(\"/\")) === \"retrieval_description\" &&\n            !files.length\n          ) {\n            return null;\n          }\n          if (value.type === \"string\" && value.enum) {\n            return (\n              <SingleOptionField\n                key={key}\n                id={key}\n                field={value}\n                title={title}\n                value={values?.configurable?.[key] as string}\n                setValue={(value: string) =>\n                  setValues({\n                    ...values,\n                    configurable: { ...values!.configurable, [key]: value },\n                  })\n                }\n                readonly={readonly}\n              />\n            );\n          } else if (value.type === \"string\") {\n            return (\n              <StringField\n                key={key}\n                id={key}\n                field={value}\n                title={title}\n                value={values?.configurable?.[key] as string}\n                setValue={(value: string) =>\n                  setValues({\n                    ...values,\n                    configurable: { ...values!.configurable, [key]: value },\n                  })\n                }\n                readonly={readonly}\n              />\n            );\n          } else if (value.type === \"boolean\") {\n            return (\n              <SingleOptionField\n                key={key}\n                id={key}\n                field={{\n                  ...value,\n                  type: \"string\",\n                  enum: [\"Yes\", \"No\"],\n                }}\n                title={title}\n                value={values?.configurable?.[key] ? \"Yes\" : \"No\"}\n                setValue={(value: string) =>\n                  setValues({\n                    ...values,\n                    configurable: {\n                      ...values!.configurable,\n                      [key]: value === \"Yes\",\n                    },\n                  })\n                }\n                readonly={readonly}\n              />\n            );\n          } else if (key === \"type==agent/tools\") {\n            return (\n              <ToolSelectionField\n                key={key}\n                selectedTools={selectedTools}\n                onAddTool={handleAddTool}\n                onRemoveTool={handleRemoveTool}\n                onUpdateToolConfig={handleUpdateToolConfig}\n                readonly={readonly}\n                retrievalOn={files.length > 0}\n              />\n            );\n          }\n        })}\n      </div>\n    </form>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/ConfigList.tsx",
    "content": "import { TYPES } from \"../constants\";\nimport { Config, ConfigListProps } from \"../hooks/useConfigList\";\nimport { cn } from \"../utils/cn\";\nimport { PencilSquareIcon, TrashIcon } from \"@heroicons/react/24/outline\";\nimport { Link } from \"react-router-dom\";\n\nfunction ConfigItem(props: {\n  config: Config;\n  currentConfig: Config | null;\n  enterConfig: (id: string | null) => void;\n  deleteConfig: (id: string) => void;\n}) {\n  return (\n    <li key={props.config.assistant_id}>\n      <div\n        onClick={() => props.enterConfig(props.config.assistant_id)}\n        className={cn(\n          props.config.assistant_id === props.currentConfig?.assistant_id\n            ? \"bg-gray-50 text-indigo-600\"\n            : \"text-gray-700 hover:text-indigo-600 hover:bg-gray-50\",\n          \"group flex gap-x-3 rounded-md p-2 leading-6 cursor-pointer\",\n        )}\n      >\n        <span\n          className={cn(\n            props.config.assistant_id === props.currentConfig?.assistant_id\n              ? \"text-indigo-600 border-indigo-600\"\n              : \"text-gray-400 border-gray-200 group-hover:border-indigo-600 group-hover:text-indigo-600\",\n            \"flex h-6 w-6 shrink-0 items-center justify-center rounded-lg border text-[0.625rem] font-medium bg-white\",\n          )}\n        >\n          {props.config.name?.[0] ?? \" \"}\n        </span>\n        <div className=\"flex flex-col\">\n          <span className=\"truncate text-sm font-medium\">\n            {props.config.name}\n          </span>\n          <span className=\"truncate text-xs\">\n            {\n              TYPES[\n                (props.config.config.configurable?.type ??\n                  \"agent\") as keyof typeof TYPES\n              ]?.title\n            }\n          </span>\n        </div>\n        <Link\n          className=\"ml-auto w-5\"\n          to={`/assistant/${props.config.assistant_id}/edit`}\n          onClick={(event) => event.stopPropagation()}\n        >\n          <PencilSquareIcon />\n        </Link>\n        <Link\n          className=\"w-5\"\n          to=\"#\"\n          onClick={(event) => {\n            event.preventDefault();\n            if (\n              window.confirm(\n                `Are you sure you want to delete bot \"${props.config.name}?\"`,\n              )\n            ) {\n              props.deleteConfig(props.config.assistant_id);\n            }\n          }}\n        >\n          <TrashIcon />\n        </Link>\n      </div>\n    </li>\n  );\n}\n\nexport function ConfigList(props: {\n  configs: ConfigListProps[\"configs\"];\n  currentConfig: Config | null;\n  enterConfig: (id: string | null) => void;\n  deleteConfig: (id: string) => void;\n}) {\n  return (\n    <>\n      <div className=\"text-xs font-semibold leading-6 text-gray-400\">\n        Your Saved Bots\n      </div>\n      <ul role=\"list\" className=\"-mx-2 mt-2 space-y-1\">\n        {props.configs\n          ?.filter((a) => a.mine)\n          .map((assistant) => (\n            <ConfigItem\n              key={assistant.assistant_id}\n              config={assistant}\n              currentConfig={props.currentConfig}\n              enterConfig={props.enterConfig}\n              deleteConfig={props.deleteConfig}\n            />\n          )) ?? (\n          <li className=\"leading-6 p-2 animate-pulse font-black text-gray-400 text-lg\">\n            ...\n          </li>\n        )}\n      </ul>\n\n      <div className=\"text-xs font-semibold leading-6 text-gray-400 mt-4\">\n        Public Bots\n      </div>\n      <ul role=\"list\" className=\"-mx-2 mt-2 space-y-1\">\n        {props.configs\n          ?.filter((a) => !a.mine)\n          .map((assistant) => (\n            <ConfigItem\n              key={assistant.assistant_id}\n              config={assistant}\n              currentConfig={props.currentConfig}\n              enterConfig={props.enterConfig}\n              deleteConfig={props.deleteConfig}\n            />\n          )) ?? (\n          <li className=\"leading-6 p-2 animate-pulse font-black text-gray-400 text-lg\">\n            ...\n          </li>\n        )}\n      </ul>\n    </>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/Document.tsx",
    "content": "import { useMemo, useState } from \"react\";\nimport { ChevronDownIcon, ChevronRightIcon } from \"@heroicons/react/24/outline\";\nimport { cn } from \"../utils/cn\";\nimport { MessageDocument } from \"../types\";\nimport { StringViewer } from \"./String\";\n\nfunction isValidHttpUrl(str: string) {\n  let url;\n\n  try {\n    url = new URL(str);\n  } catch (_) {\n    return false;\n  }\n\n  return url.protocol === \"http:\" || url.protocol === \"https:\";\n}\n\nfunction DocumentViewer(props: {\n  document: MessageDocument;\n  markdown?: boolean;\n  className?: string;\n}) {\n  const [open, setOpen] = useState(false);\n\n  const metadata = useMemo(() => {\n    return Object.keys(props.document.metadata)\n      .sort((a, b) => {\n        const aValue = JSON.stringify(props.document.metadata[a]);\n        const bValue = JSON.stringify(props.document.metadata[b]);\n\n        const aLines = aValue.split(\"\\n\");\n        const bLines = bValue.split(\"\\n\");\n\n        if (aLines.length !== bLines.length) {\n          return aLines.length - bLines.length;\n        }\n\n        return aValue.length - bValue.length;\n      })\n      .map((key) => {\n        const value = props.document.metadata[key];\n        return {\n          key,\n          value:\n            typeof value === \"string\" || typeof value === \"number\"\n              ? `${value}`\n              : JSON.stringify(value),\n        };\n      });\n  }, [props.document.metadata]);\n\n  if (!open) {\n    return (\n      <button\n        className={cn(\n          \"flex items-start min-w-0 max-w-full gap-4 overflow-hidden px-4 transition-colors hover:bg-gray-50/50 active:bg-gray-50\",\n          props.className,\n        )}\n        onClick={() => setOpen(true)}\n      >\n        <ChevronRightIcon className=\"mt-[6px] h-4 w-4 text-gray-500\" />\n        <StringViewer\n          className=\"min-w-0 flex-grow basis-0 overflow-hidden text-ellipsis whitespace-nowrap text-left max-w-none\"\n          value={props.document.page_content.trim().replace(/\\n/g, \" \")}\n        />\n      </button>\n    );\n  }\n\n  return (\n    <div\n      className={cn(\n        \"flex items-start gap-4 px-4 text-left transition-colors hover:bg-gray-50/50 active:bg-gray-50\",\n        props.className,\n      )}\n    >\n      <button onClick={() => setOpen(false)}>\n        <ChevronDownIcon className=\"mt-[6px] h-4 w-4 text-gray-500\" />\n      </button>\n\n      <span className=\"flex flex-grow basis-0 flex-col gap-4\">\n        <StringViewer\n          value={props.document.page_content}\n          markdown={props.markdown}\n        />\n\n        <span className=\"flex flex-col flex-wrap items-start gap-2\">\n          {metadata.map(({ key, value }, idx) => {\n            return (\n              <span\n                className=\"rounded-md bg-divider-500 p-1 px-1.5 text-xs\"\n                key={idx}\n              >\n                <span className=\"mr-1.5 font-mono font-bold\">{key}</span>\n                {isValidHttpUrl(value) ? (\n                  <a href={value} target=\"_blank\" rel=\"noreferrer\">\n                    {value}\n                  </a>\n                ) : (\n                  <span className=\"whitespace-pre-wrap\">{value}</span>\n                )}\n              </span>\n            );\n          })}\n        </span>\n      </span>\n    </div>\n  );\n}\n\nexport function DocumentList(props: {\n  documents: MessageDocument[];\n  markdown?: boolean;\n}) {\n  return (\n    <div className=\"flex flex-col items-stretch gap-4 rounded-lg ring-1 ring-gray-300 overflow-hidden my-2\">\n      <div className=\"grid divide-y empty:hidden\">\n        {props.documents.map((document, idx) => (\n          <DocumentViewer\n            document={document}\n            key={idx}\n            className=\"py-3\"\n            markdown={props.markdown}\n          />\n        ))}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/FileUpload.tsx",
    "content": "import { useMemo } from \"react\";\nimport { DropzoneState } from \"react-dropzone\";\nimport { XCircleIcon } from \"@heroicons/react/24/outline\";\n\nconst baseStyle = {\n  flex: 1,\n  display: \"flex\",\n  flexDirection: \"column\",\n  alignItems: \"center\",\n  padding: \"20px\",\n  borderWidth: 2,\n  borderRadius: 2,\n  borderColor: \"#eeeeee\",\n  borderStyle: \"dashed\",\n  backgroundColor: \"#fafafa\",\n  color: \"#bdbdbd\",\n  outline: \"none\",\n  transition: \"border .24s ease-in-out\",\n};\n\nconst focusedStyle = {\n  borderColor: \"#2196f3\",\n};\n\nconst acceptStyle = {\n  borderColor: \"#00e676\",\n};\n\nconst rejectStyle = {\n  borderColor: \"#ff1744\",\n};\n\nfunction Label(props: { id: string; title: string }) {\n  return (\n    <label\n      htmlFor={props.id}\n      className=\"block font-medium leading-6 text-gray-400 mb-2\"\n    >\n      {props.title}\n    </label>\n  );\n}\n\nexport function FileUploadDropzone(props: {\n  state: DropzoneState;\n  files: File[];\n  setFiles: React.Dispatch<React.SetStateAction<File[]>>;\n  className?: string;\n}) {\n  const { getRootProps, getInputProps, fileRejections } = props.state;\n\n  const files = props.files.map((file, i) => (\n    <li key={i}>\n      {file.name} - {file.size} bytes\n      <span\n        className=\"not-prose ml-2  inline-flex items-center rounded-full px-1 py-1 text-xs font-medium cursor-pointer bg-gray-50 text-gray-600 relative top-[1px]\"\n        onClick={() =>\n          props.setFiles((files) => files.filter((f) => f !== file))\n        }\n      >\n        <XCircleIcon className=\"h-4 w-4\" />\n      </span>\n    </li>\n  ));\n\n  const style = useMemo(\n    () =>\n      ({\n        ...baseStyle,\n        ...(props.state.isFocused ? focusedStyle : {}),\n        ...(props.state.isDragAccept ? acceptStyle : {}),\n        ...(props.state.isDragReject ? rejectStyle : {}),\n      }) as React.CSSProperties,\n    [props.state.isFocused, props.state.isDragAccept, props.state.isDragReject],\n  );\n\n  return (\n    <section className={props.className}>\n      <aside>\n        <Label id=\"files\" title=\"Files\" />\n        <div className=\"prose\">\n          <ul>{files}</ul>\n        </div>\n      </aside>\n      <div {...getRootProps({ style })}>\n        <input {...getInputProps()} />\n        <p>\n          Drag n' drop some files here, or click to select files.\n          <br />\n          Accepted files: .txt, .csv, .html, .docx, .pdf.\n          <br />\n          No file should exceed 10 MB.\n        </p>\n        {fileRejections.length > 0 && (\n          <div className=\"flex items-center rounded-md bg-yellow-50 mt-4 px-2 py-1 text-xs font-medium text-yellow-800 ring-1 ring-inset ring-yellow-600/20 prose\">\n            <ul>\n              {fileRejections.map((reject, i) => (\n                <li key={i} className=\"break-all\">\n                  {reject.file.name} - {reject.errors[0].message}\n                </li>\n              ))}\n            </ul>\n          </div>\n        )}\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/JsonEditor.tsx",
    "content": "import CodeMirror from \"@uiw/react-codemirror\";\nimport { json } from \"@codemirror/lang-json\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { defaultKeymap } from \"@codemirror/commands\";\nimport { cn } from \"../utils/cn\";\n\nexport function JsonEditor(props: {\n  value?: string;\n  onChange?: (data: string) => void;\n  height?: string;\n}) {\n  return (\n    <div className=\"relative flex flex-grow items-stretch\">\n      <CodeMirror\n        value={props.value}\n        onChange={props.onChange}\n        height={props.height ?? \"33vh\"}\n        className={cn(\"max-w-full w-full overflow-auto min-w-0\")}\n        extensions={[\n          keymap.of([{ key: \"Mod-Enter\", run: () => true }, ...defaultKeymap]),\n          json(),\n          EditorView.lineWrapping,\n          EditorView.theme({\n            \"&.cm-editor\": {\n              backgroundColor: \"transparent\",\n              transform: \"translateX(-1px)\",\n            },\n            \"&.cm-focused\": {\n              outline: \"none\",\n            },\n            green: {\n              background: \"green\",\n            },\n            \"& .cm-content\": {\n              padding: \"12px\",\n            },\n            \"& .cm-line\": {\n              fontFamily: \"'Fira Code', monospace\",\n              padding: 0,\n              overflowAnchor: \"none\",\n              fontVariantLigatures: \"none\",\n            },\n            \"& .cm-gutters.cm-gutters\": {\n              backgroundColor: \"transparent\",\n            },\n            \"& .cm-lineNumbers .cm-gutterElement.cm-activeLineGutter\": {\n              marginLeft: \"1px\",\n            },\n            \"& .cm-lineNumbers\": {\n              minWidth: \"42px\",\n            },\n            \"& .cm-foldPlaceholder\": {\n              padding: \"0px 4px\",\n              color: \"hsl(var(--ls-gray-100))\",\n              backgroundColor: \"hsl(var(--divider-500))\",\n              borderColor: \"hsl(var(--divider-700))\",\n            },\n            '& .cm-gutterElement span[title=\"Fold line\"]': {\n              transform: \"translateY(-4px)\",\n              display: \"inline-block\",\n            },\n          }),\n        ]}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/LangSmithActions.tsx",
    "content": "import {\n  HandThumbDownIcon,\n  HandThumbUpIcon,\n  EllipsisHorizontalIcon,\n  CheckIcon,\n} from \"@heroicons/react/24/outline\";\nimport { useState } from \"react\";\n\nexport function LangSmithActions(props: { runId: string }) {\n  const [state, setState] = useState<{\n    score: number;\n    inflight: boolean;\n  } | null>(null);\n  const sendFeedback = async (score: number) => {\n    setState({ score, inflight: true });\n    await fetch(`/runs/feedback`, {\n      method: \"POST\",\n      body: JSON.stringify({\n        run_id: props.runId,\n        key: \"user_score\",\n        score: score,\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n    });\n    setState({ score, inflight: false });\n  };\n  return (\n    <div className=\"flex mt-2 gap-2 flex-row\">\n      <button\n        type=\"button\"\n        className=\"rounded-full p-1 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50\"\n        onClick={() => sendFeedback(1)}\n      >\n        {state?.score === 1 ? (\n          state?.inflight ? (\n            <EllipsisHorizontalIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n          ) : (\n            <CheckIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n          )\n        ) : (\n          <HandThumbUpIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n        )}\n      </button>\n      <button\n        type=\"button\"\n        className=\"rounded-full p-1 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50\"\n        onClick={() => sendFeedback(0)}\n      >\n        {state?.score === 0 ? (\n          state?.inflight ? (\n            <EllipsisHorizontalIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n          ) : (\n            <CheckIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n          )\n        ) : (\n          <HandThumbDownIcon className=\"h-5 w-5\" aria-hidden=\"true\" />\n        )}\n      </button>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/Layout.tsx",
    "content": "import { Fragment } from \"react\";\nimport { Dialog, Transition } from \"@headlessui/react\";\nimport { Bars3Icon, XMarkIcon } from \"@heroicons/react/24/outline\";\n\nexport function Layout(props: {\n  sidebarOpen: boolean;\n  setSidebarOpen: (open: boolean) => void;\n  sidebar: React.ReactNode;\n  children: React.ReactNode;\n  subtitle?: React.ReactNode;\n}) {\n  return (\n    <>\n      <Transition.Root show={props.sidebarOpen} as={Fragment}>\n        <Dialog\n          as=\"div\"\n          className=\"relative z-50 lg:hidden\"\n          onClose={props.setSidebarOpen}\n        >\n          <Transition.Child\n            as={Fragment}\n            enter=\"transition-opacity ease-linear duration-300\"\n            enterFrom=\"opacity-0\"\n            enterTo=\"opacity-100\"\n            leave=\"transition-opacity ease-linear duration-300\"\n            leaveFrom=\"opacity-100\"\n            leaveTo=\"opacity-0\"\n          >\n            <div className=\"fixed inset-0 bg-gray-900/80\" />\n          </Transition.Child>\n\n          <div className=\"fixed inset-0 flex\">\n            <Transition.Child\n              as={Fragment}\n              enter=\"transition ease-in-out duration-300 transform\"\n              enterFrom=\"-translate-x-full\"\n              enterTo=\"translate-x-0\"\n              leave=\"transition ease-in-out duration-300 transform\"\n              leaveFrom=\"translate-x-0\"\n              leaveTo=\"-translate-x-full\"\n            >\n              <Dialog.Panel className=\"relative mr-16 flex w-full max-w-xs flex-1\">\n                <Transition.Child\n                  as={Fragment}\n                  enter=\"ease-in-out duration-300\"\n                  enterFrom=\"opacity-0\"\n                  enterTo=\"opacity-100\"\n                  leave=\"ease-in-out duration-300\"\n                  leaveFrom=\"opacity-100\"\n                  leaveTo=\"opacity-0\"\n                >\n                  <div className=\"absolute left-full top-0 flex w-16 justify-center pt-5\">\n                    <button\n                      type=\"button\"\n                      className=\"-m-2.5 p-2.5\"\n                      onClick={() => props.setSidebarOpen(false)}\n                    >\n                      <span className=\"sr-only\">Close sidebar</span>\n                      <XMarkIcon\n                        className=\"h-6 w-6 text-white\"\n                        aria-hidden=\"true\"\n                      />\n                    </button>\n                  </div>\n                </Transition.Child>\n                {/* Sidebar component, swap this element with another sidebar if you like */}\n                <div className=\"flex grow flex-col gap-y-5 overflow-y-auto bg-white px-6 py-4\">\n                  <nav className=\"flex flex-1 flex-col\">\n                    <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-7\">\n                      <li>{props.sidebar}</li>\n                    </ul>\n                  </nav>\n                </div>\n              </Dialog.Panel>\n            </Transition.Child>\n          </div>\n        </Dialog>\n      </Transition.Root>\n\n      {/* Static sidebar for desktop */}\n      <div className=\"hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:w-72 lg:flex-col\">\n        {/* Sidebar component, swap this element with another sidebar if you like */}\n        <div className=\"flex grow flex-col gap-y-5 overflow-y-auto border-r border-gray-200 bg-white px-6 py-4\">\n          <nav className=\"flex flex-1 flex-col\">\n            <ul role=\"list\" className=\"flex flex-1 flex-col gap-y-7\">\n              <li>{props.sidebar}</li>\n            </ul>\n          </nav>\n        </div>\n      </div>\n\n      <div className=\"fixed left-0 right-0 top-0 z-40 flex items-center gap-x-6 bg-white px-4 py-4 shadow-sm sm:px-6\">\n        <button\n          type=\"button\"\n          className=\"-m-2.5 p-2.5 text-gray-700 lg:hidden\"\n          onClick={() => props.setSidebarOpen(true)}\n        >\n          <span className=\"sr-only\">Open sidebar</span>\n          <Bars3Icon className=\"h-6 w-6\" aria-hidden=\"true\" />\n        </button>\n        <div className=\"flex-1 text-sm font-semibold leading-6 text-gray-900 lg:pl-72\">\n          {props.subtitle ? (\n            <>\n              OpenGPTs: <span className=\"font-normal\">{props.subtitle}</span>\n            </>\n          ) : (\n            \"OpenGPTs\"\n          )}\n        </div>\n        <div className=\"inline-flex items-center rounded-md bg-pink-100 px-2 py-1 text-xs font-medium text-pink-700\">\n          Research Preview: this is unauthenticated and all data can be found.\n          Do not use with sensitive data\n        </div>\n      </div>\n\n      <main className=\"pt-20 lg:pl-72 flex flex-col min-h-[calc(100%-56px)]\">\n        <div className=\"px-4 sm:px-6 lg:px-8 flex-1\">{props.children}</div>\n      </main>\n    </>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/Message.tsx",
    "content": "import { memo, useState } from \"react\";\nimport { MessageDocument, Message as MessageType } from \"../types\";\nimport { str } from \"../utils/str\";\nimport { cn } from \"../utils/cn\";\nimport { PencilSquareIcon } from \"@heroicons/react/24/outline\";\nimport { LangSmithActions } from \"./LangSmithActions\";\nimport { DocumentList } from \"./Document\";\nimport { omit } from \"lodash\";\nimport { StringViewer } from \"./String\";\nimport { ToolRequest, ToolResponse } from \"./Tool\";\n\nfunction isDocumentContent(\n  content: MessageType[\"content\"],\n): content is MessageDocument[] {\n  return (\n    Array.isArray(content) &&\n    content.every((d) => typeof d === \"object\" && !!d && !!d.page_content)\n  );\n}\n\nexport function MessageContent(props: { content: MessageType[\"content\"] }) {\n  if (typeof props.content === \"string\") {\n    if (!props.content.trim()) {\n      return null;\n    }\n    return <StringViewer value={props.content} markdown />;\n  } else if (isDocumentContent(props.content)) {\n    return <DocumentList documents={props.content} />;\n  } else if (\n    Array.isArray(props.content) &&\n    props.content.every(\n      (it) => typeof it === \"object\" && !!it && typeof it.content === \"string\",\n    )\n  ) {\n    return (\n      <DocumentList\n        markdown\n        documents={props.content.map((it) => ({\n          page_content: it.content,\n          metadata: omit(it, \"content\"),\n        }))}\n      />\n    );\n  } else {\n    let content = props.content;\n    if (Array.isArray(content)) {\n      content = content.filter((it) =>\n        typeof it === \"object\" && !!it && \"type\" in it\n          ? it.type !== \"tool_use\"\n          : true,\n      );\n    }\n    if (\n      Array.isArray(content)\n        ? content.length === 0\n        : Object.keys(content).length === 0\n    ) {\n      return null;\n    }\n    return <div className=\"text-gray-900 prose\">{str(content)}</div>;\n  }\n}\n\nexport const MessageViewer = memo(function (\n  props: MessageType & {\n    runId?: string;\n    startEditing?: () => void;\n    alwaysShowControls?: boolean;\n  },\n) {\n  const [open, setOpen] = useState(false);\n  const contentIsDocuments =\n    [\"function\", \"tool\"].includes(props.type) &&\n    isDocumentContent(props.content);\n  const showContent =\n    [\"function\", \"tool\"].includes(props.type) && !contentIsDocuments\n      ? open\n      : true;\n  return (\n    <div className=\"flex flex-col mb-8 group\">\n      <div className=\"leading-6 flex flex-row\">\n        <div\n          className={cn(\n            \"flex flex-row space-between mr-4\",\n            [\"function\", \"tool\"].includes(props.type) && \"mt-1\",\n          )}\n        >\n          <div className=\"font-medium text-sm text-gray-400 uppercase mt-1 w-28 flex flex-col\">\n            {props.type}\n          </div>\n          {props.startEditing && (\n            <PencilSquareIcon\n              className={cn(\n                \"w-6 h-6 cursor-pointer shrink-0 transition-opacity duration-100\",\n                props.alwaysShowControls\n                  ? \"opacity-40 hover:opacity-90\"\n                  : \"opacity-0 group-hover:opacity-40 group-hover:hover:opacity-90\",\n              )}\n              onMouseUp={props.startEditing}\n            />\n          )}\n        </div>\n        <div className=\"flex-1\">\n          {[\"function\", \"tool\"].includes(props.type) && (\n            <ToolResponse\n              name={props.name}\n              open={open}\n              setOpen={contentIsDocuments ? undefined : setOpen}\n            />\n          )}\n          {props.tool_calls?.map((call) => (\n            <ToolRequest key={call.id} {...call} />\n          ))}\n          {showContent && <MessageContent content={props.content} />}\n        </div>\n      </div>\n      {props.runId && (\n        <div className=\"mt-2 pl-[148px]\">\n          <LangSmithActions runId={props.runId} />\n        </div>\n      )}\n    </div>\n  );\n});\n"
  },
  {
    "path": "frontend/src/components/MessageEditor.tsx",
    "content": "import { memo } from \"react\";\nimport type { Message, ToolCall } from \"../types\";\nimport { str } from \"../utils/str\";\nimport { cn } from \"../utils/cn\";\nimport {\n  XCircleIcon,\n  PlusCircleIcon,\n  TrashIcon,\n} from \"@heroicons/react/24/outline\";\nimport { StringEditor } from \"./StringEditor\";\nimport { JsonEditor } from \"./JsonEditor\";\nimport { useThreadAndAssistant } from \"../hooks/useThreadAndAssistant\";\nimport { v4 } from \"uuid\";\n\nfunction ToolCallEditor(props: {\n  value: ToolCall;\n  onChange: (newValue: ToolCall) => void;\n  onRemove: () => void;\n  availableTools: string[];\n}) {\n  return (\n    <div className=\"flex flex-col\">\n      <div className=\"flex w-full items-center gap-2\">\n        <span className=\"text-gray-900 whitespace-pre-wrap break-words\">\n          Use\n        </span>\n        <div className=\"flex flex-col\">\n          {props.value.name !== undefined && (\n            <select\n              onChange={(e) =>\n                props.onChange({ ...props.value, name: e.target.value })\n              }\n              className=\"rounded-md bg-gray-50 px-2 py-1 text-sm font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 -top-[1px] mr-auto focus:ring-0 w-40\"\n              value={props.value.name}\n            >\n              {props.availableTools.map((tool) => (\n                <option key={tool} value={tool}>\n                  {tool}\n                </option>\n              ))}\n            </select>\n          )}\n        </div>\n\n        <TrashIcon\n          className=\"w-5 h-5 cursor-pointer opacity-50\"\n          onClick={props.onRemove}\n        />\n      </div>\n      <div className=\"text-gray-900 whitespace-pre-wrap break-words mt-2 mb-4 ring-1 ring-gray-300 rounded\">\n        <table className=\"my-0 divide-gray-300\">\n          <tbody>\n            {Object.entries(props.value.args).map(([key, value], i) => (\n              <tr key={i}>\n                <td\n                  className={cn(\n                    i === 0 ? \"\" : \"border-t border-transparent\",\n                    \"p-2 table-cell text-sm border-r border-r-gray-300 w-0 min-w-[128px]\",\n                  )}\n                >\n                  <input\n                    className=\"rounded-md font-medium text-sm text-gray-500 px-2 py-1 focus:ring-0\"\n                    value={key}\n                    onChange={(e) => {\n                      const newKey = e.target.value;\n                      props.onChange({\n                        ...props.value,\n                        args: Object.fromEntries(\n                          Object.entries(props.value.args).map(([k, v]) => [\n                            k === key ? newKey : k,\n                            v,\n                          ]),\n                        ),\n                      });\n                    }}\n                  />\n                </td>\n                <td\n                  className={cn(\n                    i === 0 ? \"\" : \"border-t border-gray-200\",\n                    \"p-2 table-cell\",\n                  )}\n                >\n                  <div className=\"flex items-center\">\n                    <StringEditor\n                      className=\"py-0 px-0 prose text-sm leading-normal bg-white\"\n                      value={str(value)?.toString()}\n                      onChange={(newValue) => {\n                        props.onChange({\n                          ...props.value,\n                          args: {\n                            ...props.value.args,\n                            [key]: newValue,\n                          },\n                        });\n                      }}\n                    />\n                    <TrashIcon\n                      className=\"w-4 h-4 ml-2 cursor-pointer opacity-50\"\n                      onClick={() => {\n                        props.onChange({\n                          ...props.value,\n                          args: Object.fromEntries(\n                            Object.entries(props.value.args).filter(\n                              ([k]) => k !== key,\n                            ),\n                          ),\n                        });\n                      }}\n                    />\n                  </div>\n                </td>\n              </tr>\n            ))}\n\n            <tr>\n              <td\n                className={cn(\n                  \"p-2 opacity-50 cursor-pointer flex gap-1 items-center\",\n                  \"\" in props.value.args && \"opacity-20 pointer-events-none\",\n                )}\n                onClick={\n                  \"\" in props.value.args\n                    ? undefined\n                    : () => {\n                        props.onChange({\n                          ...props.value,\n                          args: {\n                            ...props.value.args,\n                            \"\": \"\",\n                          },\n                        });\n                      }\n                }\n              >\n                <PlusCircleIcon className=\"w-6 h-6\" />\n                Add argument\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n}\n\nexport function ToolCallsEditor(props: {\n  message: Message;\n  onUpdate: (newValue: Message) => void;\n}) {\n  const { assistantConfig } = useThreadAndAssistant();\n  const availableTools =\n    assistantConfig?.config.configurable?.[\"type==agent/tools\"]?.map(\n      (t) => t.type,\n    ) ?? [];\n  if (!props.message.tool_calls?.length && !availableTools.length) {\n    return null;\n  }\n  return (\n    <div>\n      {props.message.tool_calls?.map((toolCall, i) => (\n        <ToolCallEditor\n          key={i}\n          value={toolCall}\n          onChange={(newValue) => {\n            props.onUpdate({\n              ...props.message,\n              tool_calls: props.message.tool_calls?.map((tc, j) =>\n                j === i ? newValue : tc,\n              ),\n            });\n          }}\n          onRemove={() => {\n            props.onUpdate({\n              ...props.message,\n              tool_calls: props.message.tool_calls?.filter((_, j) => j !== i),\n            });\n          }}\n          availableTools={availableTools}\n        />\n      ))}\n      <div\n        className=\"pl-2 flex items-center gap-1 cursor-pointer opacity-50\"\n        onClick={() => {\n          props.onUpdate({\n            ...props.message,\n            tool_calls: [\n              ...(props.message.tool_calls ?? []),\n              { id: v4(), name: availableTools[0], args: {} },\n            ],\n          });\n        }}\n      >\n        <PlusCircleIcon className={cn(\"w-6 h-6\")} />\n        Add tool call\n      </div>\n    </div>\n  );\n}\n\nexport function MessageContentEditor(props: {\n  message: Message;\n  onUpdate: (newValue: Message) => void;\n}) {\n  if (typeof props.message.content === \"string\") {\n    if (!props.message.content.trim()) {\n      return null;\n    }\n    return (\n      <StringEditor\n        onChange={(newValue) =>\n          props.onUpdate({\n            ...props.message,\n            content: newValue,\n          })\n        }\n        className=\"text-gray-900 text-md leading-normal prose min-w-[65ch] bg-white\"\n        value={props.message.content}\n      />\n    );\n  }\n  let content = props.message.content;\n  if (Array.isArray(content)) {\n    content = content.filter((it) =>\n      typeof it === \"object\" && !!it && \"type\" in it\n        ? it.type !== \"tool_use\"\n        : true,\n    );\n  }\n  if (\n    Array.isArray(content)\n      ? content.length === 0\n      : Object.keys(content).length === 0\n  ) {\n    return null;\n  }\n\n  return (\n    <JsonEditor\n      value={JSON.stringify(content, null, 2)}\n      onChange={(newValue) => {\n        try {\n          props.onUpdate({\n            ...props.message,\n            content: JSON.parse(newValue),\n          });\n        } catch (e) {\n          console.error(e);\n        }\n      }}\n    />\n  );\n}\n\nexport const MessageEditor = memo(function (props: {\n  message: Message;\n  onUpdate: (newValue: Message) => void;\n  abandonEdits: () => void;\n}) {\n  const isToolRes = [\"function\", \"tool\"].includes(props.message.type);\n  return (\n    <div className=\"flex flex-col mb-8 group\">\n      <div className=\"leading-6 flex flex-row\">\n        <div\n          className={cn(\n            \"flex flex-row space-between mr-4\",\n            isToolRes && \"mt-1\",\n          )}\n        >\n          <div className=\"font-medium text-sm text-gray-400 uppercase mt-1 w-28 flex flex-col\">\n            {props.message.type}\n          </div>\n\n          <XCircleIcon\n            className=\"w-6 h-6 cursor-pointer shrink-0 opacity-40 hover:opacity-100 transition-opacity duration-100\"\n            onMouseUp={props.abandonEdits}\n          />\n        </div>\n        <div className=\"prose flex flex-col w-[65ch] gap-2\">\n          <MessageContentEditor\n            message={props.message}\n            onUpdate={props.onUpdate}\n          />\n          {props.message.type === \"ai\" && props.message.tool_calls && (\n            <ToolCallsEditor\n              message={props.message}\n              onUpdate={props.onUpdate}\n            />\n          )}\n        </div>\n      </div>\n    </div>\n  );\n});\n"
  },
  {
    "path": "frontend/src/components/NewChat.tsx",
    "content": "import { ConfigList } from \"./ConfigList\";\nimport { Schemas } from \"../hooks/useSchemas\";\nimport TypingBox from \"./TypingBox\";\nimport { Config } from \"./Config\";\nimport {\n  ConfigListProps,\n  Config as ConfigInterface,\n} from \"../hooks/useConfigList\";\nimport { cn } from \"../utils/cn\";\nimport { MessageWithFiles } from \"../utils/formTypes.ts\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport { useThreadAndAssistant } from \"../hooks/useThreadAndAssistant.ts\";\n\ninterface NewChatProps extends ConfigListProps {\n  configSchema: Schemas[\"configSchema\"];\n  configDefaults: Schemas[\"configDefaults\"];\n  enterConfig: (id: string | null) => void;\n  deleteConfig: (id: string) => Promise<void>;\n  startChat: (\n    config: ConfigInterface,\n    message: MessageWithFiles,\n  ) => Promise<void>;\n}\n\nexport function NewChat(props: NewChatProps) {\n  const navigator = useNavigate();\n  const { assistantId } = useParams();\n\n  const { assistantConfig, isLoading } = useThreadAndAssistant();\n\n  if (isLoading) return <div>Loading...</div>;\n  if (!assistantConfig)\n    return <div>Could not find assistant with given id.</div>;\n\n  return (\n    <div\n      className={cn(\n        \"flex flex-col items-stretch\",\n        assistantConfig ? \"pb-[76px]\" : \"pb-6\",\n      )}\n    >\n      <div className=\"flex-1 flex flex-col md:flex-row lg:items-stretch self-stretch\">\n        <div className=\"md:w-72 border-r border-gray-200 pr-6\">\n          <ConfigList\n            configs={props.configs}\n            currentConfig={assistantConfig}\n            enterConfig={(id) => navigator(`/assistant/${id}`)}\n            deleteConfig={props.deleteConfig}\n          />\n        </div>\n\n        <main className=\"flex-1\">\n          <div className=\"px-4\">\n            <Config\n              key={assistantId}\n              config={assistantConfig}\n              configSchema={props.configSchema}\n              configDefaults={props.configDefaults}\n              saveConfig={props.saveConfig}\n              enterConfig={props.enterConfig}\n            />\n          </div>\n        </main>\n      </div>\n      <div className=\"fixed left-0 lg:left-72 bottom-0 right-0 p-4\">\n        <TypingBox\n          onSubmit={async (msg: MessageWithFiles) => {\n            if (assistantConfig) {\n              await props.startChat(assistantConfig, msg);\n            }\n          }}\n          currentConfig={assistantConfig}\n          currentChat={null}\n        />\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/NotFound.tsx",
    "content": "export function NotFound() {\n  return <div>Page not found.</div>;\n}\n"
  },
  {
    "path": "frontend/src/components/OrphanChat.tsx",
    "content": "import { useEffect, useState } from \"react\";\nimport { Config } from \"../hooks/useConfigList\";\nimport { Chat } from \"../types\";\nimport { getAssistants } from \"../api/assistants\";\nimport { useThreadAndAssistant } from \"../hooks/useThreadAndAssistant\";\n\nexport function OrphanChat(props: {\n  chat: Chat;\n  updateChat: (\n    name: string,\n    thread_id: string,\n    assistant_id: string | null,\n  ) => Promise<Chat>;\n}) {\n  const [newConfigId, setNewConfigId] = useState(null as string | null);\n  const [configs, setConfigs] = useState<Config[]>([]);\n  const { invalidateChat } = useThreadAndAssistant();\n\n  const update = async () => {\n    if (!newConfigId) {\n      alert(\"Please select a bot.\");\n      return;\n    }\n    const updatedChat = await props.updateChat(\n      props.chat.thread_id,\n      props.chat.name,\n      newConfigId,\n    );\n    invalidateChat(updatedChat.thread_id);\n  };\n\n  const botTypeToName = (botType: string) => {\n    switch (botType) {\n      case \"chatbot\":\n        return \"Chatbot\";\n      case \"chat_retrieval\":\n        return \"RAG\";\n      case \"agent\":\n        return \"Assistant\";\n      default:\n        return botType;\n    }\n  };\n\n  useEffect(() => {\n    async function fetchConfigs() {\n      const configs = await getAssistants();\n      const suitableConfigs = configs\n        ? configs.filter(\n            (config) =>\n              config.config.configurable?.type ===\n              props.chat.metadata?.assistant_type,\n          )\n        : [];\n      setConfigs(suitableConfigs);\n    }\n\n    fetchConfigs();\n  }, [props.chat.metadata?.assistant_type]);\n\n  return (\n    <div className=\"flex-1 flex flex-col items-stretch pb-[76px] pt-2\">\n      {configs.length ? (\n        <form\n          onSubmit={async (e) => {\n            e.preventDefault();\n            await update();\n          }}\n          className=\"space-y-4 max-w-xl w-full px-4\"\n        >\n          <div className=\"inline-flex items-center rounded-md bg-yellow-100 px-2 py-1 text-xs font-medium text-yellow-700\">\n            This chat has no bot attached. To continue chatting, please attach a\n            bot.\n          </div>\n          <div className=\"flex flex-row flex-1\">\n            <div className=\"relative flex flex-grow items-stretch focus-within:z-10\">\n              <select\n                className=\"block w-full rounded-none rounded-l-md border-0 py-1.5 pl-4 text-gray-900 ring-1 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6 ring-inset ring-gray-300\"\n                onChange={(event) => setNewConfigId(event.target.value)}\n              >\n                <option value=\"\">Select a bot</option>\n                {configs.map((config, index) => (\n                  <option key={index} value={config.assistant_id}>\n                    {config.name}\n                  </option>\n                ))}\n              </select>\n            </div>\n            <button\n              type=\"submit\"\n              className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm leading-5 font-medium rounded-r-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-600\"\n            >\n              Save\n            </button>\n          </div>\n        </form>\n      ) : (\n        <div className=\"inline-flex items-center px-2 py-1\">\n          <div className=\"rounded-md bg-yellow-100 px-2 py-1 text-xs font-medium text-yellow-700\">\n            This chat has no bot attached. To continue chatting, you need to\n            attach a bot. However, there are no suitable bots available for this\n            chat. Please create a new bot with type{\" \"}\n            {botTypeToName(props.chat.metadata?.assistant_type as string)} and\n            try again.\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/String.tsx",
    "content": "import { MarkedOptions, marked } from \"marked\";\nimport DOMPurify from \"dompurify\";\nimport { cn } from \"../utils/cn\";\n\nconst OPTIONS: MarkedOptions = {\n  gfm: true,\n  breaks: true,\n};\n\nexport function StringViewer(props: {\n  value: string;\n  className?: string;\n  markdown?: boolean;\n}) {\n  return props.markdown ? (\n    <div\n      className={cn(\"text-gray-900 prose\", props.className)}\n      dangerouslySetInnerHTML={{\n        __html: DOMPurify.sanitize(marked(props.value, OPTIONS)).trim(),\n      }}\n    />\n  ) : (\n    <div className={cn(\"text-gray-900 prose\", props.className)}>\n      {props.value}\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/StringEditor.tsx",
    "content": "import { cn } from \"../utils/cn\";\n\nconst COMMON_CLS = cn(\n  \"text-sm col-[1] row-[1] m-0 resize-none overflow-hidden whitespace-pre-wrap break-words bg-transparent px-2 py-1 rounded shadow-none\",\n);\n\nexport function StringEditor(props: {\n  value?: string | null | undefined;\n  placeholder?: string;\n  className?: string;\n  onChange?: (e: string) => void;\n  autoFocus?: boolean;\n  readOnly?: boolean;\n  cursorPointer?: boolean;\n  disabled?: boolean;\n  fullHeight?: boolean;\n}) {\n  return (\n    <div\n      className={\n        cn(\"grid w-full\", props.className) +\n        (props.fullHeight ? \"\" : \" max-h-80 overflow-auto \")\n      }\n    >\n      <textarea\n        className={cn(\n          COMMON_CLS,\n          \"text-transparent caret-black rounded focus:outline-0 focus:ring-0\",\n        )}\n        disabled={props.disabled}\n        value={props.value ?? \"\"}\n        rows={1}\n        onChange={(e) => {\n          const target = e.target as HTMLTextAreaElement;\n          props.onChange?.(target.value);\n        }}\n        placeholder={props.placeholder}\n        readOnly={props.readOnly}\n        autoFocus={props.autoFocus && !props.readOnly}\n      />\n      <div\n        aria-hidden\n        className={cn(COMMON_CLS, \"pointer-events-none select-none\")}\n      >\n        {props.value}{\" \"}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/Tool.tsx",
    "content": "import { ChevronDownIcon } from \"@heroicons/react/24/outline\";\nimport { ToolCall } from \"../types\";\nimport { str } from \"../utils/str\";\nimport { cn } from \"../utils/cn\";\n\nexport function ToolRequest(\n  props: ToolCall & {\n    open?: boolean;\n    setOpen?: (open: boolean) => void;\n  },\n) {\n  return (\n    <>\n      <span className=\"text-gray-900 whitespace-pre-wrap break-words mr-2\">\n        Use\n      </span>\n      {props.name && (\n        <span className=\"inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-sm font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 relative -top-[1px] mr-2\">\n          {props.name}\n        </span>\n      )}\n      {props.args && (\n        <div className=\"text-gray-900 mt-2 mb-4 whitespace-pre-wrap break-words\">\n          <div className=\"ring-1 ring-gray-300 rounded\">\n            <table className=\"divide-y divide-gray-300\">\n              <tbody>\n                {Object.entries(props.args).map(([key, value], i) => (\n                  <tr key={i}>\n                    <td\n                      className={cn(\n                        i === 0 ? \"\" : \"border-t border-transparent\",\n                        \"py-1 px-3 table-cell text-sm border-r border-r-gray-300\",\n                      )}\n                    >\n                      <div className=\"font-medium text-gray-500\">{key}</div>\n                    </td>\n                    <td\n                      className={cn(\n                        i === 0 ? \"\" : \"border-t border-gray-200\",\n                        \"py-1 px-3 table-cell\",\n                      )}\n                    >\n                      {str(value)}\n                    </td>\n                  </tr>\n                ))}\n              </tbody>\n            </table>\n          </div>\n        </div>\n      )}\n    </>\n  );\n}\n\nexport function ToolResponse(props: {\n  name?: string;\n  open?: boolean;\n  setOpen?: (open: boolean) => void;\n}) {\n  return (\n    <>\n      <span className=\"text-gray-900 whitespace-pre-wrap break-words mr-2\">\n        Results from\n      </span>\n      {props.name && (\n        <span className=\"inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-sm font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 relative -top-[1px] mr-2\">\n          {props.name}\n        </span>\n      )}\n      {props.setOpen && (\n        <span\n          className={cn(\n            \"inline-flex items-center rounded-md bg-gray-50 px-2 py-1 text-sm font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10 cursor-pointer relative top-1\",\n            props.open && \"mb-2\",\n          )}\n          onClick={(e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            props.setOpen?.(!props.open);\n          }}\n        >\n          <ChevronDownIcon\n            className={cn(\n              \"h-5 w-5 transition opacity-70 hover:opacity-100\",\n              props.open ? \"rotate-180\" : \"\",\n            )}\n          />\n        </span>\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "frontend/src/components/TypingBox.tsx",
    "content": "import {\n  PaperAirplaneIcon,\n  ChatBubbleLeftIcon,\n  XCircleIcon,\n  DocumentPlusIcon,\n  DocumentTextIcon,\n  DocumentIcon,\n} from \"@heroicons/react/20/solid\";\nimport { cn } from \"../utils/cn\";\nimport { Fragment, useCallback, useEffect, useState } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MessageWithFiles } from \"../utils/formTypes.ts\";\nimport { DROPZONE_CONFIG, TYPE_NAME } from \"../constants.ts\";\nimport { Config } from \"../hooks/useConfigList.ts\";\nimport { Chat } from \"../types\";\n\nfunction getFileTypeIcon(fileType: string) {\n  switch (fileType) {\n    case \"text/plain\":\n    case \"text/csv\":\n    case \"text/html\":\n      return <DocumentTextIcon className=\"h-5 w-5 text-gray-500\" />;\n    case \"application/pdf\":\n      return <DocumentIcon className=\"h-5 w-5 text-red-500\" />;\n    case \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n    case \"application/msword\":\n      return <DocumentIcon className=\"h-5 w-5 text-blue-500\" />;\n    default:\n      return <DocumentIcon className=\"h-5 w-5 text-gray-500\" />;\n  }\n}\n\nfunction FileIcon(props: { fileType: string }) {\n  return <div>{getFileTypeIcon(props.fileType)}</div>;\n}\n\nfunction convertBytesToReadableSize(bytes: number) {\n  const units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n  let i = 0;\n  while (bytes >= 1024 && i < units.length - 1) {\n    bytes /= 1024;\n    i++;\n  }\n  return `${bytes.toFixed(1)} ${units[i]}`;\n}\n\nexport default function TypingBox(props: {\n  onSubmit: (data: MessageWithFiles) => void;\n  onInterrupt?: () => void;\n  inflight?: boolean;\n  currentConfig: Config;\n  currentChat: Chat | null;\n}) {\n  const [inflight, setInflight] = useState(false);\n  const isInflight = props.inflight || inflight;\n  const [files, setFiles] = useState<File[]>([]);\n  const [isDocumentRetrievalActive, setIsDocumentRetrievalActive] =\n    useState(false);\n\n  const { currentConfig, currentChat } = props;\n\n  useEffect(() => {\n    let configurable = null;\n    if (currentConfig) {\n      configurable = currentConfig.config?.configurable;\n    }\n    const agent_type = configurable?.[\"type\"] as TYPE_NAME | null;\n    if (agent_type === null || agent_type === \"chatbot\") {\n      setIsDocumentRetrievalActive(false);\n      return;\n    }\n    if (agent_type === \"chat_retrieval\") {\n      setIsDocumentRetrievalActive(true);\n      return;\n    }\n    const tools =\n      (configurable?.[\"type==agent/tools\"] as { name: string }[]) ?? [];\n    setIsDocumentRetrievalActive(tools.some((t) => t.name === \"Retrieval\"));\n  }, [currentConfig, currentChat]);\n\n  const onDrop = useCallback((acceptedFiles: File[]) => {\n    setFiles((prevFiles) => {\n      const newFiles = acceptedFiles.filter(\n        (acceptedFile) =>\n          !prevFiles.some(\n            (prevFile) =>\n              prevFile.name === acceptedFile.name &&\n              prevFile.size === acceptedFile.size,\n          ),\n      );\n      return [...prevFiles, ...newFiles];\n    });\n  }, []);\n\n  const { open } = useDropzone({\n    ...DROPZONE_CONFIG,\n    onDrop,\n    // Disable click and keydown behavior\n    noClick: true,\n    noKeyboard: true,\n  });\n\n  const FilesToShow = files.map((file) => {\n    const readableSize = convertBytesToReadableSize(file.size); // This would be a new utility function.\n    return (\n      <Fragment key={file.name}>\n        <div className=\"flex items-center\">\n          <FileIcon fileType={file.type} />{\" \"}\n          {/* New component to render file type icons */}\n          <span className=\"ml-2\">{file.name}</span>\n        </div>\n        <span className=\"text-sm text-gray-600\">{readableSize}</span>\n        <span\n          className=\"justify-center not-prose ml-2 inline-flex items-center rounded-full text-xs font-medium cursor-pointer bg-gray-50 text-gray-600 relative top-[1px]\"\n          onClick={() => setFiles((files) => files.filter((f) => f !== file))}\n        >\n          <XCircleIcon className=\"h-4 w-4\" />\n        </span>\n      </Fragment>\n    );\n  });\n\n  return (\n    <div className=\"flex flex-col\">\n      {files.length > 0 ? (\n        <div\n          className={cn(\n            \"self-end w-fit grid grid-cols-[auto,1fr,auto]\" +\n              \" gap-2 p-2 bg-white rounded-md text-sm text-gray-900\" +\n              \" shadow-sm border border-gray-300\",\n            isInflight && \"opacity-50 cursor-not-allowed\",\n          )}\n        >\n          {FilesToShow}\n        </div>\n      ) : null}\n      <form\n        className=\"mt-2 flex rounded-md shadow-sm\"\n        onSubmit={async (e) => {\n          e.preventDefault();\n          if (isInflight) return;\n          const form = e.target as HTMLFormElement;\n          const message = form.message.value;\n          if (!message) return;\n          setInflight(true);\n          await props.onSubmit({ message, files });\n          setInflight(false);\n          form.message.value = \"\";\n          setFiles([]);\n        }}\n      >\n        {\" \"}\n        <div\n          className={cn(\n            \"relative flex flex-grow items-stretch focus-within:z-10\",\n            isInflight && \"opacity-50 cursor-not-allowed\",\n          )}\n        >\n          <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n            <ChatBubbleLeftIcon\n              className=\"h-5 w-5 text-gray-400\"\n              aria-hidden=\"true\"\n            />\n          </div>\n          <input\n            type=\"text\"\n            name=\"messsage\"\n            id=\"message\"\n            autoFocus\n            autoComplete=\"off\"\n            className=\"block w-full rounded-none rounded-l-md border-0 py-1.5 pl-10 text-gray-900 ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6\"\n            placeholder=\"Send a message\"\n            readOnly={isInflight}\n          />\n          {isDocumentRetrievalActive && (\n            <div className=\"cursor-pointer absolute m-1 p-3 inset-y-0 right-0 flex items-center pr-3 hover:bg-gray-50\">\n              <DocumentPlusIcon\n                className=\"h-5 w-5 text-gray-400\"\n                aria-hidden=\"true\"\n                onClick={open}\n              />\n            </div>\n          )}\n        </div>\n        <button\n          type=\"submit\"\n          disabled={isInflight && !props.onInterrupt}\n          onClick={\n            props.onInterrupt\n              ? (e) => {\n                  e.preventDefault();\n                  props.onInterrupt?.();\n                }\n              : undefined\n          }\n          className={cn(\n            \"relative -ml-px inline-flex items-center gap-x-1.5 rounded-r-md px-3 \" +\n              \"py-2 text-sm font-semibold text-gray-900 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 bg-white\",\n            isInflight && !props.onInterrupt && \"opacity-50 cursor-not-allowed\",\n          )}\n        >\n          {props.onInterrupt ? (\n            <XCircleIcon\n              className=\"-ml-0.5 h-5 w-5 text-gray-400\"\n              aria-hidden=\"true\"\n            />\n          ) : (\n            <PaperAirplaneIcon\n              className=\"-ml-0.5 h-5 w-5 text-gray-400\"\n              aria-hidden=\"true\"\n            />\n          )}\n          {isInflight ? (props.onInterrupt ? \"Cancel\" : \"Sending...\") : \"Send\"}\n        </button>\n      </form>\n    </div>\n  );\n}\n"
  },
  {
    "path": "frontend/src/constants.ts",
    "content": "export const TYPES = {\n  agent: {\n    id: \"agent\",\n    title: \"Assistant\",\n    description:\n      \"These GPTs can use an arbitrary number of tools, and you can give them arbitrary instructions. The LLM itself is responsible for deciding which tools to call and how many times to call them. This makes them super powerful and flexible, but they can be unreliable at times! As such, only a subset of the most performant models work with these.\",\n    files: true,\n  },\n  chatbot: {\n    id: \"chatbot\",\n    title: \"Chatbot\",\n    description:\n      \"These GPTs are solely parameterized by arbitrary instructions. This makes them great at taking on specific personas or characters. Because these are a relatively simple architecture, these work well with even less powerful models.\",\n    files: false,\n  },\n  chat_retrieval: {\n    id: \"chat_retrieval\",\n    title: \"RAG\",\n    description:\n      \"These GPTs can be given an arbitrary number of files, and you can give them arbitrary instructions. During each interaction the files are searched once (and only once) for relevant information, and then GPT responds to the user. This makes them perfect if you want to create a simple GPT that has knowledge of external data. Because these are a relatively simple architecture, these work well with even less powerful models.\",\n    files: true,\n  },\n} as const;\n\nexport type TYPE_NAME = (typeof TYPES)[keyof typeof TYPES][\"id\"];\n\nexport const DROPZONE_CONFIG = {\n  multiple: true,\n  accept: {\n    \"text/*\": [\".txt\", \".htm\", \".html\"],\n    \"application/pdf\": [\".pdf\"],\n    \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": [\n      \".docx\",\n    ],\n    \"application/msword\": [\".doc\"],\n  },\n  maxSize: 10_000_000, // Up to 10 MB file size.\n};\n"
  },
  {
    "path": "frontend/src/hooks/useChatList.ts",
    "content": "import { useCallback, useEffect, useReducer } from \"react\";\nimport orderBy from \"lodash/orderBy\";\nimport { Chat } from \"../types\";\n\nexport interface ChatListProps {\n  chats: Chat[] | null;\n  createChat: (name: string, assistant_id: string) => Promise<Chat>;\n  updateChat: (\n    name: string,\n    thread_id: string,\n    assistant_id: string | null,\n  ) => Promise<Chat>;\n  deleteChat: (thread_id: string) => Promise<void>;\n}\n\nfunction chatsReducer(\n  state: Chat[] | null,\n  action: Chat | Chat[],\n): Chat[] | null {\n  state = state ?? [];\n  if (!Array.isArray(action)) {\n    const newChat = action;\n    action = [\n      ...state.filter((c) => c.thread_id !== newChat.thread_id),\n      newChat,\n    ];\n  }\n  return orderBy(action, \"updated_at\", \"desc\");\n}\n\nexport function useChatList(): ChatListProps {\n  const [chats, setChats] = useReducer(chatsReducer, null);\n\n  useEffect(() => {\n    async function fetchChats() {\n      const chats = await fetch(\"/threads/\", {\n        headers: {\n          Accept: \"application/json\",\n        },\n      }).then((r) => r.json());\n      setChats(chats);\n    }\n\n    fetchChats();\n  }, []);\n\n  const createChat = useCallback(async (name: string, assistant_id: string) => {\n    const response = await fetch(`/threads`, {\n      method: \"POST\",\n      body: JSON.stringify({ assistant_id, name }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        Accept: \"application/json\",\n      },\n    });\n    const saved = await response.json();\n    setChats(saved);\n    return saved;\n  }, []);\n\n  const updateChat = useCallback(\n    async (thread_id: string, name: string, assistant_id: string | null) => {\n      const response = await fetch(`/threads/${thread_id}`, {\n        method: \"PUT\",\n        body: JSON.stringify({ assistant_id, name }),\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Accept: \"application/json\",\n        },\n      });\n      const saved = await response.json();\n      setChats(saved);\n      return saved;\n    },\n    [],\n  );\n\n  const deleteChat = useCallback(\n    async (thread_id: string) => {\n      await fetch(`/threads/${thread_id}`, {\n        method: \"DELETE\",\n        headers: {\n          Accept: \"application/json\",\n        },\n      });\n      setChats((chats || []).filter((c: Chat) => c.thread_id !== thread_id));\n    },\n    [chats],\n  );\n\n  return {\n    chats,\n    createChat,\n    updateChat,\n    deleteChat,\n  };\n}\n"
  },
  {
    "path": "frontend/src/hooks/useChatMessages.ts",
    "content": "import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Message } from \"../types\";\nimport { StreamState, mergeMessagesById } from \"./useStreamState\";\n\nasync function getState(threadId: string) {\n  const { values, next } = await fetch(`/threads/${threadId}/state`, {\n    headers: {\n      Accept: \"application/json\",\n    },\n  }).then((r) => (r.ok ? r.json() : Promise.reject(r.statusText)));\n  return { values, next };\n}\n\nfunction usePrevious<T>(value: T): T | undefined {\n  const ref = useRef<T>();\n  useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n}\n\nexport function useChatMessages(\n  threadId: string | null,\n  stream: StreamState | null,\n  stopStream?: (clear?: boolean) => void,\n) {\n  const [messages, setMessages] = useState<Message[] | null>(null);\n  const [next, setNext] = useState<string[]>([]);\n  const prevStreamStatus = usePrevious(stream?.status);\n\n  const refreshMessages = useCallback(async () => {\n    if (threadId) {\n      const { values, next } = await getState(threadId);\n      const messages = values\n        ? Array.isArray(values)\n          ? values\n          : values.messages\n        : [];\n      setMessages(messages);\n      setNext(next);\n    }\n  }, [threadId]);\n\n  useEffect(() => {\n    refreshMessages();\n    return () => {\n      setMessages(null);\n    };\n  }, [threadId, refreshMessages]);\n\n  useEffect(() => {\n    async function fetchMessages() {\n      if (threadId) {\n        const { values, next } = await getState(threadId);\n        const messages = Array.isArray(values) ? values : values.messages;\n        setMessages(messages);\n        setNext(next);\n        stopStream?.(true);\n      }\n    }\n\n    if (prevStreamStatus === \"inflight\" && stream?.status !== \"inflight\") {\n      setNext([]);\n      fetchMessages();\n    }\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [stream?.status]);\n\n  return useMemo(\n    () => ({\n      refreshMessages,\n      messages: mergeMessagesById(messages, stream?.messages),\n      next,\n    }),\n    [messages, stream?.messages, next, refreshMessages],\n  );\n}\n"
  },
  {
    "path": "frontend/src/hooks/useConfigList.ts",
    "content": "import { useCallback, useEffect, useReducer } from \"react\";\nimport orderBy from \"lodash/orderBy\";\nimport { getAssistants } from \"../api/assistants\";\n\nexport interface Config {\n  assistant_id: string;\n  name: string;\n  updated_at: string;\n  config: {\n    configurable?: {\n      type?: string;\n      \"type==agent/tools\"?: {\n        type: string;\n        name: string;\n        description: string;\n      }[];\n      [key: string]: unknown;\n    };\n  };\n  public: boolean;\n  mine?: boolean;\n}\n\nexport interface ConfigListProps {\n  configs: Config[] | null;\n  saveConfig: (\n    key: string,\n    config: Config[\"config\"],\n    files: File[],\n    isPublic: boolean,\n    assistantId?: string,\n  ) => Promise<string>;\n  deleteConfig: (assistantId: string) => Promise<void>;\n}\n\nfunction configsReducer(\n  state: Config[] | null,\n  action: Config | Config[],\n): Config[] | null {\n  state = state ?? [];\n  if (!Array.isArray(action)) {\n    const newConfig = action;\n    action = [\n      ...state.filter((c) => c.assistant_id !== newConfig.assistant_id),\n      newConfig,\n    ];\n  }\n  return orderBy(action, \"updated_at\", \"desc\");\n}\n\nexport function useConfigList(): ConfigListProps {\n  const [configs, setConfigs] = useReducer(configsReducer, null);\n\n  useEffect(() => {\n    async function fetchConfigs() {\n      const assistants = await getAssistants();\n      setConfigs(\n        assistants ? assistants.map((c) => ({ ...c, mine: true })) : [],\n      );\n    }\n\n    fetchConfigs();\n  }, []);\n\n  const saveConfig = useCallback(\n    async (\n      name: string,\n      config: Config[\"config\"],\n      files: File[],\n      isPublic: boolean,\n      assistantId?: string,\n    ): Promise<string> => {\n      const confResponse = await fetch(\n        assistantId ? `/assistants/${assistantId}` : \"/assistants\",\n        {\n          method: assistantId ? \"PUT\" : \"POST\",\n          body: JSON.stringify({ name, config, public: isPublic }),\n          headers: {\n            \"Content-Type\": \"application/json\",\n            Accept: \"application/json\",\n          },\n        },\n      );\n      const savedConfig = (await confResponse.json()) as Config;\n      if (files.length) {\n        const assistant_id = savedConfig.assistant_id;\n        const formData = files.reduce((formData, file) => {\n          formData.append(\"files\", file);\n          return formData;\n        }, new FormData());\n        formData.append(\n          \"config\",\n          JSON.stringify({ configurable: { assistant_id } }),\n        );\n        await fetch(`/ingest`, {\n          method: \"POST\",\n          body: formData,\n        });\n      }\n      setConfigs({ ...savedConfig, mine: true });\n      return savedConfig.assistant_id;\n    },\n    [],\n  );\n\n  const deleteConfig = useCallback(\n    async (assistantId: string): Promise<void> => {\n      await fetch(`/assistants/${assistantId}`, {\n        method: \"DELETE\",\n        headers: {\n          Accept: \"application/json\",\n        },\n      });\n      setConfigs((configs || []).filter((c) => c.assistant_id !== assistantId));\n    },\n    [configs],\n  );\n\n  return {\n    configs,\n    saveConfig,\n    deleteConfig,\n  };\n}\n"
  },
  {
    "path": "frontend/src/hooks/useMessageEditing.ts",
    "content": "import { useCallback, useState } from \"react\";\nimport { Message } from \"../types\";\nimport { omit } from \"lodash\";\n\nexport function useMessageEditing(\n  threadId: string | undefined,\n  onSuccess: () => void,\n) {\n  const [editing, setEditing] = useState<Record<string, Message>>({});\n\n  const recordEdits = useCallback((msg: Message) => {\n    setEditing((current) => ({ ...current, [msg.id]: msg }));\n  }, []);\n  const commitEdits = useCallback(async () => {\n    if (!threadId) return;\n    fetch(`/threads/${threadId}/state`, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ values: Object.values(editing) }),\n    })\n      .then((res) => {\n        if (res.ok) {\n          setEditing({});\n          onSuccess();\n        } else {\n          return Promise.reject(res.statusText);\n        }\n      })\n      .catch((e) => {\n        console.error(e);\n      });\n  }, [threadId, editing, onSuccess]);\n  const abandonEdits = useCallback((msg?: Message) => {\n    if (msg) {\n      setEditing((current) => {\n        return omit(current, msg.id);\n      });\n    } else {\n      setEditing({});\n    }\n  }, []);\n\n  return {\n    editing,\n    recordEdits,\n    commitEdits: threadId ? commitEdits : undefined,\n    abandonEdits,\n  };\n}\n"
  },
  {
    "path": "frontend/src/hooks/useSchemas.ts",
    "content": "import { useEffect, useState } from \"react\";\nimport { simplifySchema } from \"../utils/simplifySchema\";\nimport { getDefaults } from \"../utils/defaults\";\n\nexport interface SchemaField {\n  type: string;\n  title: string;\n  description: string;\n  enum?: string[];\n  items?: SchemaField;\n  allOf?: SchemaField[];\n}\n\nexport interface Schemas {\n  configSchema: null | {\n    properties: {\n      configurable: {\n        properties: {\n          [key: string]: SchemaField;\n        };\n      };\n    };\n  };\n  configDefaults: null | {\n    configurable?: {\n      [key: string]: unknown;\n    };\n  };\n}\n\nexport function useSchemas() {\n  const [schemas, setSchemas] = useState<Schemas>({\n    configSchema: null,\n    configDefaults: null,\n  });\n\n  useEffect(() => {\n    async function save() {\n      const configSchema = await fetch(\"/runs/config_schema\")\n        .then((r) => r.json())\n        .then(simplifySchema);\n      setSchemas({\n        configSchema,\n        configDefaults: getDefaults(configSchema) as Record<string, unknown>,\n      });\n    }\n\n    save();\n  }, []);\n\n  return schemas;\n}\n"
  },
  {
    "path": "frontend/src/hooks/useStatePersist.tsx",
    "content": "import React, { useEffect, useState } from \"react\";\n\nconst PREFIX = \"langgizmo-\";\n\nexport function useStatePersist<T>(\n  defaultValue: T,\n  key: string,\n): [T, React.Dispatch<React.SetStateAction<T>>] {\n  const [state, setState] = useState<T>(() => {\n    const storageValue = localStorage.getItem(PREFIX + key);\n\n    if (storageValue) {\n      return JSON.parse(storageValue);\n    } else {\n      return defaultValue;\n    }\n  });\n\n  useEffect(() => {\n    localStorage.setItem(PREFIX + key, JSON.stringify(state));\n  }, [state, key]);\n\n  return [state, setState];\n}\n"
  },
  {
    "path": "frontend/src/hooks/useStreamState.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useCallback, useState } from \"react\";\nimport { fetchEventSource } from \"@microsoft/fetch-event-source\";\nimport { Message } from \"../types\";\n\nexport interface StreamState {\n  status: \"inflight\" | \"error\" | \"done\";\n  messages?: Message[] | Record<string, any>;\n  run_id?: string;\n}\n\nexport interface StreamStateProps {\n  stream: StreamState | null;\n  startStream: (\n    input: Message[] | Record<string, any> | null,\n    thread_id: string,\n    config?: Record<string, unknown>,\n  ) => Promise<void>;\n  stopStream?: (clear?: boolean) => void;\n}\n\nexport function useStreamState(): StreamStateProps {\n  const [current, setCurrent] = useState<StreamState | null>(null);\n  const [controller, setController] = useState<AbortController | null>(null);\n\n  const startStream = useCallback(\n    async (\n      input: Message[] | Record<string, any> | null,\n      thread_id: string,\n      config?: Record<string, unknown>,\n    ) => {\n      const controller = new AbortController();\n      setController(controller);\n      setCurrent({ status: \"inflight\", messages: input || [] });\n\n      await fetchEventSource(\"/runs/stream\", {\n        signal: controller.signal,\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({ input, thread_id, config }),\n        openWhenHidden: true,\n        onmessage(msg) {\n          if (msg.event === \"data\") {\n            const messages = JSON.parse(msg.data);\n            setCurrent((current) => ({\n              status: \"inflight\" as StreamState[\"status\"],\n              messages: mergeMessagesById(current?.messages, messages),\n              run_id: current?.run_id,\n            }));\n          } else if (msg.event === \"metadata\") {\n            const { run_id } = JSON.parse(msg.data);\n            setCurrent((current) => ({\n              status: \"inflight\",\n              messages: current?.messages,\n              run_id: run_id,\n            }));\n          } else if (msg.event === \"error\") {\n            setCurrent((current) => ({\n              status: \"error\",\n              messages: current?.messages,\n              run_id: current?.run_id,\n            }));\n          }\n        },\n        onclose() {\n          setCurrent((current) => ({\n            status: current?.status === \"error\" ? current.status : \"done\",\n            messages: current?.messages,\n            run_id: current?.run_id,\n          }));\n          setController(null);\n        },\n        onerror(error) {\n          setCurrent((current) => ({\n            status: \"error\",\n            messages: current?.messages,\n            run_id: current?.run_id,\n          }));\n          setController(null);\n          throw error;\n        },\n      });\n    },\n    [],\n  );\n\n  const stopStream = useCallback(\n    (clear: boolean = false) => {\n      controller?.abort();\n      setController(null);\n      if (clear) {\n        setCurrent((current) => ({\n          status: \"done\",\n          run_id: current?.run_id,\n        }));\n      } else {\n        setCurrent((current) => ({\n          status: \"done\",\n          messages: current?.messages,\n          run_id: current?.run_id,\n        }));\n      }\n    },\n    [controller],\n  );\n\n  return {\n    startStream,\n    stopStream,\n    stream: current,\n  };\n}\n\nexport function mergeMessagesById(\n  left: Message[] | Record<string, any> | null | undefined,\n  right: Message[] | Record<string, any> | null | undefined,\n): Message[] {\n  const leftMsgs = Array.isArray(left) ? left : left?.messages;\n  const rightMsgs = Array.isArray(right) ? right : right?.messages;\n\n  const merged = (leftMsgs ?? [])?.slice();\n  for (const msg of rightMsgs ?? []) {\n    const foundIdx = merged.findIndex((m: any) => m.id === msg.id);\n    if (foundIdx === -1) {\n      merged.push(msg);\n    } else {\n      merged[foundIdx] = msg;\n    }\n  }\n  return merged;\n}\n"
  },
  {
    "path": "frontend/src/hooks/useThreadAndAssistant.ts",
    "content": "import { useQuery, useQueryClient } from \"react-query\";\nimport { useParams } from \"react-router-dom\";\nimport { getAssistant } from \"../api/assistants\";\nimport { getThread } from \"../api/threads\";\n\nexport function useThreadAndAssistant() {\n  // Extract route parameters\n  const { chatId, assistantId } = useParams();\n  const queryClient = useQueryClient();\n\n  // React Query to fetch chat details if chatId is present\n  const { data: currentChat, isLoading: isLoadingChat } = useQuery(\n    [\"thread\", chatId],\n    () => getThread(chatId as string),\n    {\n      enabled: !!chatId,\n    },\n  );\n\n  // Determine the assistantId to use: either from the chat or the route directly\n  const effectiveAssistantId = assistantId || currentChat?.assistant_id;\n\n  // React Query to fetch assistant configuration based on the effectiveAssistantId\n  const { data: assistantConfig, isLoading: isLoadingAssistant } = useQuery(\n    [\"assistant\", effectiveAssistantId],\n    () => getAssistant(effectiveAssistantId as string),\n    {\n      enabled: !!effectiveAssistantId,\n    },\n  );\n\n  const invalidateChat = (chatId: string) => {\n    queryClient.invalidateQueries([\"thread\", chatId]);\n  };\n\n  // Return both loading states, the chat data, and the assistant configuration\n  return {\n    currentChat,\n    assistantConfig,\n    isLoading: isLoadingChat || isLoadingAssistant,\n    invalidateChat,\n  };\n}\n"
  },
  {
    "path": "frontend/src/hooks/useToolsSchemas.ts",
    "content": "import { useEffect, useState } from \"react\";\nimport { ToolConfigSchema, ToolSchema } from \"../utils/formTypes.ts\";\nimport { useSchemas } from \"./useSchemas.ts\";\n\ninterface SchemaItem {\n  properties: {\n    name: { const: string };\n    type: { default: string };\n    description: { const: string };\n    config: ToolConfigSchema;\n    multi_use: { const: boolean };\n  };\n}\n\ninterface ConfigSchema {\n  properties: {\n    configurable: {\n      properties: {\n        \"type==agent/tools\": {\n          items: {\n            anyOf: SchemaItem[];\n          };\n        };\n      };\n    };\n  };\n}\n\nexport function useToolsSchemas() {\n  const schemas = useSchemas();\n\n  const [tools, setTools] = useState<ToolSchema[]>([]);\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    const configSchema = schemas?.configSchema as ConfigSchema | null;\n    if (!configSchema) {\n      setLoading(true);\n      return;\n    }\n\n    const toolSchemas = configSchema.properties.configurable.properties[\n      \"type==agent/tools\"\n    ]?.items.anyOf as SchemaItem[] | undefined;\n    if (!toolSchemas) {\n      setLoading(true);\n      return;\n    }\n    const processedTools = toolSchemas.map((schema): ToolSchema => {\n      // Assuming config is always an object with properties\n      // You'll need a more sophisticated approach if configs can be more complex or vary significantly between tools\n      return {\n        name: schema.properties.name.const || \"\",\n        type: schema.properties.type.default || \"\",\n        description: schema.properties.description.const || \"\",\n        config: schema.properties.config || {},\n        multiUse: schema.properties.multi_use.const || false,\n      };\n    });\n    setLoading(false);\n    setTools(processedTools);\n  }, [schemas]);\n\n  return { tools, loading };\n}\n"
  },
  {
    "path": "frontend/src/index.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nhtml,\nbody,\n#root {\n  height: 100%;\n}\n\nbody {\n  background: #f5f5f5;\n}\n"
  },
  {
    "path": "frontend/src/main.tsx",
    "content": "import ReactDOM from \"react-dom/client\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport App from \"./App.tsx\";\nimport \"./index.css\";\nimport { BrowserRouter, Route, Routes } from \"react-router-dom\";\nimport { StrictMode } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\nimport { NotFound } from \"./components/NotFound.tsx\";\n\nfunction getCookie(name: string) {\n  const cookie = document.cookie\n    .split(\"; \")\n    .find((row) => row.startsWith(`${name}=`));\n  return cookie ? cookie.split(\"=\")[1] : null;\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n  const userId =\n    localStorage.getItem(\"opengpts_user_id\") ||\n    getCookie(\"opengpts_user_id\") ||\n    uuidv4();\n\n  // Push the user id to localStorage in any case to make it stable\n  localStorage.setItem(\"opengpts_user_id\", userId);\n  // Ensure the cookie is always set (for both new and returning users)\n  const weekInMilliseconds = 7 * 24 * 60 * 60 * 1000;\n  const expires = new Date(Date.now() + weekInMilliseconds).toUTCString();\n  document.cookie = `opengpts_user_id=${userId}; path=/; expires=${expires}; SameSite=Lax;`;\n});\n\nconst queryClient = new QueryClient();\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n  <StrictMode>\n    <QueryClientProvider client={queryClient}>\n      <BrowserRouter>\n        <Routes>\n          <Route path=\"/thread/:chatId\" element={<App />} />\n          <Route\n            path=\"/assistant/:assistantId/edit\"\n            element={<App edit={true} />}\n          />\n          <Route path=\"/assistant/:assistantId\" element={<App />} />\n          <Route path=\"/\" element={<App />} />\n          <Route path=\"*\" element={<NotFound />} />\n        </Routes>\n      </BrowserRouter>\n    </QueryClientProvider>\n  </StrictMode>,\n);\n"
  },
  {
    "path": "frontend/src/types.ts",
    "content": "export interface ToolCall {\n  id: string;\n  name: string;\n  args: Record<string, unknown>;\n}\n\nexport interface MessageDocument {\n  page_content: string;\n  metadata: Record<string, unknown>;\n}\n\nexport interface Message {\n  id: string;\n  type: string;\n  role?: string; // for chat_retrieval bot\n  content: string | MessageDocument[] | object;\n  name?: string;\n  tool_calls?: ToolCall[];\n  example: boolean;\n}\n\nexport interface Chat {\n  assistant_id: string;\n  thread_id: string;\n  name: string;\n  updated_at: string;\n  metadata: Record<string, unknown> | null;\n}\n"
  },
  {
    "path": "frontend/src/utils/cn.ts",
    "content": "import clsx from \"clsx\";\nimport { ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n"
  },
  {
    "path": "frontend/src/utils/defaults.ts",
    "content": "// (c) 2015 Chute Corporation. Released under the terms of the MIT License.\n// Modified to use TypeScript and handle edge cases with tuples\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-prototype-builtins */\n\n\"use strict\";\n\n/**\n * check whether item is plain object\n * @param {*} item\n * @return {Boolean}\n */\nconst isObject = (item: unknown): item is Record<string, unknown> => {\n  return (\n    typeof item === \"object\" &&\n    item !== null &&\n    item.toString() === {}.toString()\n  );\n};\n\n/**\n * deep JSON object clone\n *\n * @param {Object} source\n * @return {Object}\n */\nconst cloneJSON = (source: any): any => {\n  return JSON.parse(JSON.stringify(source));\n};\n\n/**\n * returns a result of deep merge of two objects\n *\n * @param {Object} target\n * @param {Object} source\n * @return {Object}\n */\nconst merge = (\n  target: Record<string, unknown>,\n  source: Record<string, unknown>,\n) => {\n  target = cloneJSON(target);\n\n  for (const key in source) {\n    if (source.hasOwnProperty(key)) {\n      const sourceKeyValue = source[key];\n      const targetKeyValue = target[key];\n\n      if (isObject(sourceKeyValue) && isObject(targetKeyValue)) {\n        target[key] = merge(targetKeyValue, sourceKeyValue);\n      } else {\n        target[key] = sourceKeyValue;\n      }\n    }\n  }\n  return target;\n};\n\n/**\n * get object by reference. works only with local references that points on\n * definitions object\n *\n * @param {String} path\n * @param {Object} definitions\n * @return {Object}\n */\nconst getLocalRef = function (\n  inputPath: string,\n  definitions: Record<string, unknown>,\n) {\n  const path = inputPath.replace(/^#\\/definitions\\//, \"\").split(\"/\");\n\n  const find = function (path: string[], root: any): any {\n    const key = path.shift();\n    if (!key) return {};\n\n    if (!root[key]) {\n      return {};\n    } else if (!path.length) {\n      return root[key];\n    } else {\n      return find(path, root[key]);\n    }\n  };\n\n  const result = find(path, definitions);\n\n  if (!isObject(result)) {\n    return result;\n  }\n  return cloneJSON(result);\n};\n\n/**\n * merge list of objects from allOf properties\n * if some of objects contains $ref field extracts this reference and merge it\n *\n * @param {Array} allOfList\n * @param {Object} definitions\n * @return {Object}\n */\nconst mergeAllOf = function (allOfList: any[], definitions: any) {\n  const length = allOfList.length;\n  let index = -1,\n    result = {};\n\n  while (++index < length) {\n    let item = allOfList[index];\n\n    item =\n      typeof item.$ref !== \"undefined\"\n        ? getLocalRef(item.$ref, definitions)\n        : item;\n\n    result = merge(result, item);\n  }\n\n  return result;\n};\n\n/**\n * returns a object that built with default values from json schema\n *\n * @param {Object} schema\n * @param {Object} definitions\n * @return {Object}\n */\nconst defaults = (schema: any, definitions: Record<string, any>): unknown => {\n  if (typeof schema[\"default\"] !== \"undefined\") {\n    return schema[\"default\"];\n  } else if (typeof schema.allOf !== \"undefined\") {\n    const mergedItem = mergeAllOf(schema.allOf, definitions);\n    return defaults(mergedItem, definitions);\n  } else if (typeof schema.$ref !== \"undefined\") {\n    const reference = getLocalRef(schema.$ref, definitions);\n    return defaults(reference, definitions);\n  } else if (schema.type === \"object\") {\n    if (!schema.properties) {\n      return {};\n    }\n\n    for (const key in schema.properties) {\n      if (schema.properties.hasOwnProperty(key)) {\n        schema.properties[key] = defaults(schema.properties[key], definitions);\n\n        if (typeof schema.properties[key] === \"undefined\") {\n          delete schema.properties[key];\n        }\n      }\n    }\n\n    return schema.properties;\n  } else if (schema.type === \"array\") {\n    if (!schema.items) {\n      return [];\n    }\n\n    // minimum item count\n    const ct = schema.minItems || 0;\n\n    // tuple-typed arrays\n    if (schema.items.constructor === Array) {\n      const values = schema.items.map((item: unknown) =>\n        defaults(item, definitions),\n      );\n\n      // remove undefined items at the end (unless required by minItems)\n      for (let i = values.length - 1; i >= 0; i--) {\n        if (typeof values[i] !== \"undefined\") {\n          break;\n        }\n        if (i + 1 > ct) {\n          values.pop();\n        }\n      }\n\n      // if all values are undefined -> return undefined even\n      // if minItems is set\n      if (values.every((item: unknown) => typeof item === \"undefined\")) {\n        return undefined;\n      }\n\n      return values;\n    }\n\n    // object-typed arrays\n    const value = defaults(schema.items, definitions);\n\n    if (typeof value === \"undefined\") {\n      return [];\n    } else {\n      const values = [];\n      for (let i = 0; i < Math.max(1, ct); i++) {\n        values.push(cloneJSON(value));\n      }\n      return values;\n    }\n  }\n};\n\n/**\n * main function\n *\n * @param {Object} schema\n * @param {Object|undefined} definitions\n * @return {Object}\n */\nexport function getDefaults(\n  schema: any,\n  definitions?: Record<string, unknown> | undefined,\n) {\n  if (typeof definitions === \"undefined\") {\n    definitions = (schema.definitions as Record<string, unknown>) || {};\n  } else if (isObject(schema.definitions)) {\n    definitions = merge(definitions, schema.definitions);\n  }\n\n  return defaults(cloneJSON(schema), definitions);\n}\n"
  },
  {
    "path": "frontend/src/utils/formTypes.ts",
    "content": "export type MessageWithFiles = {\n  message: string;\n  files: File[];\n};\n\nexport interface Tool {\n  id: string;\n  type: string;\n  name: string;\n  description: string;\n  config: ToolConfig;\n}\n\nexport interface ToolConfig {\n  [key: string]: string;\n}\n\nexport interface ToolSchema {\n  type: string;\n  name: string;\n  description: string;\n  multiUse: boolean;\n  config: ToolConfigSchema;\n}\n\ninterface PropertySchema {\n  type: string;\n  title?: string;\n  default?: string; // Assuming default values are strings\n}\n\nexport interface ToolConfigSchema {\n  title: string;\n  type: string;\n  required: string[];\n  properties: {\n    [key: string]: PropertySchema;\n  };\n}\n"
  },
  {
    "path": "frontend/src/utils/json-refs.d.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const JsonRefs: {\n  resolveRefs(schema: any): Promise<{ resolved: any }>;\n};\n"
  },
  {
    "path": "frontend/src/utils/json-refs.js",
    "content": "// Original source: https://github.com/whitlockjc/json-refs/blob/master/dist/json-refs-min.js\n\nexport const JsonRefs = (function (t) {\n  var n = {};\n  function r(e) {\n    if (n[e]) return n[e].exports;\n    var o = (n[e] = { i: e, l: !1, exports: {} });\n    return t[e].call(o.exports, o, o.exports, r), (o.l = !0), o.exports;\n  }\n  return (\n    (r.m = t),\n    (r.c = n),\n    (r.d = function (t, n, e) {\n      r.o(t, n) || Object.defineProperty(t, n, { enumerable: !0, get: e });\n    }),\n    (r.r = function (t) {\n      \"undefined\" != typeof Symbol &&\n        Symbol.toStringTag &&\n        Object.defineProperty(t, Symbol.toStringTag, { value: \"Module\" }),\n        Object.defineProperty(t, \"__esModule\", { value: !0 });\n    }),\n    (r.t = function (t, n) {\n      if ((1 & n && (t = r(t)), 8 & n)) return t;\n      if (4 & n && \"object\" == typeof t && t && t.__esModule) return t;\n      var e = Object.create(null);\n      if (\n        (r.r(e),\n        Object.defineProperty(e, \"default\", { enumerable: !0, value: t }),\n        2 & n && \"string\" != typeof t)\n      )\n        for (var o in t)\n          r.d(\n            e,\n            o,\n            function (n) {\n              return t[n];\n            }.bind(null, o),\n          );\n      return e;\n    }),\n    (r.n = function (t) {\n      var n =\n        t && t.__esModule\n          ? function () {\n              return t.default;\n            }\n          : function () {\n              return t;\n            };\n      return r.d(n, \"a\", n), n;\n    }),\n    (r.o = function (t, n) {\n      return Object.prototype.hasOwnProperty.call(t, n);\n    }),\n    (r.p = \"\"),\n    r((r.s = 84))\n  );\n})([\n  function (t, n) {\n    var r = Array.isArray;\n    t.exports = r;\n  },\n  function (t, n, r) {\n    var e;\n    try {\n      e = {\n        clone: r(88),\n        constant: r(64),\n        each: r(146),\n        filter: r(152),\n        has: r(175),\n        isArray: r(0),\n        isEmpty: r(177),\n        isFunction: r(17),\n        isUndefined: r(178),\n        keys: r(6),\n        map: r(179),\n        reduce: r(181),\n        size: r(184),\n        transform: r(190),\n        union: r(191),\n        values: r(210),\n      };\n    } catch (t) {}\n    e || (e = window._), (t.exports = e);\n  },\n  function (t, n, r) {\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(47),\n      i =\n        \"object\" == (\"undefined\" == typeof self ? \"undefined\" : e(self)) &&\n        self &&\n        self.Object === Object &&\n        self,\n      u = o || i || Function(\"return this\")();\n    t.exports = u;\n  },\n  function (t, n) {\n    function r(t) {\n      return (r =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    t.exports = function (t) {\n      return null != t && \"object\" == r(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(100),\n      o = r(105);\n    t.exports = function (t, n) {\n      var r = o(t, n);\n      return e(r) ? r : void 0;\n    };\n  },\n  function (t, n) {\n    function r(t) {\n      return (r =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    t.exports = function (t) {\n      var n = r(t);\n      return null != t && (\"object\" == n || \"function\" == n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(52),\n      o = r(37),\n      i = r(7);\n    t.exports = function (t) {\n      return i(t) ? e(t) : o(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(17),\n      o = r(34);\n    t.exports = function (t) {\n      return null != t && o(t.length) && !e(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = r(101),\n      i = r(102),\n      u = e ? e.toStringTag : void 0;\n    t.exports = function (t) {\n      return null == t\n        ? void 0 === t\n          ? \"[object Undefined]\"\n          : \"[object Null]\"\n        : u && u in Object(t)\n          ? o(t)\n          : i(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(2).Symbol;\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(132),\n      o = r(31),\n      i = r(133),\n      u = r(61),\n      c = r(134),\n      a = r(8),\n      s = r(48),\n      f = s(e),\n      l = s(o),\n      p = s(i),\n      h = s(u),\n      v = s(c),\n      d = a;\n    ((e && \"[object DataView]\" != d(new e(new ArrayBuffer(1)))) ||\n      (o && \"[object Map]\" != d(new o())) ||\n      (i && \"[object Promise]\" != d(i.resolve())) ||\n      (u && \"[object Set]\" != d(new u())) ||\n      (c && \"[object WeakMap]\" != d(new c()))) &&\n      (d = function (t) {\n        var n = a(t),\n          r = \"[object Object]\" == n ? t.constructor : void 0,\n          e = r ? s(r) : \"\";\n        if (e)\n          switch (e) {\n            case f:\n              return \"[object DataView]\";\n            case l:\n              return \"[object Map]\";\n            case p:\n              return \"[object Promise]\";\n            case h:\n              return \"[object Set]\";\n            case v:\n              return \"[object WeakMap]\";\n          }\n        return n;\n      }),\n      (t.exports = d);\n  },\n  function (t, n) {\n    function r(t) {\n      return (r =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var e;\n    e = (function () {\n      return this;\n    })();\n    try {\n      e = e || new Function(\"return this\")();\n    } catch (t) {\n      \"object\" === (\"undefined\" == typeof window ? \"undefined\" : r(window)) &&\n        (e = window);\n    }\n    t.exports = e;\n  },\n  function (t, n, r) {\n    (function (t) {\n      function e(t) {\n        return (e =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      var o = r(2),\n        i = r(121),\n        u = \"object\" == e(n) && n && !n.nodeType && n,\n        c = u && \"object\" == e(t) && t && !t.nodeType && t,\n        a = c && c.exports === u ? o.Buffer : void 0,\n        s = (a ? a.isBuffer : void 0) || i;\n      t.exports = s;\n    }).call(this, r(14)(t));\n  },\n  function (t, n) {\n    var r,\n      e,\n      o = (t.exports = {});\n    function i() {\n      throw new Error(\"setTimeout has not been defined\");\n    }\n    function u() {\n      throw new Error(\"clearTimeout has not been defined\");\n    }\n    function c(t) {\n      if (r === setTimeout) return setTimeout(t, 0);\n      if ((r === i || !r) && setTimeout)\n        return (r = setTimeout), setTimeout(t, 0);\n      try {\n        return r(t, 0);\n      } catch (n) {\n        try {\n          return r.call(null, t, 0);\n        } catch (n) {\n          return r.call(this, t, 0);\n        }\n      }\n    }\n    !(function () {\n      try {\n        r = \"function\" == typeof setTimeout ? setTimeout : i;\n      } catch (t) {\n        r = i;\n      }\n      try {\n        e = \"function\" == typeof clearTimeout ? clearTimeout : u;\n      } catch (t) {\n        e = u;\n      }\n    })();\n    var a,\n      s = [],\n      f = !1,\n      l = -1;\n    function p() {\n      f &&\n        a &&\n        ((f = !1), a.length ? (s = a.concat(s)) : (l = -1), s.length && h());\n    }\n    function h() {\n      if (!f) {\n        var t = c(p);\n        f = !0;\n        for (var n = s.length; n; ) {\n          for (a = s, s = []; ++l < n; ) a && a[l].run();\n          (l = -1), (n = s.length);\n        }\n        (a = null),\n          (f = !1),\n          (function (t) {\n            if (e === clearTimeout) return clearTimeout(t);\n            if ((e === u || !e) && clearTimeout)\n              return (e = clearTimeout), clearTimeout(t);\n            try {\n              e(t);\n            } catch (n) {\n              try {\n                return e.call(null, t);\n              } catch (n) {\n                return e.call(this, t);\n              }\n            }\n          })(t);\n      }\n    }\n    function v(t, n) {\n      (this.fun = t), (this.array = n);\n    }\n    function d() {}\n    (o.nextTick = function (t) {\n      var n = new Array(arguments.length - 1);\n      if (arguments.length > 1)\n        for (var r = 1; r < arguments.length; r++) n[r - 1] = arguments[r];\n      s.push(new v(t, n)), 1 !== s.length || f || c(h);\n    }),\n      (v.prototype.run = function () {\n        this.fun.apply(null, this.array);\n      }),\n      (o.title = \"browser\"),\n      (o.browser = !0),\n      (o.env = {}),\n      (o.argv = []),\n      (o.version = \"\"),\n      (o.versions = {}),\n      (o.on = d),\n      (o.addListener = d),\n      (o.once = d),\n      (o.off = d),\n      (o.removeListener = d),\n      (o.removeAllListeners = d),\n      (o.emit = d),\n      (o.prependListener = d),\n      (o.prependOnceListener = d),\n      (o.listeners = function (t) {\n        return [];\n      }),\n      (o.binding = function (t) {\n        throw new Error(\"process.binding is not supported\");\n      }),\n      (o.cwd = function () {\n        return \"/\";\n      }),\n      (o.chdir = function (t) {\n        throw new Error(\"process.chdir is not supported\");\n      }),\n      (o.umask = function () {\n        return 0;\n      });\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return (\n        t.webpackPolyfill ||\n          ((t.deprecate = function () {}),\n          (t.paths = []),\n          t.children || (t.children = []),\n          Object.defineProperty(t, \"loaded\", {\n            enumerable: !0,\n            get: function () {\n              return t.l;\n            },\n          }),\n          Object.defineProperty(t, \"id\", {\n            enumerable: !0,\n            get: function () {\n              return t.i;\n            },\n          }),\n          (t.webpackPolyfill = 1)),\n        t\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(90),\n      o = r(91),\n      i = r(92),\n      u = r(93),\n      c = r(94);\n    function a(t) {\n      var n = -1,\n        r = null == t ? 0 : t.length;\n      for (this.clear(); ++n < r; ) {\n        var e = t[n];\n        this.set(e[0], e[1]);\n      }\n    }\n    (a.prototype.clear = e),\n      (a.prototype.delete = o),\n      (a.prototype.get = i),\n      (a.prototype.has = u),\n      (a.prototype.set = c),\n      (t.exports = a);\n  },\n  function (t, n, r) {\n    var e = r(30);\n    t.exports = function (t, n) {\n      for (var r = t.length; r--; ) if (e(t[r][0], n)) return r;\n      return -1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(8),\n      o = r(5);\n    t.exports = function (t) {\n      if (!o(t)) return !1;\n      var n = e(t);\n      return (\n        \"[object Function]\" == n ||\n        \"[object GeneratorFunction]\" == n ||\n        \"[object AsyncFunction]\" == n ||\n        \"[object Proxy]\" == n\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(4)(Object, \"create\");\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(114);\n    t.exports = function (t, n) {\n      var r = t.__data__;\n      return e(n) ? r[\"string\" == typeof n ? \"string\" : \"hash\"] : r.map;\n    };\n  },\n  function (t, n, r) {\n    var e = r(49),\n      o = r(50);\n    t.exports = function (t, n, r, i) {\n      var u = !r;\n      r || (r = {});\n      for (var c = -1, a = n.length; ++c < a; ) {\n        var s = n[c],\n          f = i ? i(r[s], t[s], s, r, t) : void 0;\n        void 0 === f && (f = t[s]), u ? o(r, s, f) : e(r, s, f);\n      }\n      return r;\n    };\n  },\n  function (t, n, r) {\n    var e = r(120),\n      o = r(3),\n      i = Object.prototype,\n      u = i.hasOwnProperty,\n      c = i.propertyIsEnumerable,\n      a = e(\n        (function () {\n          return arguments;\n        })(),\n      )\n        ? e\n        : function (t) {\n            return o(t) && u.call(t, \"callee\") && !c.call(t, \"callee\");\n          };\n    t.exports = a;\n  },\n  function (t, n, r) {\n    var e = r(122),\n      o = r(35),\n      i = r(36),\n      u = i && i.isTypedArray,\n      c = u ? o(u) : e;\n    t.exports = c;\n  },\n  function (t, n) {\n    var r = Object.prototype;\n    t.exports = function (t) {\n      var n = t && t.constructor;\n      return t === ((\"function\" == typeof n && n.prototype) || r);\n    };\n  },\n  function (t, n, r) {\n    var e = r(65),\n      o = r(150)(e);\n    t.exports = o;\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return t;\n    };\n  },\n  function (t, n, r) {\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(154),\n      i = r(164),\n      u = r(25),\n      c = r(0),\n      a = r(173);\n    t.exports = function (t) {\n      return \"function\" == typeof t\n        ? t\n        : null == t\n          ? u\n          : \"object\" == e(t)\n            ? c(t)\n              ? i(t[0], t[1])\n              : o(t)\n            : a(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(44);\n    t.exports = function (t) {\n      if (\"string\" == typeof t || e(t)) return t;\n      var n = t + \"\";\n      return \"0\" == n && 1 / t == -1 / 0 ? \"-0\" : n;\n    };\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(1);\n    t.exports = i;\n    function i(t) {\n      (this._isDirected = !o.has(t, \"directed\") || t.directed),\n        (this._isMultigraph = !!o.has(t, \"multigraph\") && t.multigraph),\n        (this._isCompound = !!o.has(t, \"compound\") && t.compound),\n        (this._label = void 0),\n        (this._defaultNodeLabelFn = o.constant(void 0)),\n        (this._defaultEdgeLabelFn = o.constant(void 0)),\n        (this._nodes = {}),\n        this._isCompound &&\n          ((this._parent = {}),\n          (this._children = {}),\n          (this._children[\"\\0\"] = {})),\n        (this._in = {}),\n        (this._preds = {}),\n        (this._out = {}),\n        (this._sucs = {}),\n        (this._edgeObjs = {}),\n        (this._edgeLabels = {});\n    }\n    function u(t, n) {\n      t[n] ? t[n]++ : (t[n] = 1);\n    }\n    function c(t, n) {\n      --t[n] || delete t[n];\n    }\n    function a(t, n, r, e) {\n      var i = \"\" + n,\n        u = \"\" + r;\n      if (!t && i > u) {\n        var c = i;\n        (i = u), (u = c);\n      }\n      return i + \"\u0001\" + u + \"\u0001\" + (o.isUndefined(e) ? \"\\0\" : e);\n    }\n    function s(t, n, r, e) {\n      var o = \"\" + n,\n        i = \"\" + r;\n      if (!t && o > i) {\n        var u = o;\n        (o = i), (i = u);\n      }\n      var c = { v: o, w: i };\n      return e && (c.name = e), c;\n    }\n    function f(t, n) {\n      return a(t, n.v, n.w, n.name);\n    }\n    (i.prototype._nodeCount = 0),\n      (i.prototype._edgeCount = 0),\n      (i.prototype.isDirected = function () {\n        return this._isDirected;\n      }),\n      (i.prototype.isMultigraph = function () {\n        return this._isMultigraph;\n      }),\n      (i.prototype.isCompound = function () {\n        return this._isCompound;\n      }),\n      (i.prototype.setGraph = function (t) {\n        return (this._label = t), this;\n      }),\n      (i.prototype.graph = function () {\n        return this._label;\n      }),\n      (i.prototype.setDefaultNodeLabel = function (t) {\n        return (\n          o.isFunction(t) || (t = o.constant(t)),\n          (this._defaultNodeLabelFn = t),\n          this\n        );\n      }),\n      (i.prototype.nodeCount = function () {\n        return this._nodeCount;\n      }),\n      (i.prototype.nodes = function () {\n        return o.keys(this._nodes);\n      }),\n      (i.prototype.sources = function () {\n        var t = this;\n        return o.filter(this.nodes(), function (n) {\n          return o.isEmpty(t._in[n]);\n        });\n      }),\n      (i.prototype.sinks = function () {\n        var t = this;\n        return o.filter(this.nodes(), function (n) {\n          return o.isEmpty(t._out[n]);\n        });\n      }),\n      (i.prototype.setNodes = function (t, n) {\n        var r = arguments,\n          e = this;\n        return (\n          o.each(t, function (t) {\n            r.length > 1 ? e.setNode(t, n) : e.setNode(t);\n          }),\n          this\n        );\n      }),\n      (i.prototype.setNode = function (t, n) {\n        return o.has(this._nodes, t)\n          ? (arguments.length > 1 && (this._nodes[t] = n), this)\n          : ((this._nodes[t] =\n              arguments.length > 1 ? n : this._defaultNodeLabelFn(t)),\n            this._isCompound &&\n              ((this._parent[t] = \"\\0\"),\n              (this._children[t] = {}),\n              (this._children[\"\\0\"][t] = !0)),\n            (this._in[t] = {}),\n            (this._preds[t] = {}),\n            (this._out[t] = {}),\n            (this._sucs[t] = {}),\n            ++this._nodeCount,\n            this);\n      }),\n      (i.prototype.node = function (t) {\n        return this._nodes[t];\n      }),\n      (i.prototype.hasNode = function (t) {\n        return o.has(this._nodes, t);\n      }),\n      (i.prototype.removeNode = function (t) {\n        var n = this;\n        if (o.has(this._nodes, t)) {\n          var r = function (t) {\n            n.removeEdge(n._edgeObjs[t]);\n          };\n          delete this._nodes[t],\n            this._isCompound &&\n              (this._removeFromParentsChildList(t),\n              delete this._parent[t],\n              o.each(this.children(t), function (t) {\n                n.setParent(t);\n              }),\n              delete this._children[t]),\n            o.each(o.keys(this._in[t]), r),\n            delete this._in[t],\n            delete this._preds[t],\n            o.each(o.keys(this._out[t]), r),\n            delete this._out[t],\n            delete this._sucs[t],\n            --this._nodeCount;\n        }\n        return this;\n      }),\n      (i.prototype.setParent = function (t, n) {\n        if (!this._isCompound)\n          throw new Error(\"Cannot set parent in a non-compound graph\");\n        if (o.isUndefined(n)) n = \"\\0\";\n        else {\n          for (var r = (n += \"\"); !o.isUndefined(r); r = this.parent(r))\n            if (r === t)\n              throw new Error(\n                \"Setting \" + n + \" as parent of \" + t + \" would create a cycle\",\n              );\n          this.setNode(n);\n        }\n        return (\n          this.setNode(t),\n          this._removeFromParentsChildList(t),\n          (this._parent[t] = n),\n          (this._children[n][t] = !0),\n          this\n        );\n      }),\n      (i.prototype._removeFromParentsChildList = function (t) {\n        delete this._children[this._parent[t]][t];\n      }),\n      (i.prototype.parent = function (t) {\n        if (this._isCompound) {\n          var n = this._parent[t];\n          if (\"\\0\" !== n) return n;\n        }\n      }),\n      (i.prototype.children = function (t) {\n        if ((o.isUndefined(t) && (t = \"\\0\"), this._isCompound)) {\n          var n = this._children[t];\n          if (n) return o.keys(n);\n        } else {\n          if (\"\\0\" === t) return this.nodes();\n          if (this.hasNode(t)) return [];\n        }\n      }),\n      (i.prototype.predecessors = function (t) {\n        var n = this._preds[t];\n        if (n) return o.keys(n);\n      }),\n      (i.prototype.successors = function (t) {\n        var n = this._sucs[t];\n        if (n) return o.keys(n);\n      }),\n      (i.prototype.neighbors = function (t) {\n        var n = this.predecessors(t);\n        if (n) return o.union(n, this.successors(t));\n      }),\n      (i.prototype.isLeaf = function (t) {\n        return (\n          0 ===\n          (this.isDirected() ? this.successors(t) : this.neighbors(t)).length\n        );\n      }),\n      (i.prototype.filterNodes = function (t) {\n        var n = new this.constructor({\n          directed: this._isDirected,\n          multigraph: this._isMultigraph,\n          compound: this._isCompound,\n        });\n        n.setGraph(this.graph());\n        var r = this;\n        o.each(this._nodes, function (r, e) {\n          t(e) && n.setNode(e, r);\n        }),\n          o.each(this._edgeObjs, function (t) {\n            n.hasNode(t.v) && n.hasNode(t.w) && n.setEdge(t, r.edge(t));\n          });\n        var e = {};\n        return (\n          this._isCompound &&\n            o.each(n.nodes(), function (t) {\n              n.setParent(\n                t,\n                (function t(o) {\n                  var i = r.parent(o);\n                  return void 0 === i || n.hasNode(i)\n                    ? ((e[o] = i), i)\n                    : i in e\n                      ? e[i]\n                      : t(i);\n                })(t),\n              );\n            }),\n          n\n        );\n      }),\n      (i.prototype.setDefaultEdgeLabel = function (t) {\n        return (\n          o.isFunction(t) || (t = o.constant(t)),\n          (this._defaultEdgeLabelFn = t),\n          this\n        );\n      }),\n      (i.prototype.edgeCount = function () {\n        return this._edgeCount;\n      }),\n      (i.prototype.edges = function () {\n        return o.values(this._edgeObjs);\n      }),\n      (i.prototype.setPath = function (t, n) {\n        var r = this,\n          e = arguments;\n        return (\n          o.reduce(t, function (t, o) {\n            return e.length > 1 ? r.setEdge(t, o, n) : r.setEdge(t, o), o;\n          }),\n          this\n        );\n      }),\n      (i.prototype.setEdge = function () {\n        var t,\n          n,\n          r,\n          i,\n          c = !1,\n          f = arguments[0];\n        \"object\" === e(f) && null !== f && \"v\" in f\n          ? ((t = f.v),\n            (n = f.w),\n            (r = f.name),\n            2 === arguments.length && ((i = arguments[1]), (c = !0)))\n          : ((t = f),\n            (n = arguments[1]),\n            (r = arguments[3]),\n            arguments.length > 2 && ((i = arguments[2]), (c = !0))),\n          (t = \"\" + t),\n          (n = \"\" + n),\n          o.isUndefined(r) || (r = \"\" + r);\n        var l = a(this._isDirected, t, n, r);\n        if (o.has(this._edgeLabels, l))\n          return c && (this._edgeLabels[l] = i), this;\n        if (!o.isUndefined(r) && !this._isMultigraph)\n          throw new Error(\"Cannot set a named edge when isMultigraph = false\");\n        this.setNode(t),\n          this.setNode(n),\n          (this._edgeLabels[l] = c ? i : this._defaultEdgeLabelFn(t, n, r));\n        var p = s(this._isDirected, t, n, r);\n        return (\n          (t = p.v),\n          (n = p.w),\n          Object.freeze(p),\n          (this._edgeObjs[l] = p),\n          u(this._preds[n], t),\n          u(this._sucs[t], n),\n          (this._in[n][l] = p),\n          (this._out[t][l] = p),\n          this._edgeCount++,\n          this\n        );\n      }),\n      (i.prototype.edge = function (t, n, r) {\n        var e =\n          1 === arguments.length\n            ? f(this._isDirected, arguments[0])\n            : a(this._isDirected, t, n, r);\n        return this._edgeLabels[e];\n      }),\n      (i.prototype.hasEdge = function (t, n, r) {\n        var e =\n          1 === arguments.length\n            ? f(this._isDirected, arguments[0])\n            : a(this._isDirected, t, n, r);\n        return o.has(this._edgeLabels, e);\n      }),\n      (i.prototype.removeEdge = function (t, n, r) {\n        var e =\n            1 === arguments.length\n              ? f(this._isDirected, arguments[0])\n              : a(this._isDirected, t, n, r),\n          o = this._edgeObjs[e];\n        return (\n          o &&\n            ((t = o.v),\n            (n = o.w),\n            delete this._edgeLabels[e],\n            delete this._edgeObjs[e],\n            c(this._preds[n], t),\n            c(this._sucs[t], n),\n            delete this._in[n][e],\n            delete this._out[t][e],\n            this._edgeCount--),\n          this\n        );\n      }),\n      (i.prototype.inEdges = function (t, n) {\n        var r = this._in[t];\n        if (r) {\n          var e = o.values(r);\n          return n\n            ? o.filter(e, function (t) {\n                return t.v === n;\n              })\n            : e;\n        }\n      }),\n      (i.prototype.outEdges = function (t, n) {\n        var r = this._out[t];\n        if (r) {\n          var e = o.values(r);\n          return n\n            ? o.filter(e, function (t) {\n                return t.w === n;\n              })\n            : e;\n        }\n      }),\n      (i.prototype.nodeEdges = function (t, n) {\n        var r = this.inEdges(t, n);\n        if (r) return r.concat(this.outEdges(t, n));\n      });\n  },\n  function (t, n, r) {\n    var e = r(15),\n      o = r(95),\n      i = r(96),\n      u = r(97),\n      c = r(98),\n      a = r(99);\n    function s(t) {\n      var n = (this.__data__ = new e(t));\n      this.size = n.size;\n    }\n    (s.prototype.clear = o),\n      (s.prototype.delete = i),\n      (s.prototype.get = u),\n      (s.prototype.has = c),\n      (s.prototype.set = a),\n      (t.exports = s);\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return t === n || (t != t && n != n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(4)(r(2), \"Map\");\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(106),\n      o = r(113),\n      i = r(115),\n      u = r(116),\n      c = r(117);\n    function a(t) {\n      var n = -1,\n        r = null == t ? 0 : t.length;\n      for (this.clear(); ++n < r; ) {\n        var e = t[n];\n        this.set(e[0], e[1]);\n      }\n    }\n    (a.prototype.clear = e),\n      (a.prototype.delete = o),\n      (a.prototype.get = i),\n      (a.prototype.has = u),\n      (a.prototype.set = c),\n      (t.exports = a);\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (\n        var r = -1, e = null == t ? 0 : t.length;\n        ++r < e && !1 !== n(t[r], r, t);\n\n      );\n      return t;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return (\n        \"number\" == typeof t && t > -1 && t % 1 == 0 && t <= 9007199254740991\n      );\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return function (n) {\n        return t(n);\n      };\n    };\n  },\n  function (t, n, r) {\n    (function (t) {\n      function e(t) {\n        return (e =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      var o = r(47),\n        i = \"object\" == e(n) && n && !n.nodeType && n,\n        u = i && \"object\" == e(t) && t && !t.nodeType && t,\n        c = u && u.exports === i && o.process,\n        a = (function () {\n          try {\n            var t = u && u.require && u.require(\"util\").types;\n            return t || (c && c.binding && c.binding(\"util\"));\n          } catch (t) {}\n        })();\n      t.exports = a;\n    }).call(this, r(14)(t));\n  },\n  function (t, n, r) {\n    var e = r(23),\n      o = r(123),\n      i = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      if (!e(t)) return o(t);\n      var n = [];\n      for (var r in Object(t)) i.call(t, r) && \"constructor\" != r && n.push(r);\n      return n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(56),\n      o = r(57),\n      i = Object.prototype.propertyIsEnumerable,\n      u = Object.getOwnPropertySymbols,\n      c = u\n        ? function (t) {\n            return null == t\n              ? []\n              : ((t = Object(t)),\n                e(u(t), function (n) {\n                  return i.call(t, n);\n                }));\n          }\n        : o;\n    t.exports = c;\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (var r = -1, e = n.length, o = t.length; ++r < e; ) t[o + r] = n[r];\n      return t;\n    };\n  },\n  function (t, n, r) {\n    var e = r(54)(Object.getPrototypeOf, Object);\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(62);\n    t.exports = function (t) {\n      var n = new t.constructor(t.byteLength);\n      return new e(n).set(new e(t)), n;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      var n = -1,\n        r = Array(t.size);\n      return (\n        t.forEach(function (t) {\n          r[++n] = t;\n        }),\n        r\n      );\n    };\n  },\n  function (t, n, r) {\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(0),\n      i = r(44),\n      u = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      c = /^\\w*$/;\n    t.exports = function (t, n) {\n      if (o(t)) return !1;\n      var r = e(t);\n      return (\n        !(\n          \"number\" != r &&\n          \"symbol\" != r &&\n          \"boolean\" != r &&\n          null != t &&\n          !i(t)\n        ) ||\n        c.test(t) ||\n        !u.test(t) ||\n        (null != n && t in Object(n))\n      );\n    };\n  },\n  function (t, n, r) {\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(8),\n      i = r(3);\n    t.exports = function (t) {\n      return \"symbol\" == e(t) || (i(t) && \"[object Symbol]\" == o(t));\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (var r = -1, e = null == t ? 0 : t.length, o = Array(e); ++r < e; )\n        o[r] = n(t[r], r, t);\n      return o;\n    };\n  },\n  function (t, n) {\n    (function (n) {\n      t.exports = n;\n    }).call(this, {});\n  },\n  function (t, n, r) {\n    (function (n) {\n      function r(t) {\n        return (r =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      var e =\n        \"object\" == (void 0 === n ? \"undefined\" : r(n)) &&\n        n &&\n        n.Object === Object &&\n        n;\n      t.exports = e;\n    }).call(this, r(11));\n  },\n  function (t, n) {\n    var r = Function.prototype.toString;\n    t.exports = function (t) {\n      if (null != t) {\n        try {\n          return r.call(t);\n        } catch (t) {}\n        try {\n          return t + \"\";\n        } catch (t) {}\n      }\n      return \"\";\n    };\n  },\n  function (t, n, r) {\n    var e = r(50),\n      o = r(30),\n      i = Object.prototype.hasOwnProperty;\n    t.exports = function (t, n, r) {\n      var u = t[n];\n      (i.call(t, n) && o(u, r) && (void 0 !== r || n in t)) || e(t, n, r);\n    };\n  },\n  function (t, n, r) {\n    var e = r(51);\n    t.exports = function (t, n, r) {\n      \"__proto__\" == n && e\n        ? e(t, n, { configurable: !0, enumerable: !0, value: r, writable: !0 })\n        : (t[n] = r);\n    };\n  },\n  function (t, n, r) {\n    var e = r(4),\n      o = (function () {\n        try {\n          var t = e(Object, \"defineProperty\");\n          return t({}, \"\", {}), t;\n        } catch (t) {}\n      })();\n    t.exports = o;\n  },\n  function (t, n, r) {\n    var e = r(119),\n      o = r(21),\n      i = r(0),\n      u = r(12),\n      c = r(53),\n      a = r(22),\n      s = Object.prototype.hasOwnProperty;\n    t.exports = function (t, n) {\n      var r = i(t),\n        f = !r && o(t),\n        l = !r && !f && u(t),\n        p = !r && !f && !l && a(t),\n        h = r || f || l || p,\n        v = h ? e(t.length, String) : [],\n        d = v.length;\n      for (var y in t)\n        (!n && !s.call(t, y)) ||\n          (h &&\n            (\"length\" == y ||\n              (l && (\"offset\" == y || \"parent\" == y)) ||\n              (p &&\n                (\"buffer\" == y || \"byteLength\" == y || \"byteOffset\" == y)) ||\n              c(y, d))) ||\n          v.push(y);\n      return v;\n    };\n  },\n  function (t, n) {\n    function r(t) {\n      return (r =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var e = /^(?:0|[1-9]\\d*)$/;\n    t.exports = function (t, n) {\n      var o = r(t);\n      return (\n        !!(n = null == n ? 9007199254740991 : n) &&\n        (\"number\" == o || (\"symbol\" != o && e.test(t))) &&\n        t > -1 &&\n        t % 1 == 0 &&\n        t < n\n      );\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return function (r) {\n        return t(n(r));\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(52),\n      o = r(125),\n      i = r(7);\n    t.exports = function (t) {\n      return i(t) ? e(t, !0) : o(t);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (var r = -1, e = null == t ? 0 : t.length, o = 0, i = []; ++r < e; ) {\n        var u = t[r];\n        n(u, r, t) && (i[o++] = u);\n      }\n      return i;\n    };\n  },\n  function (t, n) {\n    t.exports = function () {\n      return [];\n    };\n  },\n  function (t, n, r) {\n    var e = r(39),\n      o = r(40),\n      i = r(38),\n      u = r(57),\n      c = Object.getOwnPropertySymbols\n        ? function (t) {\n            for (var n = []; t; ) e(n, i(t)), (t = o(t));\n            return n;\n          }\n        : u;\n    t.exports = c;\n  },\n  function (t, n, r) {\n    var e = r(60),\n      o = r(38),\n      i = r(6);\n    t.exports = function (t) {\n      return e(t, i, o);\n    };\n  },\n  function (t, n, r) {\n    var e = r(39),\n      o = r(0);\n    t.exports = function (t, n, r) {\n      var i = n(t);\n      return o(t) ? i : e(i, r(t));\n    };\n  },\n  function (t, n, r) {\n    var e = r(4)(r(2), \"Set\");\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(2).Uint8Array;\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(5),\n      o = Object.create,\n      i = (function () {\n        function t() {}\n        return function (n) {\n          if (!e(n)) return {};\n          if (o) return o(n);\n          t.prototype = n;\n          var r = new t();\n          return (t.prototype = void 0), r;\n        };\n      })();\n    t.exports = i;\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return function () {\n        return t;\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(148),\n      o = r(6);\n    t.exports = function (t, n) {\n      return t && e(t, n, o);\n    };\n  },\n  function (t, n, r) {\n    var e = r(156),\n      o = r(3);\n    t.exports = function t(n, r, i, u, c) {\n      return (\n        n === r ||\n        (null == n || null == r || (!o(n) && !o(r))\n          ? n != n && r != r\n          : e(n, r, i, u, t, c))\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(68),\n      o = r(159),\n      i = r(69);\n    t.exports = function (t, n, r, u, c, a) {\n      var s = 1 & r,\n        f = t.length,\n        l = n.length;\n      if (f != l && !(s && l > f)) return !1;\n      var p = a.get(t);\n      if (p && a.get(n)) return p == n;\n      var h = -1,\n        v = !0,\n        d = 2 & r ? new e() : void 0;\n      for (a.set(t, n), a.set(n, t); ++h < f; ) {\n        var y = t[h],\n          _ = n[h];\n        if (u) var g = s ? u(_, y, h, n, t, a) : u(y, _, h, t, n, a);\n        if (void 0 !== g) {\n          if (g) continue;\n          v = !1;\n          break;\n        }\n        if (d) {\n          if (\n            !o(n, function (t, n) {\n              if (!i(d, n) && (y === t || c(y, t, r, u, a))) return d.push(n);\n            })\n          ) {\n            v = !1;\n            break;\n          }\n        } else if (y !== _ && !c(y, _, r, u, a)) {\n          v = !1;\n          break;\n        }\n      }\n      return a.delete(t), a.delete(n), v;\n    };\n  },\n  function (t, n, r) {\n    var e = r(32),\n      o = r(157),\n      i = r(158);\n    function u(t) {\n      var n = -1,\n        r = null == t ? 0 : t.length;\n      for (this.__data__ = new e(); ++n < r; ) this.add(t[n]);\n    }\n    (u.prototype.add = u.prototype.push = o),\n      (u.prototype.has = i),\n      (t.exports = u);\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return t.has(n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(5);\n    t.exports = function (t) {\n      return t == t && !e(t);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return function (r) {\n        return null != r && r[t] === n && (void 0 !== n || t in Object(r));\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(73),\n      o = r(27);\n    t.exports = function (t, n) {\n      for (var r = 0, i = (n = e(n, t)).length; null != t && r < i; )\n        t = t[o(n[r++])];\n      return r && r == i ? t : void 0;\n    };\n  },\n  function (t, n, r) {\n    var e = r(0),\n      o = r(43),\n      i = r(166),\n      u = r(169);\n    t.exports = function (t, n) {\n      return e(t) ? t : o(t, n) ? [t] : i(u(t));\n    };\n  },\n  function (t, n, r) {\n    var e = r(73),\n      o = r(21),\n      i = r(0),\n      u = r(53),\n      c = r(34),\n      a = r(27);\n    t.exports = function (t, n, r) {\n      for (var s = -1, f = (n = e(n, t)).length, l = !1; ++s < f; ) {\n        var p = a(n[s]);\n        if (!(l = null != t && r(t, p))) break;\n        t = t[p];\n      }\n      return l || ++s != f\n        ? l\n        : !!(f = null == t ? 0 : t.length) && c(f) && u(p, f) && (i(t) || o(t));\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return function (n) {\n        return null == n ? void 0 : n[t];\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(1),\n      o = r(77);\n    t.exports = function (t, n, r, e) {\n      return (function (t, n, r, e) {\n        var i,\n          u,\n          c = {},\n          a = new o(),\n          s = function (t) {\n            var n = t.v !== i ? t.v : t.w,\n              e = c[n],\n              o = r(t),\n              s = u.distance + o;\n            if (o < 0)\n              throw new Error(\n                \"dijkstra does not allow negative edge weights. Bad edge: \" +\n                  t +\n                  \" Weight: \" +\n                  o,\n              );\n            s < e.distance &&\n              ((e.distance = s), (e.predecessor = i), a.decrease(n, s));\n          };\n        t.nodes().forEach(function (t) {\n          var r = t === n ? 0 : Number.POSITIVE_INFINITY;\n          (c[t] = { distance: r }), a.add(t, r);\n        });\n        for (\n          ;\n          a.size() > 0 &&\n          ((i = a.removeMin()),\n          (u = c[i]).distance !== Number.POSITIVE_INFINITY);\n\n        )\n          e(i).forEach(s);\n        return c;\n      })(\n        t,\n        String(n),\n        r || i,\n        e ||\n          function (n) {\n            return t.outEdges(n);\n          },\n      );\n    };\n    var i = e.constant(1);\n  },\n  function (t, n, r) {\n    var e = r(1);\n    function o() {\n      (this._arr = []), (this._keyIndices = {});\n    }\n    (t.exports = o),\n      (o.prototype.size = function () {\n        return this._arr.length;\n      }),\n      (o.prototype.keys = function () {\n        return this._arr.map(function (t) {\n          return t.key;\n        });\n      }),\n      (o.prototype.has = function (t) {\n        return e.has(this._keyIndices, t);\n      }),\n      (o.prototype.priority = function (t) {\n        var n = this._keyIndices[t];\n        if (void 0 !== n) return this._arr[n].priority;\n      }),\n      (o.prototype.min = function () {\n        if (0 === this.size()) throw new Error(\"Queue underflow\");\n        return this._arr[0].key;\n      }),\n      (o.prototype.add = function (t, n) {\n        var r = this._keyIndices;\n        if (((t = String(t)), !e.has(r, t))) {\n          var o = this._arr,\n            i = o.length;\n          return (\n            (r[t] = i), o.push({ key: t, priority: n }), this._decrease(i), !0\n          );\n        }\n        return !1;\n      }),\n      (o.prototype.removeMin = function () {\n        this._swap(0, this._arr.length - 1);\n        var t = this._arr.pop();\n        return delete this._keyIndices[t.key], this._heapify(0), t.key;\n      }),\n      (o.prototype.decrease = function (t, n) {\n        var r = this._keyIndices[t];\n        if (n > this._arr[r].priority)\n          throw new Error(\n            \"New priority is greater than current priority. Key: \" +\n              t +\n              \" Old: \" +\n              this._arr[r].priority +\n              \" New: \" +\n              n,\n          );\n        (this._arr[r].priority = n), this._decrease(r);\n      }),\n      (o.prototype._heapify = function (t) {\n        var n = this._arr,\n          r = 2 * t,\n          e = r + 1,\n          o = t;\n        r < n.length &&\n          ((o = n[r].priority < n[o].priority ? r : o),\n          e < n.length && (o = n[e].priority < n[o].priority ? e : o),\n          o !== t && (this._swap(t, o), this._heapify(o)));\n      }),\n      (o.prototype._decrease = function (t) {\n        for (\n          var n, r = this._arr, e = r[t].priority;\n          0 !== t && !(r[(n = t >> 1)].priority < e);\n\n        )\n          this._swap(t, n), (t = n);\n      }),\n      (o.prototype._swap = function (t, n) {\n        var r = this._arr,\n          e = this._keyIndices,\n          o = r[t],\n          i = r[n];\n        (r[t] = i), (r[n] = o), (e[i.key] = t), (e[o.key] = n);\n      });\n  },\n  function (t, n, r) {\n    var e = r(1);\n    t.exports = function (t) {\n      var n = 0,\n        r = [],\n        o = {},\n        i = [];\n      return (\n        t.nodes().forEach(function (u) {\n          e.has(o, u) ||\n            (function u(c) {\n              var a = (o[c] = { onStack: !0, lowlink: n, index: n++ });\n              if (\n                (r.push(c),\n                t.successors(c).forEach(function (t) {\n                  e.has(o, t)\n                    ? o[t].onStack &&\n                      (a.lowlink = Math.min(a.lowlink, o[t].index))\n                    : (u(t), (a.lowlink = Math.min(a.lowlink, o[t].lowlink)));\n                }),\n                a.lowlink === a.index)\n              ) {\n                var s,\n                  f = [];\n                do {\n                  (s = r.pop()), (o[s].onStack = !1), f.push(s);\n                } while (c !== s);\n                i.push(f);\n              }\n            })(u);\n        }),\n        i\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(1);\n    function o(t) {\n      var n = {},\n        r = {},\n        o = [];\n      if (\n        (e.each(t.sinks(), function u(c) {\n          if (e.has(r, c)) throw new i();\n          e.has(n, c) ||\n            ((r[c] = !0),\n            (n[c] = !0),\n            e.each(t.predecessors(c), u),\n            delete r[c],\n            o.push(c));\n        }),\n        e.size(n) !== t.nodeCount())\n      )\n        throw new i();\n      return o;\n    }\n    function i() {}\n    (t.exports = o), (o.CycleException = i), (i.prototype = new Error());\n  },\n  function (t, n, r) {\n    var e = r(1);\n    t.exports = function (t, n, r) {\n      e.isArray(n) || (n = [n]);\n      var o = (t.isDirected() ? t.successors : t.neighbors).bind(t),\n        i = [],\n        u = {};\n      return (\n        e.each(n, function (n) {\n          if (!t.hasNode(n)) throw new Error(\"Graph does not have node: \" + n);\n          !(function t(n, r, o, i, u, c) {\n            e.has(i, r) ||\n              ((i[r] = !0),\n              o || c.push(r),\n              e.each(u(r), function (r) {\n                t(n, r, o, i, u, c);\n              }),\n              o && c.push(r));\n          })(t, n, \"post\" === r, u, o, i);\n        }),\n        i\n      );\n    };\n  },\n  function (t, n, r) {\n    \"use strict\";\n    (function (n) {\n      var e = r(226),\n        o = [\"delete\", \"get\", \"head\", \"patch\", \"post\", \"put\"];\n      t.exports.load = function (t, r, i) {\n        var u,\n          c,\n          a = r.method ? r.method.toLowerCase() : \"get\";\n        function s(t, r) {\n          t\n            ? i(t)\n            : (\"[object process]\" ===\n                Object.prototype.toString.call(void 0 !== n ? n : 0) &&\n                \"function\" == typeof r.buffer &&\n                r.buffer(!0),\n              r.end(function (t, n) {\n                t ? i(t) : i(void 0, n);\n              }));\n        }\n        if (\n          (void 0 !== r.method\n            ? \"string\" != typeof r.method\n              ? (u = new TypeError(\"options.method must be a string\"))\n              : -1 === o.indexOf(r.method) &&\n                (u = new TypeError(\n                  \"options.method must be one of the following: \" +\n                    o.slice(0, o.length - 1).join(\", \") +\n                    \" or \" +\n                    o[o.length - 1],\n                ))\n            : void 0 !== r.prepareRequest &&\n              \"function\" != typeof r.prepareRequest &&\n              (u = new TypeError(\"options.prepareRequest must be a function\")),\n          u)\n        )\n          i(u);\n        else if (((c = e[\"delete\" === a ? \"del\" : a](t)), r.prepareRequest))\n          try {\n            r.prepareRequest(c, s);\n          } catch (t) {\n            i(t);\n          }\n        else s(void 0, c);\n      };\n    }).call(this, r(13));\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    t.exports = function (t) {\n      return null !== t && \"object\" === e(t);\n    };\n  },\n  function (t, n, r) {\n    (function (e, o) {\n      var i, u, c, a;\n      function s(t) {\n        return (s =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      /*! Native Promise Only\n    v0.8.1 (c) Kyle Simpson\n    MIT License: http://getify.mit-license.org\n*/ (a = function () {\n        \"use strict\";\n        var t,\n          n,\n          r,\n          e = Object.prototype.toString,\n          i =\n            void 0 !== o\n              ? function (t) {\n                  return o(t);\n                }\n              : setTimeout;\n        try {\n          Object.defineProperty({}, \"x\", {}),\n            (t = function (t, n, r, e) {\n              return Object.defineProperty(t, n, {\n                value: r,\n                writable: !0,\n                configurable: !1 !== e,\n              });\n            });\n        } catch (n) {\n          t = function (t, n, r) {\n            return (t[n] = r), t;\n          };\n        }\n        function u(t, e) {\n          r.add(t, e), n || (n = i(r.drain));\n        }\n        function c(t) {\n          var n,\n            r = s(t);\n          return (\n            null == t || (\"object\" != r && \"function\" != r) || (n = t.then),\n            \"function\" == typeof n && n\n          );\n        }\n        function a() {\n          for (var t = 0; t < this.chain.length; t++)\n            f(\n              this,\n              1 === this.state ? this.chain[t].success : this.chain[t].failure,\n              this.chain[t],\n            );\n          this.chain.length = 0;\n        }\n        function f(t, n, r) {\n          var e, o;\n          try {\n            !1 === n\n              ? r.reject(t.msg)\n              : (e = !0 === n ? t.msg : n.call(void 0, t.msg)) === r.promise\n                ? r.reject(TypeError(\"Promise-chain cycle\"))\n                : (o = c(e))\n                  ? o.call(e, r.resolve, r.reject)\n                  : r.resolve(e);\n          } catch (t) {\n            r.reject(t);\n          }\n        }\n        function l(t) {\n          var n,\n            r = this;\n          if (!r.triggered) {\n            (r.triggered = !0), r.def && (r = r.def);\n            try {\n              (n = c(t))\n                ? u(function () {\n                    var e = new v(r);\n                    try {\n                      n.call(\n                        t,\n                        function () {\n                          l.apply(e, arguments);\n                        },\n                        function () {\n                          p.apply(e, arguments);\n                        },\n                      );\n                    } catch (t) {\n                      p.call(e, t);\n                    }\n                  })\n                : ((r.msg = t), (r.state = 1), r.chain.length > 0 && u(a, r));\n            } catch (t) {\n              p.call(new v(r), t);\n            }\n          }\n        }\n        function p(t) {\n          var n = this;\n          n.triggered ||\n            ((n.triggered = !0),\n            n.def && (n = n.def),\n            (n.msg = t),\n            (n.state = 2),\n            n.chain.length > 0 && u(a, n));\n        }\n        function h(t, n, r, e) {\n          for (var o = 0; o < n.length; o++)\n            !(function (o) {\n              t.resolve(n[o]).then(function (t) {\n                r(o, t);\n              }, e);\n            })(o);\n        }\n        function v(t) {\n          (this.def = t), (this.triggered = !1);\n        }\n        function d(t) {\n          (this.promise = t),\n            (this.state = 0),\n            (this.triggered = !1),\n            (this.chain = []),\n            (this.msg = void 0);\n        }\n        function y(t) {\n          if (\"function\" != typeof t) throw TypeError(\"Not a function\");\n          if (0 !== this.__NPO__) throw TypeError(\"Not a promise\");\n          this.__NPO__ = 1;\n          var n = new d(this);\n          (this.then = function (t, r) {\n            var e = {\n              success: \"function\" != typeof t || t,\n              failure: \"function\" == typeof r && r,\n            };\n            return (\n              (e.promise = new this.constructor(function (t, n) {\n                if (\"function\" != typeof t || \"function\" != typeof n)\n                  throw TypeError(\"Not a function\");\n                (e.resolve = t), (e.reject = n);\n              })),\n              n.chain.push(e),\n              0 !== n.state && u(a, n),\n              e.promise\n            );\n          }),\n            (this.catch = function (t) {\n              return this.then(void 0, t);\n            });\n          try {\n            t.call(\n              void 0,\n              function (t) {\n                l.call(n, t);\n              },\n              function (t) {\n                p.call(n, t);\n              },\n            );\n          } catch (t) {\n            p.call(n, t);\n          }\n        }\n        r = (function () {\n          var t, r, e;\n          function o(t, n) {\n            (this.fn = t), (this.self = n), (this.next = void 0);\n          }\n          return {\n            add: function (n, i) {\n              (e = new o(n, i)),\n                r ? (r.next = e) : (t = e),\n                (r = e),\n                (e = void 0);\n            },\n            drain: function () {\n              var e = t;\n              for (t = r = n = void 0; e; ) e.fn.call(e.self), (e = e.next);\n            },\n          };\n        })();\n        var _ = t({}, \"constructor\", y, !1);\n        return (\n          (y.prototype = _),\n          t(_, \"__NPO__\", 0, !1),\n          t(y, \"resolve\", function (t) {\n            return t && \"object\" == s(t) && 1 === t.__NPO__\n              ? t\n              : new this(function (n, r) {\n                  if (\"function\" != typeof n || \"function\" != typeof r)\n                    throw TypeError(\"Not a function\");\n                  n(t);\n                });\n          }),\n          t(y, \"reject\", function (t) {\n            return new this(function (n, r) {\n              if (\"function\" != typeof n || \"function\" != typeof r)\n                throw TypeError(\"Not a function\");\n              r(t);\n            });\n          }),\n          t(y, \"all\", function (t) {\n            var n = this;\n            return \"[object Array]\" != e.call(t)\n              ? n.reject(TypeError(\"Not an array\"))\n              : 0 === t.length\n                ? n.resolve([])\n                : new n(function (r, e) {\n                    if (\"function\" != typeof r || \"function\" != typeof e)\n                      throw TypeError(\"Not a function\");\n                    var o = t.length,\n                      i = Array(o),\n                      u = 0;\n                    h(\n                      n,\n                      t,\n                      function (t, n) {\n                        (i[t] = n), ++u === o && r(i);\n                      },\n                      e,\n                    );\n                  });\n          }),\n          t(y, \"race\", function (t) {\n            var n = this;\n            return \"[object Array]\" != e.call(t)\n              ? n.reject(TypeError(\"Not an array\"))\n              : new n(function (r, e) {\n                  if (\"function\" != typeof r || \"function\" != typeof e)\n                    throw TypeError(\"Not a function\");\n                  h(\n                    n,\n                    t,\n                    function (t, n) {\n                      r(n);\n                    },\n                    e,\n                  );\n                });\n          }),\n          y\n        );\n      }),\n        ((c = void 0 !== e ? e : this)[(u = \"Promise\")] = c[u] || a()),\n        t.exports\n          ? (t.exports = c[u])\n          : void 0 ===\n              (i = function () {\n                return c[u];\n              }.call(n, r, n, t)) || (t.exports = i);\n    }).call(this, r(11), r(232).setImmediate);\n  },\n  function (t, n, r) {\n    \"use strict\";\n    (function (n) {\n      var e = r(85),\n        o = r(86),\n        i = r(223),\n        u = r(224),\n        c = r(234),\n        a = r(237),\n        s = r(238),\n        f = /~(?:[^01]|$)/g,\n        l = {},\n        p = [\"relative\", \"remote\"],\n        h = [\"absolute\", \"uri\"],\n        v = {};\n      function d(t, n) {\n        e.isString(t) && (t = a(t)), e.isString(n) && (n = a(n));\n        var r,\n          o,\n          u = S(e.isUndefined(n) ? \"\" : n);\n        return (\n          h.indexOf(u.reference) > -1\n            ? (o = u)\n            : ((r = e.isUndefined(t) ? void 0 : S(t)),\n              e.isUndefined(r)\n                ? (o = u)\n                : (((o = r).path = a(i.join(r.path, u.path))),\n                  (o.query = (function (t, n) {\n                    var r = {};\n                    function o(t) {\n                      e.forOwn(t, function (t, n) {\n                        r[n] = t;\n                      });\n                    }\n                    return (\n                      o(c.parse(t || \"\")),\n                      o(c.parse(n || \"\")),\n                      0 === Object.keys(r).length ? void 0 : c.stringify(r)\n                    );\n                  })(r.query, u.query)))),\n          (o.fragment = void 0),\n          (-1 === h.indexOf(o.reference) && 0 === o.path.indexOf(\"../\")\n            ? \"../\"\n            : \"\") + s.serialize(o)\n        );\n      }\n      function y(t) {\n        return p.indexOf(m(t)) > -1;\n      }\n      function _(t) {\n        return e.isUndefined(t.error) && \"invalid\" !== t.type;\n      }\n      function g(t, n) {\n        var r = t;\n        return (\n          n.forEach(function (t) {\n            if (!(t in r))\n              throw Error(\"JSON Pointer points to missing location: \" + D(n));\n            r = r[t];\n          }),\n          r\n        );\n      }\n      function b(t) {\n        return Object.keys(t).filter(function (t) {\n          return \"$ref\" !== t;\n        });\n      }\n      function m(t) {\n        var n;\n        switch (t.uriDetails.reference) {\n          case \"absolute\":\n          case \"uri\":\n            n = \"remote\";\n            break;\n          case \"same-document\":\n            n = \"local\";\n            break;\n          default:\n            n = t.uriDetails.reference;\n        }\n        return n;\n      }\n      function w(t, n) {\n        var r = l[t],\n          o = Promise.resolve(),\n          i = e.cloneDeep(n.loaderOptions || {});\n        return (\n          e.isUndefined(r)\n            ? (e.isUndefined(i.processContent) &&\n                (i.processContent = function (t, n) {\n                  n(void 0, JSON.parse(t.text));\n                }),\n              (o = (o = u.load(decodeURI(t), i))\n                .then(function (n) {\n                  return (l[t] = { value: n }), n;\n                })\n                .catch(function (n) {\n                  throw ((l[t] = { error: n }), n);\n                })))\n            : (o = o.then(function () {\n                if (e.isError(r.error)) throw r.error;\n                return r.value;\n              })),\n          (o = o.then(function (t) {\n            return e.cloneDeep(t);\n          }))\n        );\n      }\n      function x(t, n) {\n        var r = !0;\n        try {\n          if (!e.isPlainObject(t)) throw new Error(\"obj is not an Object\");\n          if (!e.isString(t.$ref)) throw new Error(\"obj.$ref is not a String\");\n        } catch (t) {\n          if (n) throw t;\n          r = !1;\n        }\n        return r;\n      }\n      function j(t) {\n        return -1 !== t.indexOf(\"://\") || i.isAbsolute(t)\n          ? t\n          : i.resolve(n.cwd(), t);\n      }\n      function E(t, n) {\n        (t.error = n.message), (t.missing = !0);\n      }\n      function S(t) {\n        return s.parse(t);\n      }\n      function O(t, n, r) {\n        g(t, n.slice(0, n.length - 1))[n[n.length - 1]] = r;\n      }\n      function A(t, n) {\n        var r, o;\n        if (((t = e.isUndefined(t) ? {} : e.cloneDeep(t)), !e.isObject(t)))\n          throw new TypeError(\"options must be an Object\");\n        if (\n          !e.isUndefined(t.resolveCirculars) &&\n          !e.isBoolean(t.resolveCirculars)\n        )\n          throw new TypeError(\"options.resolveCirculars must be a Boolean\");\n        if (\n          !(\n            e.isUndefined(t.filter) ||\n            e.isArray(t.filter) ||\n            e.isFunction(t.filter) ||\n            e.isString(t.filter)\n          )\n        )\n          throw new TypeError(\n            \"options.filter must be an Array, a Function of a String\",\n          );\n        if (!e.isUndefined(t.includeInvalid) && !e.isBoolean(t.includeInvalid))\n          throw new TypeError(\"options.includeInvalid must be a Boolean\");\n        if (!e.isUndefined(t.location) && !e.isString(t.location))\n          throw new TypeError(\"options.location must be a String\");\n        if (\n          !e.isUndefined(t.refPreProcessor) &&\n          !e.isFunction(t.refPreProcessor)\n        )\n          throw new TypeError(\"options.refPreProcessor must be a Function\");\n        if (\n          !e.isUndefined(t.refPostProcessor) &&\n          !e.isFunction(t.refPostProcessor)\n        )\n          throw new TypeError(\"options.refPostProcessor must be a Function\");\n        if (\n          !e.isUndefined(t.subDocPath) &&\n          !e.isArray(t.subDocPath) &&\n          !k(t.subDocPath)\n        )\n          throw new TypeError(\n            \"options.subDocPath must be an Array of path segments or a valid JSON Pointer\",\n          );\n        if (\n          (e.isUndefined(t.resolveCirculars) && (t.resolveCirculars = !1),\n          (t.filter = (function (t) {\n            var n, r;\n            return (\n              e.isArray(t.filter) || e.isString(t.filter)\n                ? ((r = e.isString(t.filter) ? [t.filter] : t.filter),\n                  (n = function (t) {\n                    return r.indexOf(t.type) > -1 || r.indexOf(m(t)) > -1;\n                  }))\n                : e.isFunction(t.filter)\n                  ? (n = t.filter)\n                  : e.isUndefined(t.filter) &&\n                    (n = function () {\n                      return !0;\n                    }),\n              function (r, e) {\n                return (\n                  (\"invalid\" !== r.type || !0 === t.includeInvalid) && n(r, e)\n                );\n              }\n            );\n          })(t)),\n          e.isUndefined(t.location) && (t.location = j(\"./root.json\")),\n          (r = t.location.split(\"#\")).length > 1 && (t.subDocPath = \"#\" + r[1]),\n          (o = decodeURI(t.location) === t.location),\n          (t.location = d(t.location, void 0)),\n          o && (t.location = decodeURI(t.location)),\n          (t.subDocPath = (function (t) {\n            var n;\n            return (\n              e.isArray(t.subDocPath)\n                ? (n = t.subDocPath)\n                : e.isString(t.subDocPath)\n                  ? (n = R(t.subDocPath))\n                  : e.isUndefined(t.subDocPath) && (n = []),\n              n\n            );\n          })(t)),\n          !e.isUndefined(n))\n        )\n          try {\n            g(n, t.subDocPath);\n          } catch (t) {\n            throw (\n              ((t.message = t.message.replace(\n                \"JSON Pointer\",\n                \"options.subDocPath\",\n              )),\n              t)\n            );\n          }\n        return t;\n      }\n      function T(t) {\n        if (!e.isArray(t)) throw new TypeError(\"path must be an array\");\n        return t.map(function (t) {\n          return (\n            e.isString(t) || (t = JSON.stringify(t)),\n            t.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n          );\n        });\n      }\n      function C(t) {\n        if (!e.isArray(t)) throw new TypeError(\"path must be an array\");\n        return t.map(function (t) {\n          return (\n            e.isString(t) || (t = JSON.stringify(t)),\n            t.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")\n          );\n        });\n      }\n      function I(t, n) {\n        var r = {};\n        if (!e.isArray(t) && !e.isObject(t))\n          throw new TypeError(\"obj must be an Array or an Object\");\n        return (\n          (function t(n, r, o, i) {\n            var u = !0;\n            function c(r, e) {\n              o.push(e), t(n, r, o, i), o.pop();\n            }\n            e.isFunction(i) && (u = i(n, r, o)),\n              -1 === n.indexOf(r) &&\n                (n.push(r),\n                !1 !== u &&\n                  (e.isArray(r)\n                    ? r.forEach(function (t, n) {\n                        c(t, n.toString());\n                      })\n                    : e.isObject(r) &&\n                      e.forOwn(r, function (t, n) {\n                        c(t, n);\n                      })),\n                n.pop());\n          })(\n            (function (t, n) {\n              var r,\n                e = [];\n              return (\n                n.length > 0 &&\n                  ((r = t),\n                  n.slice(0, n.length - 1).forEach(function (t) {\n                    t in r && ((r = r[t]), e.push(r));\n                  })),\n                e\n              );\n            })(t, (n = A(n, t)).subDocPath),\n            g(t, n.subDocPath),\n            e.cloneDeep(n.subDocPath),\n            function (t, o, i) {\n              var u,\n                c,\n                a = !0;\n              return (\n                x(o) &&\n                  (e.isUndefined(n.refPreProcessor) ||\n                    (o = n.refPreProcessor(e.cloneDeep(o), i)),\n                  (u = P(o)),\n                  e.isUndefined(n.refPostProcessor) ||\n                    (u = n.refPostProcessor(u, i)),\n                  n.filter(u, i) && ((c = D(i)), (r[c] = u)),\n                  b(o).length > 0 && (a = !1)),\n                a\n              );\n            },\n          ),\n          r\n        );\n      }\n      function P(t) {\n        var n,\n          r,\n          o,\n          i = { def: t };\n        try {\n          if (\n            (x(t, !0),\n            (n = t.$ref),\n            (o = v[n]),\n            e.isUndefined(o) && (o = v[n] = S(n)),\n            (i.uri = n),\n            (i.uriDetails = o),\n            e.isUndefined(o.error))\n          ) {\n            i.type = m(i);\n            try {\n              [\"#\", \"/\"].indexOf(n[0]) > -1\n                ? k(n, !0)\n                : n.indexOf(\"#\") > -1 && k(o.fragment, !0);\n            } catch (t) {\n              (i.error = t.message), (i.type = \"invalid\");\n            }\n          } else (i.error = i.uriDetails.error), (i.type = \"invalid\");\n          (r = b(t)).length > 0 &&\n            (i.warning =\n              \"Extra JSON Reference properties will be ignored: \" +\n              r.join(\", \"));\n        } catch (t) {\n          (i.error = t.message), (i.type = \"invalid\");\n        }\n        return i;\n      }\n      function k(t, n) {\n        var r,\n          o = !0;\n        try {\n          if (!e.isString(t)) throw new Error(\"ptr is not a String\");\n          if (\"\" !== t) {\n            if (((r = t.charAt(0)), -1 === [\"#\", \"/\"].indexOf(r)))\n              throw new Error(\"ptr must start with a / or #/\");\n            if (\"#\" === r && \"#\" !== t && \"/\" !== t.charAt(1))\n              throw new Error(\"ptr must start with a / or #/\");\n            if (t.match(f)) throw new Error(\"ptr has invalid token(s)\");\n          }\n        } catch (t) {\n          if (!0 === n) throw t;\n          o = !1;\n        }\n        return o;\n      }\n      function R(t) {\n        try {\n          k(t, !0);\n        } catch (t) {\n          throw new Error(\"ptr must be a JSON Pointer: \" + t.message);\n        }\n        var n = t.split(\"/\");\n        return n.shift(), T(n);\n      }\n      function D(t, n) {\n        if (!e.isArray(t)) throw new Error(\"path must be an Array\");\n        return (\n          (!1 !== n ? \"#\" : \"\") + (t.length > 0 ? \"/\" : \"\") + C(t).join(\"/\")\n        );\n      }\n      function U(t, n) {\n        var r = Promise.resolve();\n        return (r = r\n          .then(function () {\n            if (!e.isArray(t) && !e.isObject(t))\n              throw new TypeError(\"obj must be an Array or an Object\");\n            (n = A(n, t)), (t = e.cloneDeep(t));\n          })\n          .then(function () {\n            var r = { deps: {}, docs: {}, refs: {} };\n            return (function t(n, r, o) {\n              var u,\n                c,\n                a = Promise.resolve(),\n                s = D(r.subDocPath),\n                f = j(r.location),\n                l = i.dirname(r.location),\n                p = f + s;\n              return (\n                e.isUndefined(o.docs[f]) && (o.docs[f] = n),\n                e.isUndefined(o.deps[p]) &&\n                  ((o.deps[p] = {}),\n                  (u = I(n, r)),\n                  e.forOwn(u, function (i, u) {\n                    var f,\n                      h,\n                      v = j(r.location) + u,\n                      g = (i.refdId = decodeURI(\n                        j(y(i) ? d(l, i.uri) : r.location) +\n                          \"#\" +\n                          (i.uri.indexOf(\"#\") > -1 ? i.uri.split(\"#\")[1] : \"\"),\n                      ));\n                    ((o.refs[v] = i), _(i)) &&\n                      ((i.fqURI = g),\n                      (o.deps[p][u === s ? \"#\" : u.replace(s + \"/\", \"#/\")] = g),\n                      0 !== v.indexOf(g + \"/\") && v !== g\n                        ? (((c = e.cloneDeep(r)).subDocPath = e.isUndefined(\n                            i.uriDetails.fragment,\n                          )\n                            ? []\n                            : R(decodeURI(i.uriDetails.fragment))),\n                          y(i)\n                            ? (delete c.filter,\n                              (c.location = g.split(\"#\")[0]),\n                              (a = a.then(\n                                ((f = o),\n                                (h = c),\n                                function () {\n                                  var t = j(h.location),\n                                    n = f.docs[t];\n                                  return e.isUndefined(n)\n                                    ? w(t, h).catch(function (n) {\n                                        return (f.docs[t] = n), n;\n                                      })\n                                    : Promise.resolve().then(function () {\n                                        return n;\n                                      });\n                                }),\n                              )))\n                            : (a = a.then(function () {\n                                return n;\n                              })),\n                          (a = a.then(\n                            (function (n, r, o) {\n                              return function (i) {\n                                if (e.isError(i)) E(o, i);\n                                else\n                                  try {\n                                    return t(i, r, n).catch(function (t) {\n                                      E(o, t);\n                                    });\n                                  } catch (t) {\n                                    E(o, t);\n                                  }\n                              };\n                            })(o, c, i),\n                          )))\n                        : (i.circular = !0));\n                  })),\n                a\n              );\n            })(t, n, r).then(function () {\n              return r;\n            });\n          })\n          .then(function (t) {\n            var r = {},\n              u = [],\n              c = [],\n              a = new o.Graph(),\n              s = j(n.location),\n              f = s + D(n.subDocPath),\n              l = i.dirname(s);\n            return (\n              Object.keys(t.deps).forEach(function (t) {\n                a.setNode(t);\n              }),\n              e.forOwn(t.deps, function (t, n) {\n                e.forOwn(t, function (t) {\n                  a.setEdge(n, t);\n                });\n              }),\n              (u = o.alg.findCycles(a)).forEach(function (t) {\n                t.forEach(function (t) {\n                  -1 === c.indexOf(t) && c.push(t);\n                });\n              }),\n              e.forOwn(t.deps, function (n, r) {\n                e.forOwn(n, function (n, e) {\n                  var o,\n                    i = !1,\n                    a = r + e.slice(1),\n                    s = t.refs[r + e.slice(1)],\n                    f = y(s);\n                  c.indexOf(n) > -1 &&\n                    u.forEach(function (t) {\n                      i ||\n                        ((o = t.indexOf(n)) > -1 &&\n                          t.forEach(function (r) {\n                            i ||\n                              (0 === a.indexOf(r + \"/\") &&\n                                ((f &&\n                                  o !== t.length - 1 &&\n                                  \"#\" === n[n.length - 1]) ||\n                                  (i = !0)));\n                          }));\n                    }),\n                    i && (s.circular = !0);\n                });\n              }),\n              e.forOwn(Object.keys(t.deps).reverse(), function (r) {\n                var o = t.deps[r],\n                  i = r.split(\"#\"),\n                  u = t.docs[i[0]],\n                  c = R(i[1]);\n                e.forOwn(o, function (r, o) {\n                  var a = r.split(\"#\"),\n                    s = t.docs[a[0]],\n                    f = c.concat(R(o)),\n                    l = t.refs[i[0] + D(f)];\n                  if (e.isUndefined(l.error) && e.isUndefined(l.missing))\n                    if (!n.resolveCirculars && l.circular)\n                      l.value = e.cloneDeep(l.def);\n                    else {\n                      try {\n                        l.value = g(s, R(a[1]));\n                      } catch (t) {\n                        return void E(l, t);\n                      }\n                      \"\" === i[1] && \"#\" === o\n                        ? (t.docs[i[0]] = l.value)\n                        : O(u, f, l.value);\n                    }\n                });\n              }),\n              Object.keys(t.refs).forEach(function (o) {\n                var i,\n                  u,\n                  c = t.refs[o];\n                \"invalid\" !== c.type &&\n                  (\"#\" === c.fqURI[c.fqURI.length - 1] &&\n                    \"#\" !== c.uri[c.uri.length - 1] &&\n                    (c.fqURI = c.fqURI.substr(0, c.fqURI.length - 1)),\n                  (i = c.fqURI.split(\"/\")),\n                  (u = c.uri.split(\"/\")),\n                  e.times(u.length - 1, function (t) {\n                    var n = u[u.length - t - 1],\n                      r = u[u.length - t],\n                      e = i.length - t - 1;\n                    \".\" !== n && \"..\" !== n && \"..\" !== r && (i[e] = n);\n                  }),\n                  (c.fqURI = i.join(\"/\")),\n                  0 === c.fqURI.indexOf(s)\n                    ? (c.fqURI = c.fqURI.replace(s, \"\"))\n                    : 0 === c.fqURI.indexOf(l) &&\n                      (c.fqURI = c.fqURI.replace(l, \"\")),\n                  \"/\" === c.fqURI[0] && (c.fqURI = \".\" + c.fqURI)),\n                  0 === o.indexOf(f) &&\n                    (function e(o, i, u) {\n                      var c,\n                        a = i.split(\"#\"),\n                        s = t.refs[i];\n                      (r[\n                        a[0] === n.location\n                          ? \"#\" + a[1]\n                          : D(n.subDocPath.concat(u))\n                      ] = s),\n                        !s.circular && _(s)\n                          ? ((c = t.deps[s.refdId]),\n                            0 !== s.refdId.indexOf(o) &&\n                              Object.keys(c).forEach(function (t) {\n                                e(\n                                  s.refdId,\n                                  s.refdId + t.substr(1),\n                                  u.concat(R(t)),\n                                );\n                              }))\n                          : !s.circular &&\n                            s.error &&\n                            ((s.error = s.error.replace(\n                              \"options.subDocPath\",\n                              \"JSON Pointer\",\n                            )),\n                            s.error.indexOf(\"#\") > -1 &&\n                              (s.error = s.error.replace(\n                                s.uri.substr(s.uri.indexOf(\"#\")),\n                                s.uri,\n                              )),\n                            (0 !== s.error.indexOf(\"ENOENT:\") &&\n                              0 !== s.error.indexOf(\"Not Found\")) ||\n                              (s.error =\n                                \"JSON Pointer points to missing location: \" +\n                                s.uri));\n                    })(f, o, R(o.substr(f.length)));\n              }),\n              e.forOwn(r, function (n, r) {\n                delete n.refdId,\n                  n.circular &&\n                    \"local\" === n.type &&\n                    ((n.value.$ref = n.fqURI), O(t.docs[s], R(r), n.value)),\n                  n.missing &&\n                    (n.error = n.error.split(\": \")[0] + \": \" + n.def.$ref);\n              }),\n              { refs: r, resolved: t.docs[s] }\n            );\n          }));\n      }\n      \"undefined\" == typeof Promise && r(83),\n        (t.exports.clearCache = function () {\n          l = {};\n        }),\n        (t.exports.decodePath = function (t) {\n          return T(t);\n        }),\n        (t.exports.encodePath = function (t) {\n          return C(t);\n        }),\n        (t.exports.findRefs = function (t, n) {\n          return I(t, n);\n        }),\n        (t.exports.findRefsAt = function (t, n) {\n          return (function (t, n) {\n            var r = Promise.resolve();\n            return (r = r\n              .then(function () {\n                if (!e.isString(t))\n                  throw new TypeError(\"location must be a string\");\n                return (\n                  e.isUndefined(n) && (n = {}),\n                  e.isObject(n) && (n.location = t),\n                  w((n = A(n)).location, n)\n                );\n              })\n              .then(function (t) {\n                var r = e.cloneDeep(l[n.location]),\n                  o = e.cloneDeep(n);\n                return (\n                  e.isUndefined(r.refs) &&\n                    (delete o.filter,\n                    delete o.subDocPath,\n                    (o.includeInvalid = !0),\n                    (l[n.location].refs = I(t, o))),\n                  e.isUndefined(n.filter) || (o.filter = n.filter),\n                  { refs: I(t, o), value: t }\n                );\n              }));\n          })(t, n);\n        }),\n        (t.exports.getRefDetails = function (t) {\n          return P(t);\n        }),\n        (t.exports.isPtr = function (t, n) {\n          return k(t, n);\n        }),\n        (t.exports.isRef = function (t, n) {\n          return (function (t, n) {\n            return x(t, n) && \"invalid\" !== P(t).type;\n          })(t, n);\n        }),\n        (t.exports.pathFromPtr = function (t) {\n          return R(t);\n        }),\n        (t.exports.pathToPtr = function (t, n) {\n          return D(t, n);\n        }),\n        (t.exports.resolveRefs = function (t, n) {\n          return U(t, n);\n        }),\n        (t.exports.resolveRefsAt = function (t, n) {\n          return (function (t, n) {\n            var r = Promise.resolve();\n            return (r = r\n              .then(function () {\n                if (!e.isString(t))\n                  throw new TypeError(\"location must be a string\");\n                return (\n                  e.isUndefined(n) && (n = {}),\n                  e.isObject(n) && (n.location = t),\n                  w((n = A(n)).location, n)\n                );\n              })\n              .then(function (t) {\n                return U(t, n).then(function (n) {\n                  return { refs: n.refs, resolved: n.resolved, value: t };\n                });\n              }));\n          })(t, n);\n        });\n    }).call(this, r(13));\n  },\n  function (t, n, r) {\n    (function (t, e) {\n      var o;\n      function i(t) {\n        return (i =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      /**\n       * @license\n       * Lodash <https://lodash.com/>\n       * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n       * Released under MIT license <https://lodash.com/license>\n       * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n       * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n       */ (function () {\n        var u = \"Expected a function\",\n          c = \"__lodash_placeholder__\",\n          a = [\n            [\"ary\", 128],\n            [\"bind\", 1],\n            [\"bindKey\", 2],\n            [\"curry\", 8],\n            [\"curryRight\", 16],\n            [\"flip\", 512],\n            [\"partial\", 32],\n            [\"partialRight\", 64],\n            [\"rearg\", 256],\n          ],\n          s = \"[object Arguments]\",\n          f = \"[object Array]\",\n          l = \"[object Boolean]\",\n          p = \"[object Date]\",\n          h = \"[object Error]\",\n          v = \"[object Function]\",\n          d = \"[object GeneratorFunction]\",\n          y = \"[object Map]\",\n          _ = \"[object Number]\",\n          g = \"[object Object]\",\n          b = \"[object RegExp]\",\n          m = \"[object Set]\",\n          w = \"[object String]\",\n          x = \"[object Symbol]\",\n          j = \"[object WeakMap]\",\n          E = \"[object ArrayBuffer]\",\n          S = \"[object DataView]\",\n          O = \"[object Float32Array]\",\n          A = \"[object Float64Array]\",\n          T = \"[object Int8Array]\",\n          C = \"[object Int16Array]\",\n          I = \"[object Int32Array]\",\n          P = \"[object Uint8Array]\",\n          k = \"[object Uint16Array]\",\n          R = \"[object Uint32Array]\",\n          D = /\\b__p \\+= '';/g,\n          U = /\\b(__p \\+=) '' \\+/g,\n          N = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,\n          z = /&(?:amp|lt|gt|quot|#39);/g,\n          F = /[&<>\"']/g,\n          L = RegExp(z.source),\n          q = RegExp(F.source),\n          M = /<%-([\\s\\S]+?)%>/g,\n          $ = /<%([\\s\\S]+?)%>/g,\n          B = /<%=([\\s\\S]+?)%>/g,\n          H = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n          W = /^\\w*$/,\n          V =\n            /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,\n          G = /[\\\\^$.*+?()[\\]{}|]/g,\n          Z = RegExp(G.source),\n          J = /^\\s+|\\s+$/g,\n          X = /^\\s+/,\n          K = /\\s+$/,\n          Y = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n          Q = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n          tt = /,? & /,\n          nt = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,\n          rt = /\\\\(\\\\)?/g,\n          et = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,\n          ot = /\\w*$/,\n          it = /^[-+]0x[0-9a-f]+$/i,\n          ut = /^0b[01]+$/i,\n          ct = /^\\[object .+?Constructor\\]$/,\n          at = /^0o[0-7]+$/i,\n          st = /^(?:0|[1-9]\\d*)$/,\n          ft = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,\n          lt = /($^)/,\n          pt = /['\\n\\r\\u2028\\u2029\\\\]/g,\n          ht = \"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\",\n          vt =\n            \"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",\n          dt = \"[\\\\ud800-\\\\udfff]\",\n          yt = \"[\" + vt + \"]\",\n          _t = \"[\" + ht + \"]\",\n          gt = \"\\\\d+\",\n          bt = \"[\\\\u2700-\\\\u27bf]\",\n          mt = \"[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]\",\n          wt =\n            \"[^\\\\ud800-\\\\udfff\" +\n            vt +\n            gt +\n            \"\\\\u2700-\\\\u27bfa-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xffA-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\",\n          xt = \"\\\\ud83c[\\\\udffb-\\\\udfff]\",\n          jt = \"[^\\\\ud800-\\\\udfff]\",\n          Et = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",\n          St = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",\n          Ot = \"[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]\",\n          At = \"(?:\" + mt + \"|\" + wt + \")\",\n          Tt = \"(?:\" + Ot + \"|\" + wt + \")\",\n          Ct = \"(?:\" + _t + \"|\" + xt + \")\" + \"?\",\n          It =\n            \"[\\\\ufe0e\\\\ufe0f]?\" +\n            Ct +\n            (\"(?:\\\\u200d(?:\" +\n              [jt, Et, St].join(\"|\") +\n              \")[\\\\ufe0e\\\\ufe0f]?\" +\n              Ct +\n              \")*\"),\n          Pt = \"(?:\" + [bt, Et, St].join(\"|\") + \")\" + It,\n          kt = \"(?:\" + [jt + _t + \"?\", _t, Et, St, dt].join(\"|\") + \")\",\n          Rt = RegExp(\"['’]\", \"g\"),\n          Dt = RegExp(_t, \"g\"),\n          Ut = RegExp(xt + \"(?=\" + xt + \")|\" + kt + It, \"g\"),\n          Nt = RegExp(\n            [\n              Ot +\n                \"?\" +\n                mt +\n                \"+(?:['’](?:d|ll|m|re|s|t|ve))?(?=\" +\n                [yt, Ot, \"$\"].join(\"|\") +\n                \")\",\n              Tt +\n                \"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?=\" +\n                [yt, Ot + At, \"$\"].join(\"|\") +\n                \")\",\n              Ot + \"?\" + At + \"+(?:['’](?:d|ll|m|re|s|t|ve))?\",\n              Ot + \"+(?:['’](?:D|LL|M|RE|S|T|VE))?\",\n              \"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\n              \"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",\n              gt,\n              Pt,\n            ].join(\"|\"),\n            \"g\",\n          ),\n          zt = RegExp(\"[\\\\u200d\\\\ud800-\\\\udfff\" + ht + \"\\\\ufe0e\\\\ufe0f]\"),\n          Ft =\n            /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,\n          Lt = [\n            \"Array\",\n            \"Buffer\",\n            \"DataView\",\n            \"Date\",\n            \"Error\",\n            \"Float32Array\",\n            \"Float64Array\",\n            \"Function\",\n            \"Int8Array\",\n            \"Int16Array\",\n            \"Int32Array\",\n            \"Map\",\n            \"Math\",\n            \"Object\",\n            \"Promise\",\n            \"RegExp\",\n            \"Set\",\n            \"String\",\n            \"Symbol\",\n            \"TypeError\",\n            \"Uint8Array\",\n            \"Uint8ClampedArray\",\n            \"Uint16Array\",\n            \"Uint32Array\",\n            \"WeakMap\",\n            \"_\",\n            \"clearTimeout\",\n            \"isFinite\",\n            \"parseInt\",\n            \"setTimeout\",\n          ],\n          qt = -1,\n          Mt = {};\n        (Mt[O] =\n          Mt[A] =\n          Mt[T] =\n          Mt[C] =\n          Mt[I] =\n          Mt[P] =\n          Mt[\"[object Uint8ClampedArray]\"] =\n          Mt[k] =\n          Mt[R] =\n            !0),\n          (Mt[s] =\n            Mt[f] =\n            Mt[E] =\n            Mt[l] =\n            Mt[S] =\n            Mt[p] =\n            Mt[h] =\n            Mt[v] =\n            Mt[y] =\n            Mt[_] =\n            Mt[g] =\n            Mt[b] =\n            Mt[m] =\n            Mt[w] =\n            Mt[j] =\n              !1);\n        var $t = {};\n        ($t[s] =\n          $t[f] =\n          $t[E] =\n          $t[S] =\n          $t[l] =\n          $t[p] =\n          $t[O] =\n          $t[A] =\n          $t[T] =\n          $t[C] =\n          $t[I] =\n          $t[y] =\n          $t[_] =\n          $t[g] =\n          $t[b] =\n          $t[m] =\n          $t[w] =\n          $t[x] =\n          $t[P] =\n          $t[\"[object Uint8ClampedArray]\"] =\n          $t[k] =\n          $t[R] =\n            !0),\n          ($t[h] = $t[v] = $t[j] = !1);\n        var Bt = {\n            \"\\\\\": \"\\\\\",\n            \"'\": \"'\",\n            \"\\n\": \"n\",\n            \"\\r\": \"r\",\n            \"\\u2028\": \"u2028\",\n            \"\\u2029\": \"u2029\",\n          },\n          Ht = parseFloat,\n          Wt = parseInt,\n          Vt =\n            \"object\" == (void 0 === t ? \"undefined\" : i(t)) &&\n            t &&\n            t.Object === Object &&\n            t,\n          Gt =\n            \"object\" == (\"undefined\" == typeof self ? \"undefined\" : i(self)) &&\n            self &&\n            self.Object === Object &&\n            self,\n          Zt = Vt || Gt || Function(\"return this\")(),\n          Jt = \"object\" == i(n) && n && !n.nodeType && n,\n          Xt = Jt && \"object\" == i(e) && e && !e.nodeType && e,\n          Kt = Xt && Xt.exports === Jt,\n          Yt = Kt && Vt.process,\n          Qt = (function () {\n            try {\n              var t = Xt && Xt.require && Xt.require(\"util\").types;\n              return t || (Yt && Yt.binding && Yt.binding(\"util\"));\n            } catch (t) {}\n          })(),\n          tn = Qt && Qt.isArrayBuffer,\n          nn = Qt && Qt.isDate,\n          rn = Qt && Qt.isMap,\n          en = Qt && Qt.isRegExp,\n          on = Qt && Qt.isSet,\n          un = Qt && Qt.isTypedArray;\n        function cn(t, n, r) {\n          switch (r.length) {\n            case 0:\n              return t.call(n);\n            case 1:\n              return t.call(n, r[0]);\n            case 2:\n              return t.call(n, r[0], r[1]);\n            case 3:\n              return t.call(n, r[0], r[1], r[2]);\n          }\n          return t.apply(n, r);\n        }\n        function an(t, n, r, e) {\n          for (var o = -1, i = null == t ? 0 : t.length; ++o < i; ) {\n            var u = t[o];\n            n(e, u, r(u), t);\n          }\n          return e;\n        }\n        function sn(t, n) {\n          for (\n            var r = -1, e = null == t ? 0 : t.length;\n            ++r < e && !1 !== n(t[r], r, t);\n\n          );\n          return t;\n        }\n        function fn(t, n) {\n          for (var r = null == t ? 0 : t.length; r-- && !1 !== n(t[r], r, t); );\n          return t;\n        }\n        function ln(t, n) {\n          for (var r = -1, e = null == t ? 0 : t.length; ++r < e; )\n            if (!n(t[r], r, t)) return !1;\n          return !0;\n        }\n        function pn(t, n) {\n          for (\n            var r = -1, e = null == t ? 0 : t.length, o = 0, i = [];\n            ++r < e;\n\n          ) {\n            var u = t[r];\n            n(u, r, t) && (i[o++] = u);\n          }\n          return i;\n        }\n        function hn(t, n) {\n          return !!(null == t ? 0 : t.length) && jn(t, n, 0) > -1;\n        }\n        function vn(t, n, r) {\n          for (var e = -1, o = null == t ? 0 : t.length; ++e < o; )\n            if (r(n, t[e])) return !0;\n          return !1;\n        }\n        function dn(t, n) {\n          for (\n            var r = -1, e = null == t ? 0 : t.length, o = Array(e);\n            ++r < e;\n\n          )\n            o[r] = n(t[r], r, t);\n          return o;\n        }\n        function yn(t, n) {\n          for (var r = -1, e = n.length, o = t.length; ++r < e; )\n            t[o + r] = n[r];\n          return t;\n        }\n        function _n(t, n, r, e) {\n          var o = -1,\n            i = null == t ? 0 : t.length;\n          for (e && i && (r = t[++o]); ++o < i; ) r = n(r, t[o], o, t);\n          return r;\n        }\n        function gn(t, n, r, e) {\n          var o = null == t ? 0 : t.length;\n          for (e && o && (r = t[--o]); o--; ) r = n(r, t[o], o, t);\n          return r;\n        }\n        function bn(t, n) {\n          for (var r = -1, e = null == t ? 0 : t.length; ++r < e; )\n            if (n(t[r], r, t)) return !0;\n          return !1;\n        }\n        var mn = An(\"length\");\n        function wn(t, n, r) {\n          var e;\n          return (\n            r(t, function (t, r, o) {\n              if (n(t, r, o)) return (e = r), !1;\n            }),\n            e\n          );\n        }\n        function xn(t, n, r, e) {\n          for (var o = t.length, i = r + (e ? 1 : -1); e ? i-- : ++i < o; )\n            if (n(t[i], i, t)) return i;\n          return -1;\n        }\n        function jn(t, n, r) {\n          return n == n\n            ? (function (t, n, r) {\n                var e = r - 1,\n                  o = t.length;\n                for (; ++e < o; ) if (t[e] === n) return e;\n                return -1;\n              })(t, n, r)\n            : xn(t, Sn, r);\n        }\n        function En(t, n, r, e) {\n          for (var o = r - 1, i = t.length; ++o < i; ) if (e(t[o], n)) return o;\n          return -1;\n        }\n        function Sn(t) {\n          return t != t;\n        }\n        function On(t, n) {\n          var r = null == t ? 0 : t.length;\n          return r ? In(t, n) / r : NaN;\n        }\n        function An(t) {\n          return function (n) {\n            return null == n ? void 0 : n[t];\n          };\n        }\n        function Tn(t) {\n          return function (n) {\n            return null == t ? void 0 : t[n];\n          };\n        }\n        function Cn(t, n, r, e, o) {\n          return (\n            o(t, function (t, o, i) {\n              r = e ? ((e = !1), t) : n(r, t, o, i);\n            }),\n            r\n          );\n        }\n        function In(t, n) {\n          for (var r, e = -1, o = t.length; ++e < o; ) {\n            var i = n(t[e]);\n            void 0 !== i && (r = void 0 === r ? i : r + i);\n          }\n          return r;\n        }\n        function Pn(t, n) {\n          for (var r = -1, e = Array(t); ++r < t; ) e[r] = n(r);\n          return e;\n        }\n        function kn(t) {\n          return function (n) {\n            return t(n);\n          };\n        }\n        function Rn(t, n) {\n          return dn(n, function (n) {\n            return t[n];\n          });\n        }\n        function Dn(t, n) {\n          return t.has(n);\n        }\n        function Un(t, n) {\n          for (var r = -1, e = t.length; ++r < e && jn(n, t[r], 0) > -1; );\n          return r;\n        }\n        function Nn(t, n) {\n          for (var r = t.length; r-- && jn(n, t[r], 0) > -1; );\n          return r;\n        }\n        function zn(t, n) {\n          for (var r = t.length, e = 0; r--; ) t[r] === n && ++e;\n          return e;\n        }\n        var Fn = Tn({\n            À: \"A\",\n            Á: \"A\",\n            Â: \"A\",\n            Ã: \"A\",\n            Ä: \"A\",\n            Å: \"A\",\n            à: \"a\",\n            á: \"a\",\n            â: \"a\",\n            ã: \"a\",\n            ä: \"a\",\n            å: \"a\",\n            Ç: \"C\",\n            ç: \"c\",\n            Ð: \"D\",\n            ð: \"d\",\n            È: \"E\",\n            É: \"E\",\n            Ê: \"E\",\n            Ë: \"E\",\n            è: \"e\",\n            é: \"e\",\n            ê: \"e\",\n            ë: \"e\",\n            Ì: \"I\",\n            Í: \"I\",\n            Î: \"I\",\n            Ï: \"I\",\n            ì: \"i\",\n            í: \"i\",\n            î: \"i\",\n            ï: \"i\",\n            Ñ: \"N\",\n            ñ: \"n\",\n            Ò: \"O\",\n            Ó: \"O\",\n            Ô: \"O\",\n            Õ: \"O\",\n            Ö: \"O\",\n            Ø: \"O\",\n            ò: \"o\",\n            ó: \"o\",\n            ô: \"o\",\n            õ: \"o\",\n            ö: \"o\",\n            ø: \"o\",\n            Ù: \"U\",\n            Ú: \"U\",\n            Û: \"U\",\n            Ü: \"U\",\n            ù: \"u\",\n            ú: \"u\",\n            û: \"u\",\n            ü: \"u\",\n            Ý: \"Y\",\n            ý: \"y\",\n            ÿ: \"y\",\n            Æ: \"Ae\",\n            æ: \"ae\",\n            Þ: \"Th\",\n            þ: \"th\",\n            ß: \"ss\",\n            Ā: \"A\",\n            Ă: \"A\",\n            Ą: \"A\",\n            ā: \"a\",\n            ă: \"a\",\n            ą: \"a\",\n            Ć: \"C\",\n            Ĉ: \"C\",\n            Ċ: \"C\",\n            Č: \"C\",\n            ć: \"c\",\n            ĉ: \"c\",\n            ċ: \"c\",\n            č: \"c\",\n            Ď: \"D\",\n            Đ: \"D\",\n            ď: \"d\",\n            đ: \"d\",\n            Ē: \"E\",\n            Ĕ: \"E\",\n            Ė: \"E\",\n            Ę: \"E\",\n            Ě: \"E\",\n            ē: \"e\",\n            ĕ: \"e\",\n            ė: \"e\",\n            ę: \"e\",\n            ě: \"e\",\n            Ĝ: \"G\",\n            Ğ: \"G\",\n            Ġ: \"G\",\n            Ģ: \"G\",\n            ĝ: \"g\",\n            ğ: \"g\",\n            ġ: \"g\",\n            ģ: \"g\",\n            Ĥ: \"H\",\n            Ħ: \"H\",\n            ĥ: \"h\",\n            ħ: \"h\",\n            Ĩ: \"I\",\n            Ī: \"I\",\n            Ĭ: \"I\",\n            Į: \"I\",\n            İ: \"I\",\n            ĩ: \"i\",\n            ī: \"i\",\n            ĭ: \"i\",\n            į: \"i\",\n            ı: \"i\",\n            Ĵ: \"J\",\n            ĵ: \"j\",\n            Ķ: \"K\",\n            ķ: \"k\",\n            ĸ: \"k\",\n            Ĺ: \"L\",\n            Ļ: \"L\",\n            Ľ: \"L\",\n            Ŀ: \"L\",\n            Ł: \"L\",\n            ĺ: \"l\",\n            ļ: \"l\",\n            ľ: \"l\",\n            ŀ: \"l\",\n            ł: \"l\",\n            Ń: \"N\",\n            Ņ: \"N\",\n            Ň: \"N\",\n            Ŋ: \"N\",\n            ń: \"n\",\n            ņ: \"n\",\n            ň: \"n\",\n            ŋ: \"n\",\n            Ō: \"O\",\n            Ŏ: \"O\",\n            Ő: \"O\",\n            ō: \"o\",\n            ŏ: \"o\",\n            ő: \"o\",\n            Ŕ: \"R\",\n            Ŗ: \"R\",\n            Ř: \"R\",\n            ŕ: \"r\",\n            ŗ: \"r\",\n            ř: \"r\",\n            Ś: \"S\",\n            Ŝ: \"S\",\n            Ş: \"S\",\n            Š: \"S\",\n            ś: \"s\",\n            ŝ: \"s\",\n            ş: \"s\",\n            š: \"s\",\n            Ţ: \"T\",\n            Ť: \"T\",\n            Ŧ: \"T\",\n            ţ: \"t\",\n            ť: \"t\",\n            ŧ: \"t\",\n            Ũ: \"U\",\n            Ū: \"U\",\n            Ŭ: \"U\",\n            Ů: \"U\",\n            Ű: \"U\",\n            Ų: \"U\",\n            ũ: \"u\",\n            ū: \"u\",\n            ŭ: \"u\",\n            ů: \"u\",\n            ű: \"u\",\n            ų: \"u\",\n            Ŵ: \"W\",\n            ŵ: \"w\",\n            Ŷ: \"Y\",\n            ŷ: \"y\",\n            Ÿ: \"Y\",\n            Ź: \"Z\",\n            Ż: \"Z\",\n            Ž: \"Z\",\n            ź: \"z\",\n            ż: \"z\",\n            ž: \"z\",\n            Ĳ: \"IJ\",\n            ĳ: \"ij\",\n            Œ: \"Oe\",\n            œ: \"oe\",\n            ŉ: \"'n\",\n            ſ: \"s\",\n          }),\n          Ln = Tn({\n            \"&\": \"&amp;\",\n            \"<\": \"&lt;\",\n            \">\": \"&gt;\",\n            '\"': \"&quot;\",\n            \"'\": \"&#39;\",\n          });\n        function qn(t) {\n          return \"\\\\\" + Bt[t];\n        }\n        function Mn(t) {\n          return zt.test(t);\n        }\n        function $n(t) {\n          var n = -1,\n            r = Array(t.size);\n          return (\n            t.forEach(function (t, e) {\n              r[++n] = [e, t];\n            }),\n            r\n          );\n        }\n        function Bn(t, n) {\n          return function (r) {\n            return t(n(r));\n          };\n        }\n        function Hn(t, n) {\n          for (var r = -1, e = t.length, o = 0, i = []; ++r < e; ) {\n            var u = t[r];\n            (u !== n && u !== c) || ((t[r] = c), (i[o++] = r));\n          }\n          return i;\n        }\n        function Wn(t) {\n          var n = -1,\n            r = Array(t.size);\n          return (\n            t.forEach(function (t) {\n              r[++n] = t;\n            }),\n            r\n          );\n        }\n        function Vn(t) {\n          var n = -1,\n            r = Array(t.size);\n          return (\n            t.forEach(function (t) {\n              r[++n] = [t, t];\n            }),\n            r\n          );\n        }\n        function Gn(t) {\n          return Mn(t)\n            ? (function (t) {\n                var n = (Ut.lastIndex = 0);\n                for (; Ut.test(t); ) ++n;\n                return n;\n              })(t)\n            : mn(t);\n        }\n        function Zn(t) {\n          return Mn(t)\n            ? (function (t) {\n                return t.match(Ut) || [];\n              })(t)\n            : (function (t) {\n                return t.split(\"\");\n              })(t);\n        }\n        var Jn = Tn({\n          \"&amp;\": \"&\",\n          \"&lt;\": \"<\",\n          \"&gt;\": \">\",\n          \"&quot;\": '\"',\n          \"&#39;\": \"'\",\n        });\n        var Xn = (function t(n) {\n          var r,\n            e = (n =\n              null == n ? Zt : Xn.defaults(Zt.Object(), n, Xn.pick(Zt, Lt)))\n              .Array,\n            o = n.Date,\n            ht = n.Error,\n            vt = n.Function,\n            dt = n.Math,\n            yt = n.Object,\n            _t = n.RegExp,\n            gt = n.String,\n            bt = n.TypeError,\n            mt = e.prototype,\n            wt = vt.prototype,\n            xt = yt.prototype,\n            jt = n[\"__core-js_shared__\"],\n            Et = wt.toString,\n            St = xt.hasOwnProperty,\n            Ot = 0,\n            At = (r = /[^.]+$/.exec((jt && jt.keys && jt.keys.IE_PROTO) || \"\"))\n              ? \"Symbol(src)_1.\" + r\n              : \"\",\n            Tt = xt.toString,\n            Ct = Et.call(yt),\n            It = Zt._,\n            Pt = _t(\n              \"^\" +\n                Et.call(St)\n                  .replace(G, \"\\\\$&\")\n                  .replace(\n                    /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n                    \"$1.*?\",\n                  ) +\n                \"$\",\n            ),\n            kt = Kt ? n.Buffer : void 0,\n            Ut = n.Symbol,\n            zt = n.Uint8Array,\n            Bt = kt ? kt.allocUnsafe : void 0,\n            Vt = Bn(yt.getPrototypeOf, yt),\n            Gt = yt.create,\n            Jt = xt.propertyIsEnumerable,\n            Xt = mt.splice,\n            Yt = Ut ? Ut.isConcatSpreadable : void 0,\n            Qt = Ut ? Ut.iterator : void 0,\n            mn = Ut ? Ut.toStringTag : void 0,\n            Tn = (function () {\n              try {\n                var t = ni(yt, \"defineProperty\");\n                return t({}, \"\", {}), t;\n              } catch (t) {}\n            })(),\n            Kn = n.clearTimeout !== Zt.clearTimeout && n.clearTimeout,\n            Yn = o && o.now !== Zt.Date.now && o.now,\n            Qn = n.setTimeout !== Zt.setTimeout && n.setTimeout,\n            tr = dt.ceil,\n            nr = dt.floor,\n            rr = yt.getOwnPropertySymbols,\n            er = kt ? kt.isBuffer : void 0,\n            or = n.isFinite,\n            ir = mt.join,\n            ur = Bn(yt.keys, yt),\n            cr = dt.max,\n            ar = dt.min,\n            sr = o.now,\n            fr = n.parseInt,\n            lr = dt.random,\n            pr = mt.reverse,\n            hr = ni(n, \"DataView\"),\n            vr = ni(n, \"Map\"),\n            dr = ni(n, \"Promise\"),\n            yr = ni(n, \"Set\"),\n            _r = ni(n, \"WeakMap\"),\n            gr = ni(yt, \"create\"),\n            br = _r && new _r(),\n            mr = {},\n            wr = Ti(hr),\n            xr = Ti(vr),\n            jr = Ti(dr),\n            Er = Ti(yr),\n            Sr = Ti(_r),\n            Or = Ut ? Ut.prototype : void 0,\n            Ar = Or ? Or.valueOf : void 0,\n            Tr = Or ? Or.toString : void 0;\n          function Cr(t) {\n            if (Wu(t) && !Du(t) && !(t instanceof Rr)) {\n              if (t instanceof kr) return t;\n              if (St.call(t, \"__wrapped__\")) return Ci(t);\n            }\n            return new kr(t);\n          }\n          var Ir = (function () {\n            function t() {}\n            return function (n) {\n              if (!Hu(n)) return {};\n              if (Gt) return Gt(n);\n              t.prototype = n;\n              var r = new t();\n              return (t.prototype = void 0), r;\n            };\n          })();\n          function Pr() {}\n          function kr(t, n) {\n            (this.__wrapped__ = t),\n              (this.__actions__ = []),\n              (this.__chain__ = !!n),\n              (this.__index__ = 0),\n              (this.__values__ = void 0);\n          }\n          function Rr(t) {\n            (this.__wrapped__ = t),\n              (this.__actions__ = []),\n              (this.__dir__ = 1),\n              (this.__filtered__ = !1),\n              (this.__iteratees__ = []),\n              (this.__takeCount__ = 4294967295),\n              (this.__views__ = []);\n          }\n          function Dr(t) {\n            var n = -1,\n              r = null == t ? 0 : t.length;\n            for (this.clear(); ++n < r; ) {\n              var e = t[n];\n              this.set(e[0], e[1]);\n            }\n          }\n          function Ur(t) {\n            var n = -1,\n              r = null == t ? 0 : t.length;\n            for (this.clear(); ++n < r; ) {\n              var e = t[n];\n              this.set(e[0], e[1]);\n            }\n          }\n          function Nr(t) {\n            var n = -1,\n              r = null == t ? 0 : t.length;\n            for (this.clear(); ++n < r; ) {\n              var e = t[n];\n              this.set(e[0], e[1]);\n            }\n          }\n          function zr(t) {\n            var n = -1,\n              r = null == t ? 0 : t.length;\n            for (this.__data__ = new Nr(); ++n < r; ) this.add(t[n]);\n          }\n          function Fr(t) {\n            var n = (this.__data__ = new Ur(t));\n            this.size = n.size;\n          }\n          function Lr(t, n) {\n            var r = Du(t),\n              e = !r && Ru(t),\n              o = !r && !e && Fu(t),\n              i = !r && !e && !o && Qu(t),\n              u = r || e || o || i,\n              c = u ? Pn(t.length, gt) : [],\n              a = c.length;\n            for (var s in t)\n              (!n && !St.call(t, s)) ||\n                (u &&\n                  (\"length\" == s ||\n                    (o && (\"offset\" == s || \"parent\" == s)) ||\n                    (i &&\n                      (\"buffer\" == s ||\n                        \"byteLength\" == s ||\n                        \"byteOffset\" == s)) ||\n                    ai(s, a))) ||\n                c.push(s);\n            return c;\n          }\n          function qr(t) {\n            var n = t.length;\n            return n ? t[ze(0, n - 1)] : void 0;\n          }\n          function Mr(t, n) {\n            return Si(bo(t), Xr(n, 0, t.length));\n          }\n          function $r(t) {\n            return Si(bo(t));\n          }\n          function Br(t, n, r) {\n            ((void 0 === r || Iu(t[n], r)) && (void 0 !== r || n in t)) ||\n              Zr(t, n, r);\n          }\n          function Hr(t, n, r) {\n            var e = t[n];\n            (St.call(t, n) && Iu(e, r) && (void 0 !== r || n in t)) ||\n              Zr(t, n, r);\n          }\n          function Wr(t, n) {\n            for (var r = t.length; r--; ) if (Iu(t[r][0], n)) return r;\n            return -1;\n          }\n          function Vr(t, n, r, e) {\n            return (\n              ne(t, function (t, o, i) {\n                n(e, t, r(t), i);\n              }),\n              e\n            );\n          }\n          function Gr(t, n) {\n            return t && mo(n, wc(n), t);\n          }\n          function Zr(t, n, r) {\n            \"__proto__\" == n && Tn\n              ? Tn(t, n, {\n                  configurable: !0,\n                  enumerable: !0,\n                  value: r,\n                  writable: !0,\n                })\n              : (t[n] = r);\n          }\n          function Jr(t, n) {\n            for (var r = -1, o = n.length, i = e(o), u = null == t; ++r < o; )\n              i[r] = u ? void 0 : yc(t, n[r]);\n            return i;\n          }\n          function Xr(t, n, r) {\n            return (\n              t == t &&\n                (void 0 !== r && (t = t <= r ? t : r),\n                void 0 !== n && (t = t >= n ? t : n)),\n              t\n            );\n          }\n          function Kr(t, n, r, e, o, i) {\n            var u,\n              c = 1 & n,\n              a = 2 & n,\n              f = 4 & n;\n            if ((r && (u = o ? r(t, e, o, i) : r(t)), void 0 !== u)) return u;\n            if (!Hu(t)) return t;\n            var h = Du(t);\n            if (h) {\n              if (\n                ((u = (function (t) {\n                  var n = t.length,\n                    r = new t.constructor(n);\n                  n &&\n                    \"string\" == typeof t[0] &&\n                    St.call(t, \"index\") &&\n                    ((r.index = t.index), (r.input = t.input));\n                  return r;\n                })(t)),\n                !c)\n              )\n                return bo(t, u);\n            } else {\n              var j = oi(t),\n                D = j == v || j == d;\n              if (Fu(t)) return po(t, c);\n              if (j == g || j == s || (D && !o)) {\n                if (((u = a || D ? {} : ui(t)), !c))\n                  return a\n                    ? (function (t, n) {\n                        return mo(t, ei(t), n);\n                      })(\n                        t,\n                        (function (t, n) {\n                          return t && mo(n, xc(n), t);\n                        })(u, t),\n                      )\n                    : (function (t, n) {\n                        return mo(t, ri(t), n);\n                      })(t, Gr(u, t));\n              } else {\n                if (!$t[j]) return o ? t : {};\n                u = (function (t, n, r) {\n                  var e = t.constructor;\n                  switch (n) {\n                    case E:\n                      return ho(t);\n                    case l:\n                    case p:\n                      return new e(+t);\n                    case S:\n                      return (function (t, n) {\n                        var r = n ? ho(t.buffer) : t.buffer;\n                        return new t.constructor(r, t.byteOffset, t.byteLength);\n                      })(t, r);\n                    case O:\n                    case A:\n                    case T:\n                    case C:\n                    case I:\n                    case P:\n                    case \"[object Uint8ClampedArray]\":\n                    case k:\n                    case R:\n                      return vo(t, r);\n                    case y:\n                      return new e();\n                    case _:\n                    case w:\n                      return new e(t);\n                    case b:\n                      return (function (t) {\n                        var n = new t.constructor(t.source, ot.exec(t));\n                        return (n.lastIndex = t.lastIndex), n;\n                      })(t);\n                    case m:\n                      return new e();\n                    case x:\n                      return (o = t), Ar ? yt(Ar.call(o)) : {};\n                  }\n                  var o;\n                })(t, j, c);\n              }\n            }\n            i || (i = new Fr());\n            var U = i.get(t);\n            if (U) return U;\n            i.set(t, u),\n              Xu(t)\n                ? t.forEach(function (e) {\n                    u.add(Kr(e, n, r, e, t, i));\n                  })\n                : Vu(t) &&\n                  t.forEach(function (e, o) {\n                    u.set(o, Kr(e, n, r, o, t, i));\n                  });\n            var N = h ? void 0 : (f ? (a ? Zo : Go) : a ? xc : wc)(t);\n            return (\n              sn(N || t, function (e, o) {\n                N && (e = t[(o = e)]), Hr(u, o, Kr(e, n, r, o, t, i));\n              }),\n              u\n            );\n          }\n          function Yr(t, n, r) {\n            var e = r.length;\n            if (null == t) return !e;\n            for (t = yt(t); e--; ) {\n              var o = r[e],\n                i = n[o],\n                u = t[o];\n              if ((void 0 === u && !(o in t)) || !i(u)) return !1;\n            }\n            return !0;\n          }\n          function Qr(t, n, r) {\n            if (\"function\" != typeof t) throw new bt(u);\n            return wi(function () {\n              t.apply(void 0, r);\n            }, n);\n          }\n          function te(t, n, r, e) {\n            var o = -1,\n              i = hn,\n              u = !0,\n              c = t.length,\n              a = [],\n              s = n.length;\n            if (!c) return a;\n            r && (n = dn(n, kn(r))),\n              e\n                ? ((i = vn), (u = !1))\n                : n.length >= 200 && ((i = Dn), (u = !1), (n = new zr(n)));\n            t: for (; ++o < c; ) {\n              var f = t[o],\n                l = null == r ? f : r(f);\n              if (((f = e || 0 !== f ? f : 0), u && l == l)) {\n                for (var p = s; p--; ) if (n[p] === l) continue t;\n                a.push(f);\n              } else i(n, l, e) || a.push(f);\n            }\n            return a;\n          }\n          (Cr.templateSettings = {\n            escape: M,\n            evaluate: $,\n            interpolate: B,\n            variable: \"\",\n            imports: { _: Cr },\n          }),\n            (Cr.prototype = Pr.prototype),\n            (Cr.prototype.constructor = Cr),\n            (kr.prototype = Ir(Pr.prototype)),\n            (kr.prototype.constructor = kr),\n            (Rr.prototype = Ir(Pr.prototype)),\n            (Rr.prototype.constructor = Rr),\n            (Dr.prototype.clear = function () {\n              (this.__data__ = gr ? gr(null) : {}), (this.size = 0);\n            }),\n            (Dr.prototype.delete = function (t) {\n              var n = this.has(t) && delete this.__data__[t];\n              return (this.size -= n ? 1 : 0), n;\n            }),\n            (Dr.prototype.get = function (t) {\n              var n = this.__data__;\n              if (gr) {\n                var r = n[t];\n                return \"__lodash_hash_undefined__\" === r ? void 0 : r;\n              }\n              return St.call(n, t) ? n[t] : void 0;\n            }),\n            (Dr.prototype.has = function (t) {\n              var n = this.__data__;\n              return gr ? void 0 !== n[t] : St.call(n, t);\n            }),\n            (Dr.prototype.set = function (t, n) {\n              var r = this.__data__;\n              return (\n                (this.size += this.has(t) ? 0 : 1),\n                (r[t] = gr && void 0 === n ? \"__lodash_hash_undefined__\" : n),\n                this\n              );\n            }),\n            (Ur.prototype.clear = function () {\n              (this.__data__ = []), (this.size = 0);\n            }),\n            (Ur.prototype.delete = function (t) {\n              var n = this.__data__,\n                r = Wr(n, t);\n              return (\n                !(r < 0) &&\n                (r == n.length - 1 ? n.pop() : Xt.call(n, r, 1),\n                --this.size,\n                !0)\n              );\n            }),\n            (Ur.prototype.get = function (t) {\n              var n = this.__data__,\n                r = Wr(n, t);\n              return r < 0 ? void 0 : n[r][1];\n            }),\n            (Ur.prototype.has = function (t) {\n              return Wr(this.__data__, t) > -1;\n            }),\n            (Ur.prototype.set = function (t, n) {\n              var r = this.__data__,\n                e = Wr(r, t);\n              return (\n                e < 0 ? (++this.size, r.push([t, n])) : (r[e][1] = n), this\n              );\n            }),\n            (Nr.prototype.clear = function () {\n              (this.size = 0),\n                (this.__data__ = {\n                  hash: new Dr(),\n                  map: new (vr || Ur)(),\n                  string: new Dr(),\n                });\n            }),\n            (Nr.prototype.delete = function (t) {\n              var n = Qo(this, t).delete(t);\n              return (this.size -= n ? 1 : 0), n;\n            }),\n            (Nr.prototype.get = function (t) {\n              return Qo(this, t).get(t);\n            }),\n            (Nr.prototype.has = function (t) {\n              return Qo(this, t).has(t);\n            }),\n            (Nr.prototype.set = function (t, n) {\n              var r = Qo(this, t),\n                e = r.size;\n              return r.set(t, n), (this.size += r.size == e ? 0 : 1), this;\n            }),\n            (zr.prototype.add = zr.prototype.push =\n              function (t) {\n                return this.__data__.set(t, \"__lodash_hash_undefined__\"), this;\n              }),\n            (zr.prototype.has = function (t) {\n              return this.__data__.has(t);\n            }),\n            (Fr.prototype.clear = function () {\n              (this.__data__ = new Ur()), (this.size = 0);\n            }),\n            (Fr.prototype.delete = function (t) {\n              var n = this.__data__,\n                r = n.delete(t);\n              return (this.size = n.size), r;\n            }),\n            (Fr.prototype.get = function (t) {\n              return this.__data__.get(t);\n            }),\n            (Fr.prototype.has = function (t) {\n              return this.__data__.has(t);\n            }),\n            (Fr.prototype.set = function (t, n) {\n              var r = this.__data__;\n              if (r instanceof Ur) {\n                var e = r.__data__;\n                if (!vr || e.length < 199)\n                  return e.push([t, n]), (this.size = ++r.size), this;\n                r = this.__data__ = new Nr(e);\n              }\n              return r.set(t, n), (this.size = r.size), this;\n            });\n          var ne = jo(se),\n            re = jo(fe, !0);\n          function ee(t, n) {\n            var r = !0;\n            return (\n              ne(t, function (t, e, o) {\n                return (r = !!n(t, e, o));\n              }),\n              r\n            );\n          }\n          function oe(t, n, r) {\n            for (var e = -1, o = t.length; ++e < o; ) {\n              var i = t[e],\n                u = n(i);\n              if (null != u && (void 0 === c ? u == u && !Yu(u) : r(u, c)))\n                var c = u,\n                  a = i;\n            }\n            return a;\n          }\n          function ie(t, n) {\n            var r = [];\n            return (\n              ne(t, function (t, e, o) {\n                n(t, e, o) && r.push(t);\n              }),\n              r\n            );\n          }\n          function ue(t, n, r, e, o) {\n            var i = -1,\n              u = t.length;\n            for (r || (r = ci), o || (o = []); ++i < u; ) {\n              var c = t[i];\n              n > 0 && r(c)\n                ? n > 1\n                  ? ue(c, n - 1, r, e, o)\n                  : yn(o, c)\n                : e || (o[o.length] = c);\n            }\n            return o;\n          }\n          var ce = Eo(),\n            ae = Eo(!0);\n          function se(t, n) {\n            return t && ce(t, n, wc);\n          }\n          function fe(t, n) {\n            return t && ae(t, n, wc);\n          }\n          function le(t, n) {\n            return pn(n, function (n) {\n              return Mu(t[n]);\n            });\n          }\n          function pe(t, n) {\n            for (var r = 0, e = (n = ao(n, t)).length; null != t && r < e; )\n              t = t[Ai(n[r++])];\n            return r && r == e ? t : void 0;\n          }\n          function he(t, n, r) {\n            var e = n(t);\n            return Du(t) ? e : yn(e, r(t));\n          }\n          function ve(t) {\n            return null == t\n              ? void 0 === t\n                ? \"[object Undefined]\"\n                : \"[object Null]\"\n              : mn && mn in yt(t)\n                ? (function (t) {\n                    var n = St.call(t, mn),\n                      r = t[mn];\n                    try {\n                      t[mn] = void 0;\n                      var e = !0;\n                    } catch (t) {}\n                    var o = Tt.call(t);\n                    e && (n ? (t[mn] = r) : delete t[mn]);\n                    return o;\n                  })(t)\n                : (function (t) {\n                    return Tt.call(t);\n                  })(t);\n          }\n          function de(t, n) {\n            return t > n;\n          }\n          function ye(t, n) {\n            return null != t && St.call(t, n);\n          }\n          function _e(t, n) {\n            return null != t && n in yt(t);\n          }\n          function ge(t, n, r) {\n            for (\n              var o = r ? vn : hn,\n                i = t[0].length,\n                u = t.length,\n                c = u,\n                a = e(u),\n                s = 1 / 0,\n                f = [];\n              c--;\n\n            ) {\n              var l = t[c];\n              c && n && (l = dn(l, kn(n))),\n                (s = ar(l.length, s)),\n                (a[c] =\n                  !r && (n || (i >= 120 && l.length >= 120))\n                    ? new zr(c && l)\n                    : void 0);\n            }\n            l = t[0];\n            var p = -1,\n              h = a[0];\n            t: for (; ++p < i && f.length < s; ) {\n              var v = l[p],\n                d = n ? n(v) : v;\n              if (((v = r || 0 !== v ? v : 0), !(h ? Dn(h, d) : o(f, d, r)))) {\n                for (c = u; --c; ) {\n                  var y = a[c];\n                  if (!(y ? Dn(y, d) : o(t[c], d, r))) continue t;\n                }\n                h && h.push(d), f.push(v);\n              }\n            }\n            return f;\n          }\n          function be(t, n, r) {\n            var e = null == (t = _i(t, (n = ao(n, t)))) ? t : t[Ai(qi(n))];\n            return null == e ? void 0 : cn(e, t, r);\n          }\n          function me(t) {\n            return Wu(t) && ve(t) == s;\n          }\n          function we(t, n, r, e, o) {\n            return (\n              t === n ||\n              (null == t || null == n || (!Wu(t) && !Wu(n))\n                ? t != t && n != n\n                : (function (t, n, r, e, o, i) {\n                    var u = Du(t),\n                      c = Du(n),\n                      a = u ? f : oi(t),\n                      v = c ? f : oi(n),\n                      d = (a = a == s ? g : a) == g,\n                      j = (v = v == s ? g : v) == g,\n                      O = a == v;\n                    if (O && Fu(t)) {\n                      if (!Fu(n)) return !1;\n                      (u = !0), (d = !1);\n                    }\n                    if (O && !d)\n                      return (\n                        i || (i = new Fr()),\n                        u || Qu(t)\n                          ? Wo(t, n, r, e, o, i)\n                          : (function (t, n, r, e, o, i, u) {\n                              switch (r) {\n                                case S:\n                                  if (\n                                    t.byteLength != n.byteLength ||\n                                    t.byteOffset != n.byteOffset\n                                  )\n                                    return !1;\n                                  (t = t.buffer), (n = n.buffer);\n                                case E:\n                                  return !(\n                                    t.byteLength != n.byteLength ||\n                                    !i(new zt(t), new zt(n))\n                                  );\n                                case l:\n                                case p:\n                                case _:\n                                  return Iu(+t, +n);\n                                case h:\n                                  return (\n                                    t.name == n.name && t.message == n.message\n                                  );\n                                case b:\n                                case w:\n                                  return t == n + \"\";\n                                case y:\n                                  var c = $n;\n                                case m:\n                                  var a = 1 & e;\n                                  if ((c || (c = Wn), t.size != n.size && !a))\n                                    return !1;\n                                  var s = u.get(t);\n                                  if (s) return s == n;\n                                  (e |= 2), u.set(t, n);\n                                  var f = Wo(c(t), c(n), e, o, i, u);\n                                  return u.delete(t), f;\n                                case x:\n                                  if (Ar) return Ar.call(t) == Ar.call(n);\n                              }\n                              return !1;\n                            })(t, n, a, r, e, o, i)\n                      );\n                    if (!(1 & r)) {\n                      var A = d && St.call(t, \"__wrapped__\"),\n                        T = j && St.call(n, \"__wrapped__\");\n                      if (A || T) {\n                        var C = A ? t.value() : t,\n                          I = T ? n.value() : n;\n                        return i || (i = new Fr()), o(C, I, r, e, i);\n                      }\n                    }\n                    if (!O) return !1;\n                    return (\n                      i || (i = new Fr()),\n                      (function (t, n, r, e, o, i) {\n                        var u = 1 & r,\n                          c = Go(t),\n                          a = c.length,\n                          s = Go(n).length;\n                        if (a != s && !u) return !1;\n                        var f = a;\n                        for (; f--; ) {\n                          var l = c[f];\n                          if (!(u ? l in n : St.call(n, l))) return !1;\n                        }\n                        var p = i.get(t);\n                        if (p && i.get(n)) return p == n;\n                        var h = !0;\n                        i.set(t, n), i.set(n, t);\n                        var v = u;\n                        for (; ++f < a; ) {\n                          l = c[f];\n                          var d = t[l],\n                            y = n[l];\n                          if (e)\n                            var _ = u\n                              ? e(y, d, l, n, t, i)\n                              : e(d, y, l, t, n, i);\n                          if (\n                            !(void 0 === _ ? d === y || o(d, y, r, e, i) : _)\n                          ) {\n                            h = !1;\n                            break;\n                          }\n                          v || (v = \"constructor\" == l);\n                        }\n                        if (h && !v) {\n                          var g = t.constructor,\n                            b = n.constructor;\n                          g != b &&\n                            \"constructor\" in t &&\n                            \"constructor\" in n &&\n                            !(\n                              \"function\" == typeof g &&\n                              g instanceof g &&\n                              \"function\" == typeof b &&\n                              b instanceof b\n                            ) &&\n                            (h = !1);\n                        }\n                        return i.delete(t), i.delete(n), h;\n                      })(t, n, r, e, o, i)\n                    );\n                  })(t, n, r, e, we, o))\n            );\n          }\n          function xe(t, n, r, e) {\n            var o = r.length,\n              i = o,\n              u = !e;\n            if (null == t) return !i;\n            for (t = yt(t); o--; ) {\n              var c = r[o];\n              if (u && c[2] ? c[1] !== t[c[0]] : !(c[0] in t)) return !1;\n            }\n            for (; ++o < i; ) {\n              var a = (c = r[o])[0],\n                s = t[a],\n                f = c[1];\n              if (u && c[2]) {\n                if (void 0 === s && !(a in t)) return !1;\n              } else {\n                var l = new Fr();\n                if (e) var p = e(s, f, a, t, n, l);\n                if (!(void 0 === p ? we(f, s, 3, e, l) : p)) return !1;\n              }\n            }\n            return !0;\n          }\n          function je(t) {\n            return (\n              !(!Hu(t) || ((n = t), At && At in n)) &&\n              (Mu(t) ? Pt : ct).test(Ti(t))\n            );\n            var n;\n          }\n          function Ee(t) {\n            return \"function\" == typeof t\n              ? t\n              : null == t\n                ? Gc\n                : \"object\" == i(t)\n                  ? Du(t)\n                    ? Ie(t[0], t[1])\n                    : Ce(t)\n                  : ra(t);\n          }\n          function Se(t) {\n            if (!hi(t)) return ur(t);\n            var n = [];\n            for (var r in yt(t))\n              St.call(t, r) && \"constructor\" != r && n.push(r);\n            return n;\n          }\n          function Oe(t) {\n            if (!Hu(t))\n              return (function (t) {\n                var n = [];\n                if (null != t) for (var r in yt(t)) n.push(r);\n                return n;\n              })(t);\n            var n = hi(t),\n              r = [];\n            for (var e in t)\n              (\"constructor\" != e || (!n && St.call(t, e))) && r.push(e);\n            return r;\n          }\n          function Ae(t, n) {\n            return t < n;\n          }\n          function Te(t, n) {\n            var r = -1,\n              o = Nu(t) ? e(t.length) : [];\n            return (\n              ne(t, function (t, e, i) {\n                o[++r] = n(t, e, i);\n              }),\n              o\n            );\n          }\n          function Ce(t) {\n            var n = ti(t);\n            return 1 == n.length && n[0][2]\n              ? di(n[0][0], n[0][1])\n              : function (r) {\n                  return r === t || xe(r, t, n);\n                };\n          }\n          function Ie(t, n) {\n            return fi(t) && vi(n)\n              ? di(Ai(t), n)\n              : function (r) {\n                  var e = yc(r, t);\n                  return void 0 === e && e === n ? _c(r, t) : we(n, e, 3);\n                };\n          }\n          function Pe(t, n, r, e, o) {\n            t !== n &&\n              ce(\n                n,\n                function (i, u) {\n                  if ((o || (o = new Fr()), Hu(i)))\n                    !(function (t, n, r, e, o, i, u) {\n                      var c = bi(t, r),\n                        a = bi(n, r),\n                        s = u.get(a);\n                      if (s) return void Br(t, r, s);\n                      var f = i ? i(c, a, r + \"\", t, n, u) : void 0,\n                        l = void 0 === f;\n                      if (l) {\n                        var p = Du(a),\n                          h = !p && Fu(a),\n                          v = !p && !h && Qu(a);\n                        (f = a),\n                          p || h || v\n                            ? Du(c)\n                              ? (f = c)\n                              : zu(c)\n                                ? (f = bo(c))\n                                : h\n                                  ? ((l = !1), (f = po(a, !0)))\n                                  : v\n                                    ? ((l = !1), (f = vo(a, !0)))\n                                    : (f = [])\n                            : Zu(a) || Ru(a)\n                              ? ((f = c),\n                                Ru(c)\n                                  ? (f = cc(c))\n                                  : (Hu(c) && !Mu(c)) || (f = ui(a)))\n                              : (l = !1);\n                      }\n                      l && (u.set(a, f), o(f, a, e, i, u), u.delete(a));\n                      Br(t, r, f);\n                    })(t, n, u, r, Pe, e, o);\n                  else {\n                    var c = e ? e(bi(t, u), i, u + \"\", t, n, o) : void 0;\n                    void 0 === c && (c = i), Br(t, u, c);\n                  }\n                },\n                xc,\n              );\n          }\n          function ke(t, n) {\n            var r = t.length;\n            if (r) return ai((n += n < 0 ? r : 0), r) ? t[n] : void 0;\n          }\n          function Re(t, n, r) {\n            var e = -1;\n            return (\n              (n = dn(n.length ? n : [Gc], kn(Yo()))),\n              (function (t, n) {\n                var r = t.length;\n                for (t.sort(n); r--; ) t[r] = t[r].value;\n                return t;\n              })(\n                Te(t, function (t, r, o) {\n                  return {\n                    criteria: dn(n, function (n) {\n                      return n(t);\n                    }),\n                    index: ++e,\n                    value: t,\n                  };\n                }),\n                function (t, n) {\n                  return (function (t, n, r) {\n                    var e = -1,\n                      o = t.criteria,\n                      i = n.criteria,\n                      u = o.length,\n                      c = r.length;\n                    for (; ++e < u; ) {\n                      var a = yo(o[e], i[e]);\n                      if (a) {\n                        if (e >= c) return a;\n                        var s = r[e];\n                        return a * (\"desc\" == s ? -1 : 1);\n                      }\n                    }\n                    return t.index - n.index;\n                  })(t, n, r);\n                },\n              )\n            );\n          }\n          function De(t, n, r) {\n            for (var e = -1, o = n.length, i = {}; ++e < o; ) {\n              var u = n[e],\n                c = pe(t, u);\n              r(c, u) && $e(i, ao(u, t), c);\n            }\n            return i;\n          }\n          function Ue(t, n, r, e) {\n            var o = e ? En : jn,\n              i = -1,\n              u = n.length,\n              c = t;\n            for (t === n && (n = bo(n)), r && (c = dn(t, kn(r))); ++i < u; )\n              for (\n                var a = 0, s = n[i], f = r ? r(s) : s;\n                (a = o(c, f, a, e)) > -1;\n\n              )\n                c !== t && Xt.call(c, a, 1), Xt.call(t, a, 1);\n            return t;\n          }\n          function Ne(t, n) {\n            for (var r = t ? n.length : 0, e = r - 1; r--; ) {\n              var o = n[r];\n              if (r == e || o !== i) {\n                var i = o;\n                ai(o) ? Xt.call(t, o, 1) : to(t, o);\n              }\n            }\n            return t;\n          }\n          function ze(t, n) {\n            return t + nr(lr() * (n - t + 1));\n          }\n          function Fe(t, n) {\n            var r = \"\";\n            if (!t || n < 1 || n > 9007199254740991) return r;\n            do {\n              n % 2 && (r += t), (n = nr(n / 2)) && (t += t);\n            } while (n);\n            return r;\n          }\n          function Le(t, n) {\n            return xi(yi(t, n, Gc), t + \"\");\n          }\n          function qe(t) {\n            return qr(Ic(t));\n          }\n          function Me(t, n) {\n            var r = Ic(t);\n            return Si(r, Xr(n, 0, r.length));\n          }\n          function $e(t, n, r, e) {\n            if (!Hu(t)) return t;\n            for (\n              var o = -1, i = (n = ao(n, t)).length, u = i - 1, c = t;\n              null != c && ++o < i;\n\n            ) {\n              var a = Ai(n[o]),\n                s = r;\n              if (o != u) {\n                var f = c[a];\n                void 0 === (s = e ? e(f, a, c) : void 0) &&\n                  (s = Hu(f) ? f : ai(n[o + 1]) ? [] : {});\n              }\n              Hr(c, a, s), (c = c[a]);\n            }\n            return t;\n          }\n          var Be = br\n              ? function (t, n) {\n                  return br.set(t, n), t;\n                }\n              : Gc,\n            He = Tn\n              ? function (t, n) {\n                  return Tn(t, \"toString\", {\n                    configurable: !0,\n                    enumerable: !1,\n                    value: Hc(n),\n                    writable: !0,\n                  });\n                }\n              : Gc;\n          function We(t) {\n            return Si(Ic(t));\n          }\n          function Ve(t, n, r) {\n            var o = -1,\n              i = t.length;\n            n < 0 && (n = -n > i ? 0 : i + n),\n              (r = r > i ? i : r) < 0 && (r += i),\n              (i = n > r ? 0 : (r - n) >>> 0),\n              (n >>>= 0);\n            for (var u = e(i); ++o < i; ) u[o] = t[o + n];\n            return u;\n          }\n          function Ge(t, n) {\n            var r;\n            return (\n              ne(t, function (t, e, o) {\n                return !(r = n(t, e, o));\n              }),\n              !!r\n            );\n          }\n          function Ze(t, n, r) {\n            var e = 0,\n              o = null == t ? e : t.length;\n            if (\"number\" == typeof n && n == n && o <= 2147483647) {\n              for (; e < o; ) {\n                var i = (e + o) >>> 1,\n                  u = t[i];\n                null !== u && !Yu(u) && (r ? u <= n : u < n)\n                  ? (e = i + 1)\n                  : (o = i);\n              }\n              return o;\n            }\n            return Je(t, n, Gc, r);\n          }\n          function Je(t, n, r, e) {\n            n = r(n);\n            for (\n              var o = 0,\n                i = null == t ? 0 : t.length,\n                u = n != n,\n                c = null === n,\n                a = Yu(n),\n                s = void 0 === n;\n              o < i;\n\n            ) {\n              var f = nr((o + i) / 2),\n                l = r(t[f]),\n                p = void 0 !== l,\n                h = null === l,\n                v = l == l,\n                d = Yu(l);\n              if (u) var y = e || v;\n              else\n                y = s\n                  ? v && (e || p)\n                  : c\n                    ? v && p && (e || !h)\n                    : a\n                      ? v && p && !h && (e || !d)\n                      : !h && !d && (e ? l <= n : l < n);\n              y ? (o = f + 1) : (i = f);\n            }\n            return ar(i, 4294967294);\n          }\n          function Xe(t, n) {\n            for (var r = -1, e = t.length, o = 0, i = []; ++r < e; ) {\n              var u = t[r],\n                c = n ? n(u) : u;\n              if (!r || !Iu(c, a)) {\n                var a = c;\n                i[o++] = 0 === u ? 0 : u;\n              }\n            }\n            return i;\n          }\n          function Ke(t) {\n            return \"number\" == typeof t ? t : Yu(t) ? NaN : +t;\n          }\n          function Ye(t) {\n            if (\"string\" == typeof t) return t;\n            if (Du(t)) return dn(t, Ye) + \"\";\n            if (Yu(t)) return Tr ? Tr.call(t) : \"\";\n            var n = t + \"\";\n            return \"0\" == n && 1 / t == -1 / 0 ? \"-0\" : n;\n          }\n          function Qe(t, n, r) {\n            var e = -1,\n              o = hn,\n              i = t.length,\n              u = !0,\n              c = [],\n              a = c;\n            if (r) (u = !1), (o = vn);\n            else if (i >= 200) {\n              var s = n ? null : Lo(t);\n              if (s) return Wn(s);\n              (u = !1), (o = Dn), (a = new zr());\n            } else a = n ? [] : c;\n            t: for (; ++e < i; ) {\n              var f = t[e],\n                l = n ? n(f) : f;\n              if (((f = r || 0 !== f ? f : 0), u && l == l)) {\n                for (var p = a.length; p--; ) if (a[p] === l) continue t;\n                n && a.push(l), c.push(f);\n              } else o(a, l, r) || (a !== c && a.push(l), c.push(f));\n            }\n            return c;\n          }\n          function to(t, n) {\n            return null == (t = _i(t, (n = ao(n, t)))) || delete t[Ai(qi(n))];\n          }\n          function no(t, n, r, e) {\n            return $e(t, n, r(pe(t, n)), e);\n          }\n          function ro(t, n, r, e) {\n            for (\n              var o = t.length, i = e ? o : -1;\n              (e ? i-- : ++i < o) && n(t[i], i, t);\n\n            );\n            return r\n              ? Ve(t, e ? 0 : i, e ? i + 1 : o)\n              : Ve(t, e ? i + 1 : 0, e ? o : i);\n          }\n          function eo(t, n) {\n            var r = t;\n            return (\n              r instanceof Rr && (r = r.value()),\n              _n(\n                n,\n                function (t, n) {\n                  return n.func.apply(n.thisArg, yn([t], n.args));\n                },\n                r,\n              )\n            );\n          }\n          function oo(t, n, r) {\n            var o = t.length;\n            if (o < 2) return o ? Qe(t[0]) : [];\n            for (var i = -1, u = e(o); ++i < o; )\n              for (var c = t[i], a = -1; ++a < o; )\n                a != i && (u[i] = te(u[i] || c, t[a], n, r));\n            return Qe(ue(u, 1), n, r);\n          }\n          function io(t, n, r) {\n            for (var e = -1, o = t.length, i = n.length, u = {}; ++e < o; ) {\n              var c = e < i ? n[e] : void 0;\n              r(u, t[e], c);\n            }\n            return u;\n          }\n          function uo(t) {\n            return zu(t) ? t : [];\n          }\n          function co(t) {\n            return \"function\" == typeof t ? t : Gc;\n          }\n          function ao(t, n) {\n            return Du(t) ? t : fi(t, n) ? [t] : Oi(ac(t));\n          }\n          var so = Le;\n          function fo(t, n, r) {\n            var e = t.length;\n            return (r = void 0 === r ? e : r), !n && r >= e ? t : Ve(t, n, r);\n          }\n          var lo =\n            Kn ||\n            function (t) {\n              return Zt.clearTimeout(t);\n            };\n          function po(t, n) {\n            if (n) return t.slice();\n            var r = t.length,\n              e = Bt ? Bt(r) : new t.constructor(r);\n            return t.copy(e), e;\n          }\n          function ho(t) {\n            var n = new t.constructor(t.byteLength);\n            return new zt(n).set(new zt(t)), n;\n          }\n          function vo(t, n) {\n            var r = n ? ho(t.buffer) : t.buffer;\n            return new t.constructor(r, t.byteOffset, t.length);\n          }\n          function yo(t, n) {\n            if (t !== n) {\n              var r = void 0 !== t,\n                e = null === t,\n                o = t == t,\n                i = Yu(t),\n                u = void 0 !== n,\n                c = null === n,\n                a = n == n,\n                s = Yu(n);\n              if (\n                (!c && !s && !i && t > n) ||\n                (i && u && a && !c && !s) ||\n                (e && u && a) ||\n                (!r && a) ||\n                !o\n              )\n                return 1;\n              if (\n                (!e && !i && !s && t < n) ||\n                (s && r && o && !e && !i) ||\n                (c && r && o) ||\n                (!u && o) ||\n                !a\n              )\n                return -1;\n            }\n            return 0;\n          }\n          function _o(t, n, r, o) {\n            for (\n              var i = -1,\n                u = t.length,\n                c = r.length,\n                a = -1,\n                s = n.length,\n                f = cr(u - c, 0),\n                l = e(s + f),\n                p = !o;\n              ++a < s;\n\n            )\n              l[a] = n[a];\n            for (; ++i < c; ) (p || i < u) && (l[r[i]] = t[i]);\n            for (; f--; ) l[a++] = t[i++];\n            return l;\n          }\n          function go(t, n, r, o) {\n            for (\n              var i = -1,\n                u = t.length,\n                c = -1,\n                a = r.length,\n                s = -1,\n                f = n.length,\n                l = cr(u - a, 0),\n                p = e(l + f),\n                h = !o;\n              ++i < l;\n\n            )\n              p[i] = t[i];\n            for (var v = i; ++s < f; ) p[v + s] = n[s];\n            for (; ++c < a; ) (h || i < u) && (p[v + r[c]] = t[i++]);\n            return p;\n          }\n          function bo(t, n) {\n            var r = -1,\n              o = t.length;\n            for (n || (n = e(o)); ++r < o; ) n[r] = t[r];\n            return n;\n          }\n          function mo(t, n, r, e) {\n            var o = !r;\n            r || (r = {});\n            for (var i = -1, u = n.length; ++i < u; ) {\n              var c = n[i],\n                a = e ? e(r[c], t[c], c, r, t) : void 0;\n              void 0 === a && (a = t[c]), o ? Zr(r, c, a) : Hr(r, c, a);\n            }\n            return r;\n          }\n          function wo(t, n) {\n            return function (r, e) {\n              var o = Du(r) ? an : Vr,\n                i = n ? n() : {};\n              return o(r, t, Yo(e, 2), i);\n            };\n          }\n          function xo(t) {\n            return Le(function (n, r) {\n              var e = -1,\n                o = r.length,\n                i = o > 1 ? r[o - 1] : void 0,\n                u = o > 2 ? r[2] : void 0;\n              for (\n                i = t.length > 3 && \"function\" == typeof i ? (o--, i) : void 0,\n                  u && si(r[0], r[1], u) && ((i = o < 3 ? void 0 : i), (o = 1)),\n                  n = yt(n);\n                ++e < o;\n\n              ) {\n                var c = r[e];\n                c && t(n, c, e, i);\n              }\n              return n;\n            });\n          }\n          function jo(t, n) {\n            return function (r, e) {\n              if (null == r) return r;\n              if (!Nu(r)) return t(r, e);\n              for (\n                var o = r.length, i = n ? o : -1, u = yt(r);\n                (n ? i-- : ++i < o) && !1 !== e(u[i], i, u);\n\n              );\n              return r;\n            };\n          }\n          function Eo(t) {\n            return function (n, r, e) {\n              for (var o = -1, i = yt(n), u = e(n), c = u.length; c--; ) {\n                var a = u[t ? c : ++o];\n                if (!1 === r(i[a], a, i)) break;\n              }\n              return n;\n            };\n          }\n          function So(t) {\n            return function (n) {\n              var r = Mn((n = ac(n))) ? Zn(n) : void 0,\n                e = r ? r[0] : n.charAt(0),\n                o = r ? fo(r, 1).join(\"\") : n.slice(1);\n              return e[t]() + o;\n            };\n          }\n          function Oo(t) {\n            return function (n) {\n              return _n(Mc(Rc(n).replace(Rt, \"\")), t, \"\");\n            };\n          }\n          function Ao(t) {\n            return function () {\n              var n = arguments;\n              switch (n.length) {\n                case 0:\n                  return new t();\n                case 1:\n                  return new t(n[0]);\n                case 2:\n                  return new t(n[0], n[1]);\n                case 3:\n                  return new t(n[0], n[1], n[2]);\n                case 4:\n                  return new t(n[0], n[1], n[2], n[3]);\n                case 5:\n                  return new t(n[0], n[1], n[2], n[3], n[4]);\n                case 6:\n                  return new t(n[0], n[1], n[2], n[3], n[4], n[5]);\n                case 7:\n                  return new t(n[0], n[1], n[2], n[3], n[4], n[5], n[6]);\n              }\n              var r = Ir(t.prototype),\n                e = t.apply(r, n);\n              return Hu(e) ? e : r;\n            };\n          }\n          function To(t) {\n            return function (n, r, e) {\n              var o = yt(n);\n              if (!Nu(n)) {\n                var i = Yo(r, 3);\n                (n = wc(n)),\n                  (r = function (t) {\n                    return i(o[t], t, o);\n                  });\n              }\n              var u = t(n, r, e);\n              return u > -1 ? o[i ? n[u] : u] : void 0;\n            };\n          }\n          function Co(t) {\n            return Vo(function (n) {\n              var r = n.length,\n                e = r,\n                o = kr.prototype.thru;\n              for (t && n.reverse(); e--; ) {\n                var i = n[e];\n                if (\"function\" != typeof i) throw new bt(u);\n                if (o && !c && \"wrapper\" == Xo(i)) var c = new kr([], !0);\n              }\n              for (e = c ? e : r; ++e < r; ) {\n                var a = Xo((i = n[e])),\n                  s = \"wrapper\" == a ? Jo(i) : void 0;\n                c =\n                  s && li(s[0]) && 424 == s[1] && !s[4].length && 1 == s[9]\n                    ? c[Xo(s[0])].apply(c, s[3])\n                    : 1 == i.length && li(i)\n                      ? c[a]()\n                      : c.thru(i);\n              }\n              return function () {\n                var t = arguments,\n                  e = t[0];\n                if (c && 1 == t.length && Du(e)) return c.plant(e).value();\n                for (var o = 0, i = r ? n[o].apply(this, t) : e; ++o < r; )\n                  i = n[o].call(this, i);\n                return i;\n              };\n            });\n          }\n          function Io(t, n, r, o, i, u, c, a, s, f) {\n            var l = 128 & n,\n              p = 1 & n,\n              h = 2 & n,\n              v = 24 & n,\n              d = 512 & n,\n              y = h ? void 0 : Ao(t);\n            return function _() {\n              for (var g = arguments.length, b = e(g), m = g; m--; )\n                b[m] = arguments[m];\n              if (v)\n                var w = Ko(_),\n                  x = zn(b, w);\n              if (\n                (o && (b = _o(b, o, i, v)),\n                u && (b = go(b, u, c, v)),\n                (g -= x),\n                v && g < f)\n              ) {\n                var j = Hn(b, w);\n                return zo(t, n, Io, _.placeholder, r, b, j, a, s, f - g);\n              }\n              var E = p ? r : this,\n                S = h ? E[t] : t;\n              return (\n                (g = b.length),\n                a ? (b = gi(b, a)) : d && g > 1 && b.reverse(),\n                l && s < g && (b.length = s),\n                this && this !== Zt && this instanceof _ && (S = y || Ao(S)),\n                S.apply(E, b)\n              );\n            };\n          }\n          function Po(t, n) {\n            return function (r, e) {\n              return (function (t, n, r, e) {\n                return (\n                  se(t, function (t, o, i) {\n                    n(e, r(t), o, i);\n                  }),\n                  e\n                );\n              })(r, t, n(e), {});\n            };\n          }\n          function ko(t, n) {\n            return function (r, e) {\n              var o;\n              if (void 0 === r && void 0 === e) return n;\n              if ((void 0 !== r && (o = r), void 0 !== e)) {\n                if (void 0 === o) return e;\n                \"string\" == typeof r || \"string\" == typeof e\n                  ? ((r = Ye(r)), (e = Ye(e)))\n                  : ((r = Ke(r)), (e = Ke(e))),\n                  (o = t(r, e));\n              }\n              return o;\n            };\n          }\n          function Ro(t) {\n            return Vo(function (n) {\n              return (\n                (n = dn(n, kn(Yo()))),\n                Le(function (r) {\n                  var e = this;\n                  return t(n, function (t) {\n                    return cn(t, e, r);\n                  });\n                })\n              );\n            });\n          }\n          function Do(t, n) {\n            var r = (n = void 0 === n ? \" \" : Ye(n)).length;\n            if (r < 2) return r ? Fe(n, t) : n;\n            var e = Fe(n, tr(t / Gn(n)));\n            return Mn(n) ? fo(Zn(e), 0, t).join(\"\") : e.slice(0, t);\n          }\n          function Uo(t) {\n            return function (n, r, o) {\n              return (\n                o && \"number\" != typeof o && si(n, r, o) && (r = o = void 0),\n                (n = ec(n)),\n                void 0 === r ? ((r = n), (n = 0)) : (r = ec(r)),\n                (function (t, n, r, o) {\n                  for (\n                    var i = -1, u = cr(tr((n - t) / (r || 1)), 0), c = e(u);\n                    u--;\n\n                  )\n                    (c[o ? u : ++i] = t), (t += r);\n                  return c;\n                })(n, r, (o = void 0 === o ? (n < r ? 1 : -1) : ec(o)), t)\n              );\n            };\n          }\n          function No(t) {\n            return function (n, r) {\n              return (\n                (\"string\" == typeof n && \"string\" == typeof r) ||\n                  ((n = uc(n)), (r = uc(r))),\n                t(n, r)\n              );\n            };\n          }\n          function zo(t, n, r, e, o, i, u, c, a, s) {\n            var f = 8 & n;\n            (n |= f ? 32 : 64), 4 & (n &= ~(f ? 64 : 32)) || (n &= -4);\n            var l = [\n                t,\n                n,\n                o,\n                f ? i : void 0,\n                f ? u : void 0,\n                f ? void 0 : i,\n                f ? void 0 : u,\n                c,\n                a,\n                s,\n              ],\n              p = r.apply(void 0, l);\n            return li(t) && mi(p, l), (p.placeholder = e), ji(p, t, n);\n          }\n          function Fo(t) {\n            var n = dt[t];\n            return function (t, r) {\n              if (\n                ((t = uc(t)), (r = null == r ? 0 : ar(oc(r), 292)) && or(t))\n              ) {\n                var e = (ac(t) + \"e\").split(\"e\");\n                return +(\n                  (e = (ac(n(e[0] + \"e\" + (+e[1] + r))) + \"e\").split(\"e\"))[0] +\n                  \"e\" +\n                  (+e[1] - r)\n                );\n              }\n              return n(t);\n            };\n          }\n          var Lo =\n            yr && 1 / Wn(new yr([, -0]))[1] == 1 / 0\n              ? function (t) {\n                  return new yr(t);\n                }\n              : Yc;\n          function qo(t) {\n            return function (n) {\n              var r = oi(n);\n              return r == y\n                ? $n(n)\n                : r == m\n                  ? Vn(n)\n                  : (function (t, n) {\n                      return dn(n, function (n) {\n                        return [n, t[n]];\n                      });\n                    })(n, t(n));\n            };\n          }\n          function Mo(t, n, r, o, i, a, s, f) {\n            var l = 2 & n;\n            if (!l && \"function\" != typeof t) throw new bt(u);\n            var p = o ? o.length : 0;\n            if (\n              (p || ((n &= -97), (o = i = void 0)),\n              (s = void 0 === s ? s : cr(oc(s), 0)),\n              (f = void 0 === f ? f : oc(f)),\n              (p -= i ? i.length : 0),\n              64 & n)\n            ) {\n              var h = o,\n                v = i;\n              o = i = void 0;\n            }\n            var d = l ? void 0 : Jo(t),\n              y = [t, n, r, o, i, h, v, a, s, f];\n            if (\n              (d &&\n                (function (t, n) {\n                  var r = t[1],\n                    e = n[1],\n                    o = r | e,\n                    i = o < 131,\n                    u =\n                      (128 == e && 8 == r) ||\n                      (128 == e && 256 == r && t[7].length <= n[8]) ||\n                      (384 == e && n[7].length <= n[8] && 8 == r);\n                  if (!i && !u) return t;\n                  1 & e && ((t[2] = n[2]), (o |= 1 & r ? 0 : 4));\n                  var a = n[3];\n                  if (a) {\n                    var s = t[3];\n                    (t[3] = s ? _o(s, a, n[4]) : a),\n                      (t[4] = s ? Hn(t[3], c) : n[4]);\n                  }\n                  (a = n[5]) &&\n                    ((s = t[5]),\n                    (t[5] = s ? go(s, a, n[6]) : a),\n                    (t[6] = s ? Hn(t[5], c) : n[6]));\n                  (a = n[7]) && (t[7] = a);\n                  128 & e && (t[8] = null == t[8] ? n[8] : ar(t[8], n[8]));\n                  null == t[9] && (t[9] = n[9]);\n                  (t[0] = n[0]), (t[1] = o);\n                })(y, d),\n              (t = y[0]),\n              (n = y[1]),\n              (r = y[2]),\n              (o = y[3]),\n              (i = y[4]),\n              !(f = y[9] =\n                void 0 === y[9] ? (l ? 0 : t.length) : cr(y[9] - p, 0)) &&\n                24 & n &&\n                (n &= -25),\n              n && 1 != n)\n            )\n              _ =\n                8 == n || 16 == n\n                  ? (function (t, n, r) {\n                      var o = Ao(t);\n                      return function i() {\n                        for (\n                          var u = arguments.length, c = e(u), a = u, s = Ko(i);\n                          a--;\n\n                        )\n                          c[a] = arguments[a];\n                        var f =\n                          u < 3 && c[0] !== s && c[u - 1] !== s ? [] : Hn(c, s);\n                        if ((u -= f.length) < r)\n                          return zo(\n                            t,\n                            n,\n                            Io,\n                            i.placeholder,\n                            void 0,\n                            c,\n                            f,\n                            void 0,\n                            void 0,\n                            r - u,\n                          );\n                        var l =\n                          this && this !== Zt && this instanceof i ? o : t;\n                        return cn(l, this, c);\n                      };\n                    })(t, n, f)\n                  : (32 != n && 33 != n) || i.length\n                    ? Io.apply(void 0, y)\n                    : (function (t, n, r, o) {\n                        var i = 1 & n,\n                          u = Ao(t);\n                        return function n() {\n                          for (\n                            var c = -1,\n                              a = arguments.length,\n                              s = -1,\n                              f = o.length,\n                              l = e(f + a),\n                              p =\n                                this && this !== Zt && this instanceof n\n                                  ? u\n                                  : t;\n                            ++s < f;\n\n                          )\n                            l[s] = o[s];\n                          for (; a--; ) l[s++] = arguments[++c];\n                          return cn(p, i ? r : this, l);\n                        };\n                      })(t, n, r, o);\n            else\n              var _ = (function (t, n, r) {\n                var e = 1 & n,\n                  o = Ao(t);\n                return function n() {\n                  var i = this && this !== Zt && this instanceof n ? o : t;\n                  return i.apply(e ? r : this, arguments);\n                };\n              })(t, n, r);\n            return ji((d ? Be : mi)(_, y), t, n);\n          }\n          function $o(t, n, r, e) {\n            return void 0 === t || (Iu(t, xt[r]) && !St.call(e, r)) ? n : t;\n          }\n          function Bo(t, n, r, e, o, i) {\n            return (\n              Hu(t) &&\n                Hu(n) &&\n                (i.set(n, t), Pe(t, n, void 0, Bo, i), i.delete(n)),\n              t\n            );\n          }\n          function Ho(t) {\n            return Zu(t) ? void 0 : t;\n          }\n          function Wo(t, n, r, e, o, i) {\n            var u = 1 & r,\n              c = t.length,\n              a = n.length;\n            if (c != a && !(u && a > c)) return !1;\n            var s = i.get(t);\n            if (s && i.get(n)) return s == n;\n            var f = -1,\n              l = !0,\n              p = 2 & r ? new zr() : void 0;\n            for (i.set(t, n), i.set(n, t); ++f < c; ) {\n              var h = t[f],\n                v = n[f];\n              if (e) var d = u ? e(v, h, f, n, t, i) : e(h, v, f, t, n, i);\n              if (void 0 !== d) {\n                if (d) continue;\n                l = !1;\n                break;\n              }\n              if (p) {\n                if (\n                  !bn(n, function (t, n) {\n                    if (!Dn(p, n) && (h === t || o(h, t, r, e, i)))\n                      return p.push(n);\n                  })\n                ) {\n                  l = !1;\n                  break;\n                }\n              } else if (h !== v && !o(h, v, r, e, i)) {\n                l = !1;\n                break;\n              }\n            }\n            return i.delete(t), i.delete(n), l;\n          }\n          function Vo(t) {\n            return xi(yi(t, void 0, Ui), t + \"\");\n          }\n          function Go(t) {\n            return he(t, wc, ri);\n          }\n          function Zo(t) {\n            return he(t, xc, ei);\n          }\n          var Jo = br\n            ? function (t) {\n                return br.get(t);\n              }\n            : Yc;\n          function Xo(t) {\n            for (\n              var n = t.name + \"\", r = mr[n], e = St.call(mr, n) ? r.length : 0;\n              e--;\n\n            ) {\n              var o = r[e],\n                i = o.func;\n              if (null == i || i == t) return o.name;\n            }\n            return n;\n          }\n          function Ko(t) {\n            return (St.call(Cr, \"placeholder\") ? Cr : t).placeholder;\n          }\n          function Yo() {\n            var t = Cr.iteratee || Zc;\n            return (\n              (t = t === Zc ? Ee : t),\n              arguments.length ? t(arguments[0], arguments[1]) : t\n            );\n          }\n          function Qo(t, n) {\n            var r,\n              e,\n              o = t.__data__;\n            return (\n              \"string\" == (e = i((r = n))) ||\n              \"number\" == e ||\n              \"symbol\" == e ||\n              \"boolean\" == e\n                ? \"__proto__\" !== r\n                : null === r\n            )\n              ? o[\"string\" == typeof n ? \"string\" : \"hash\"]\n              : o.map;\n          }\n          function ti(t) {\n            for (var n = wc(t), r = n.length; r--; ) {\n              var e = n[r],\n                o = t[e];\n              n[r] = [e, o, vi(o)];\n            }\n            return n;\n          }\n          function ni(t, n) {\n            var r = (function (t, n) {\n              return null == t ? void 0 : t[n];\n            })(t, n);\n            return je(r) ? r : void 0;\n          }\n          var ri = rr\n              ? function (t) {\n                  return null == t\n                    ? []\n                    : ((t = yt(t)),\n                      pn(rr(t), function (n) {\n                        return Jt.call(t, n);\n                      }));\n                }\n              : ia,\n            ei = rr\n              ? function (t) {\n                  for (var n = []; t; ) yn(n, ri(t)), (t = Vt(t));\n                  return n;\n                }\n              : ia,\n            oi = ve;\n          function ii(t, n, r) {\n            for (var e = -1, o = (n = ao(n, t)).length, i = !1; ++e < o; ) {\n              var u = Ai(n[e]);\n              if (!(i = null != t && r(t, u))) break;\n              t = t[u];\n            }\n            return i || ++e != o\n              ? i\n              : !!(o = null == t ? 0 : t.length) &&\n                  Bu(o) &&\n                  ai(u, o) &&\n                  (Du(t) || Ru(t));\n          }\n          function ui(t) {\n            return \"function\" != typeof t.constructor || hi(t) ? {} : Ir(Vt(t));\n          }\n          function ci(t) {\n            return Du(t) || Ru(t) || !!(Yt && t && t[Yt]);\n          }\n          function ai(t, n) {\n            var r = i(t);\n            return (\n              !!(n = null == n ? 9007199254740991 : n) &&\n              (\"number\" == r || (\"symbol\" != r && st.test(t))) &&\n              t > -1 &&\n              t % 1 == 0 &&\n              t < n\n            );\n          }\n          function si(t, n, r) {\n            if (!Hu(r)) return !1;\n            var e = i(n);\n            return (\n              !!(\"number\" == e\n                ? Nu(r) && ai(n, r.length)\n                : \"string\" == e && n in r) && Iu(r[n], t)\n            );\n          }\n          function fi(t, n) {\n            if (Du(t)) return !1;\n            var r = i(t);\n            return (\n              !(\n                \"number\" != r &&\n                \"symbol\" != r &&\n                \"boolean\" != r &&\n                null != t &&\n                !Yu(t)\n              ) ||\n              W.test(t) ||\n              !H.test(t) ||\n              (null != n && t in yt(n))\n            );\n          }\n          function li(t) {\n            var n = Xo(t),\n              r = Cr[n];\n            if (\"function\" != typeof r || !(n in Rr.prototype)) return !1;\n            if (t === r) return !0;\n            var e = Jo(r);\n            return !!e && t === e[0];\n          }\n          ((hr && oi(new hr(new ArrayBuffer(1))) != S) ||\n            (vr && oi(new vr()) != y) ||\n            (dr && \"[object Promise]\" != oi(dr.resolve())) ||\n            (yr && oi(new yr()) != m) ||\n            (_r && oi(new _r()) != j)) &&\n            (oi = function (t) {\n              var n = ve(t),\n                r = n == g ? t.constructor : void 0,\n                e = r ? Ti(r) : \"\";\n              if (e)\n                switch (e) {\n                  case wr:\n                    return S;\n                  case xr:\n                    return y;\n                  case jr:\n                    return \"[object Promise]\";\n                  case Er:\n                    return m;\n                  case Sr:\n                    return j;\n                }\n              return n;\n            });\n          var pi = jt ? Mu : ua;\n          function hi(t) {\n            var n = t && t.constructor;\n            return t === ((\"function\" == typeof n && n.prototype) || xt);\n          }\n          function vi(t) {\n            return t == t && !Hu(t);\n          }\n          function di(t, n) {\n            return function (r) {\n              return null != r && r[t] === n && (void 0 !== n || t in yt(r));\n            };\n          }\n          function yi(t, n, r) {\n            return (\n              (n = cr(void 0 === n ? t.length - 1 : n, 0)),\n              function () {\n                for (\n                  var o = arguments, i = -1, u = cr(o.length - n, 0), c = e(u);\n                  ++i < u;\n\n                )\n                  c[i] = o[n + i];\n                i = -1;\n                for (var a = e(n + 1); ++i < n; ) a[i] = o[i];\n                return (a[n] = r(c)), cn(t, this, a);\n              }\n            );\n          }\n          function _i(t, n) {\n            return n.length < 2 ? t : pe(t, Ve(n, 0, -1));\n          }\n          function gi(t, n) {\n            for (var r = t.length, e = ar(n.length, r), o = bo(t); e--; ) {\n              var i = n[e];\n              t[e] = ai(i, r) ? o[i] : void 0;\n            }\n            return t;\n          }\n          function bi(t, n) {\n            if (\n              (\"constructor\" !== n || \"function\" != typeof t[n]) &&\n              \"__proto__\" != n\n            )\n              return t[n];\n          }\n          var mi = Ei(Be),\n            wi =\n              Qn ||\n              function (t, n) {\n                return Zt.setTimeout(t, n);\n              },\n            xi = Ei(He);\n          function ji(t, n, r) {\n            var e = n + \"\";\n            return xi(\n              t,\n              (function (t, n) {\n                var r = n.length;\n                if (!r) return t;\n                var e = r - 1;\n                return (\n                  (n[e] = (r > 1 ? \"& \" : \"\") + n[e]),\n                  (n = n.join(r > 2 ? \", \" : \" \")),\n                  t.replace(Y, \"{\\n/* [wrapped with \" + n + \"] */\\n\")\n                );\n              })(\n                e,\n                (function (t, n) {\n                  return (\n                    sn(a, function (r) {\n                      var e = \"_.\" + r[0];\n                      n & r[1] && !hn(t, e) && t.push(e);\n                    }),\n                    t.sort()\n                  );\n                })(\n                  (function (t) {\n                    var n = t.match(Q);\n                    return n ? n[1].split(tt) : [];\n                  })(e),\n                  r,\n                ),\n              ),\n            );\n          }\n          function Ei(t) {\n            var n = 0,\n              r = 0;\n            return function () {\n              var e = sr(),\n                o = 16 - (e - r);\n              if (((r = e), o > 0)) {\n                if (++n >= 800) return arguments[0];\n              } else n = 0;\n              return t.apply(void 0, arguments);\n            };\n          }\n          function Si(t, n) {\n            var r = -1,\n              e = t.length,\n              o = e - 1;\n            for (n = void 0 === n ? e : n; ++r < n; ) {\n              var i = ze(r, o),\n                u = t[i];\n              (t[i] = t[r]), (t[r] = u);\n            }\n            return (t.length = n), t;\n          }\n          var Oi = (function (t) {\n            var n = Eu(t, function (t) {\n                return 500 === r.size && r.clear(), t;\n              }),\n              r = n.cache;\n            return n;\n          })(function (t) {\n            var n = [];\n            return (\n              46 === t.charCodeAt(0) && n.push(\"\"),\n              t.replace(V, function (t, r, e, o) {\n                n.push(e ? o.replace(rt, \"$1\") : r || t);\n              }),\n              n\n            );\n          });\n          function Ai(t) {\n            if (\"string\" == typeof t || Yu(t)) return t;\n            var n = t + \"\";\n            return \"0\" == n && 1 / t == -1 / 0 ? \"-0\" : n;\n          }\n          function Ti(t) {\n            if (null != t) {\n              try {\n                return Et.call(t);\n              } catch (t) {}\n              try {\n                return t + \"\";\n              } catch (t) {}\n            }\n            return \"\";\n          }\n          function Ci(t) {\n            if (t instanceof Rr) return t.clone();\n            var n = new kr(t.__wrapped__, t.__chain__);\n            return (\n              (n.__actions__ = bo(t.__actions__)),\n              (n.__index__ = t.__index__),\n              (n.__values__ = t.__values__),\n              n\n            );\n          }\n          var Ii = Le(function (t, n) {\n              return zu(t) ? te(t, ue(n, 1, zu, !0)) : [];\n            }),\n            Pi = Le(function (t, n) {\n              var r = qi(n);\n              return (\n                zu(r) && (r = void 0),\n                zu(t) ? te(t, ue(n, 1, zu, !0), Yo(r, 2)) : []\n              );\n            }),\n            ki = Le(function (t, n) {\n              var r = qi(n);\n              return (\n                zu(r) && (r = void 0),\n                zu(t) ? te(t, ue(n, 1, zu, !0), void 0, r) : []\n              );\n            });\n          function Ri(t, n, r) {\n            var e = null == t ? 0 : t.length;\n            if (!e) return -1;\n            var o = null == r ? 0 : oc(r);\n            return o < 0 && (o = cr(e + o, 0)), xn(t, Yo(n, 3), o);\n          }\n          function Di(t, n, r) {\n            var e = null == t ? 0 : t.length;\n            if (!e) return -1;\n            var o = e - 1;\n            return (\n              void 0 !== r &&\n                ((o = oc(r)), (o = r < 0 ? cr(e + o, 0) : ar(o, e - 1))),\n              xn(t, Yo(n, 3), o, !0)\n            );\n          }\n          function Ui(t) {\n            return (null == t ? 0 : t.length) ? ue(t, 1) : [];\n          }\n          function Ni(t) {\n            return t && t.length ? t[0] : void 0;\n          }\n          var zi = Le(function (t) {\n              var n = dn(t, uo);\n              return n.length && n[0] === t[0] ? ge(n) : [];\n            }),\n            Fi = Le(function (t) {\n              var n = qi(t),\n                r = dn(t, uo);\n              return (\n                n === qi(r) ? (n = void 0) : r.pop(),\n                r.length && r[0] === t[0] ? ge(r, Yo(n, 2)) : []\n              );\n            }),\n            Li = Le(function (t) {\n              var n = qi(t),\n                r = dn(t, uo);\n              return (\n                (n = \"function\" == typeof n ? n : void 0) && r.pop(),\n                r.length && r[0] === t[0] ? ge(r, void 0, n) : []\n              );\n            });\n          function qi(t) {\n            var n = null == t ? 0 : t.length;\n            return n ? t[n - 1] : void 0;\n          }\n          var Mi = Le($i);\n          function $i(t, n) {\n            return t && t.length && n && n.length ? Ue(t, n) : t;\n          }\n          var Bi = Vo(function (t, n) {\n            var r = null == t ? 0 : t.length,\n              e = Jr(t, n);\n            return (\n              Ne(\n                t,\n                dn(n, function (t) {\n                  return ai(t, r) ? +t : t;\n                }).sort(yo),\n              ),\n              e\n            );\n          });\n          function Hi(t) {\n            return null == t ? t : pr.call(t);\n          }\n          var Wi = Le(function (t) {\n              return Qe(ue(t, 1, zu, !0));\n            }),\n            Vi = Le(function (t) {\n              var n = qi(t);\n              return zu(n) && (n = void 0), Qe(ue(t, 1, zu, !0), Yo(n, 2));\n            }),\n            Gi = Le(function (t) {\n              var n = qi(t);\n              return (\n                (n = \"function\" == typeof n ? n : void 0),\n                Qe(ue(t, 1, zu, !0), void 0, n)\n              );\n            });\n          function Zi(t) {\n            if (!t || !t.length) return [];\n            var n = 0;\n            return (\n              (t = pn(t, function (t) {\n                if (zu(t)) return (n = cr(t.length, n)), !0;\n              })),\n              Pn(n, function (n) {\n                return dn(t, An(n));\n              })\n            );\n          }\n          function Ji(t, n) {\n            if (!t || !t.length) return [];\n            var r = Zi(t);\n            return null == n\n              ? r\n              : dn(r, function (t) {\n                  return cn(n, void 0, t);\n                });\n          }\n          var Xi = Le(function (t, n) {\n              return zu(t) ? te(t, n) : [];\n            }),\n            Ki = Le(function (t) {\n              return oo(pn(t, zu));\n            }),\n            Yi = Le(function (t) {\n              var n = qi(t);\n              return zu(n) && (n = void 0), oo(pn(t, zu), Yo(n, 2));\n            }),\n            Qi = Le(function (t) {\n              var n = qi(t);\n              return (\n                (n = \"function\" == typeof n ? n : void 0),\n                oo(pn(t, zu), void 0, n)\n              );\n            }),\n            tu = Le(Zi);\n          var nu = Le(function (t) {\n            var n = t.length,\n              r = n > 1 ? t[n - 1] : void 0;\n            return (\n              (r = \"function\" == typeof r ? (t.pop(), r) : void 0), Ji(t, r)\n            );\n          });\n          function ru(t) {\n            var n = Cr(t);\n            return (n.__chain__ = !0), n;\n          }\n          function eu(t, n) {\n            return n(t);\n          }\n          var ou = Vo(function (t) {\n            var n = t.length,\n              r = n ? t[0] : 0,\n              e = this.__wrapped__,\n              o = function (n) {\n                return Jr(n, t);\n              };\n            return !(n > 1 || this.__actions__.length) &&\n              e instanceof Rr &&\n              ai(r)\n              ? ((e = e.slice(r, +r + (n ? 1 : 0))).__actions__.push({\n                  func: eu,\n                  args: [o],\n                  thisArg: void 0,\n                }),\n                new kr(e, this.__chain__).thru(function (t) {\n                  return n && !t.length && t.push(void 0), t;\n                }))\n              : this.thru(o);\n          });\n          var iu = wo(function (t, n, r) {\n            St.call(t, r) ? ++t[r] : Zr(t, r, 1);\n          });\n          var uu = To(Ri),\n            cu = To(Di);\n          function au(t, n) {\n            return (Du(t) ? sn : ne)(t, Yo(n, 3));\n          }\n          function su(t, n) {\n            return (Du(t) ? fn : re)(t, Yo(n, 3));\n          }\n          var fu = wo(function (t, n, r) {\n            St.call(t, r) ? t[r].push(n) : Zr(t, r, [n]);\n          });\n          var lu = Le(function (t, n, r) {\n              var o = -1,\n                i = \"function\" == typeof n,\n                u = Nu(t) ? e(t.length) : [];\n              return (\n                ne(t, function (t) {\n                  u[++o] = i ? cn(n, t, r) : be(t, n, r);\n                }),\n                u\n              );\n            }),\n            pu = wo(function (t, n, r) {\n              Zr(t, r, n);\n            });\n          function hu(t, n) {\n            return (Du(t) ? dn : Te)(t, Yo(n, 3));\n          }\n          var vu = wo(\n            function (t, n, r) {\n              t[r ? 0 : 1].push(n);\n            },\n            function () {\n              return [[], []];\n            },\n          );\n          var du = Le(function (t, n) {\n              if (null == t) return [];\n              var r = n.length;\n              return (\n                r > 1 && si(t, n[0], n[1])\n                  ? (n = [])\n                  : r > 2 && si(n[0], n[1], n[2]) && (n = [n[0]]),\n                Re(t, ue(n, 1), [])\n              );\n            }),\n            yu =\n              Yn ||\n              function () {\n                return Zt.Date.now();\n              };\n          function _u(t, n, r) {\n            return (\n              (n = r ? void 0 : n),\n              Mo(\n                t,\n                128,\n                void 0,\n                void 0,\n                void 0,\n                void 0,\n                (n = t && null == n ? t.length : n),\n              )\n            );\n          }\n          function gu(t, n) {\n            var r;\n            if (\"function\" != typeof n) throw new bt(u);\n            return (\n              (t = oc(t)),\n              function () {\n                return (\n                  --t > 0 && (r = n.apply(this, arguments)),\n                  t <= 1 && (n = void 0),\n                  r\n                );\n              }\n            );\n          }\n          var bu = Le(function (t, n, r) {\n              var e = 1;\n              if (r.length) {\n                var o = Hn(r, Ko(bu));\n                e |= 32;\n              }\n              return Mo(t, e, n, r, o);\n            }),\n            mu = Le(function (t, n, r) {\n              var e = 3;\n              if (r.length) {\n                var o = Hn(r, Ko(mu));\n                e |= 32;\n              }\n              return Mo(n, e, t, r, o);\n            });\n          function wu(t, n, r) {\n            var e,\n              o,\n              i,\n              c,\n              a,\n              s,\n              f = 0,\n              l = !1,\n              p = !1,\n              h = !0;\n            if (\"function\" != typeof t) throw new bt(u);\n            function v(n) {\n              var r = e,\n                i = o;\n              return (e = o = void 0), (f = n), (c = t.apply(i, r));\n            }\n            function d(t) {\n              return (f = t), (a = wi(_, n)), l ? v(t) : c;\n            }\n            function y(t) {\n              var r = t - s;\n              return void 0 === s || r >= n || r < 0 || (p && t - f >= i);\n            }\n            function _() {\n              var t = yu();\n              if (y(t)) return g(t);\n              a = wi(\n                _,\n                (function (t) {\n                  var r = n - (t - s);\n                  return p ? ar(r, i - (t - f)) : r;\n                })(t),\n              );\n            }\n            function g(t) {\n              return (a = void 0), h && e ? v(t) : ((e = o = void 0), c);\n            }\n            function b() {\n              var t = yu(),\n                r = y(t);\n              if (((e = arguments), (o = this), (s = t), r)) {\n                if (void 0 === a) return d(s);\n                if (p) return lo(a), (a = wi(_, n)), v(s);\n              }\n              return void 0 === a && (a = wi(_, n)), c;\n            }\n            return (\n              (n = uc(n) || 0),\n              Hu(r) &&\n                ((l = !!r.leading),\n                (i = (p = \"maxWait\" in r) ? cr(uc(r.maxWait) || 0, n) : i),\n                (h = \"trailing\" in r ? !!r.trailing : h)),\n              (b.cancel = function () {\n                void 0 !== a && lo(a), (f = 0), (e = s = o = a = void 0);\n              }),\n              (b.flush = function () {\n                return void 0 === a ? c : g(yu());\n              }),\n              b\n            );\n          }\n          var xu = Le(function (t, n) {\n              return Qr(t, 1, n);\n            }),\n            ju = Le(function (t, n, r) {\n              return Qr(t, uc(n) || 0, r);\n            });\n          function Eu(t, n) {\n            if (\"function\" != typeof t || (null != n && \"function\" != typeof n))\n              throw new bt(u);\n            var r = function r() {\n              var e = arguments,\n                o = n ? n.apply(this, e) : e[0],\n                i = r.cache;\n              if (i.has(o)) return i.get(o);\n              var u = t.apply(this, e);\n              return (r.cache = i.set(o, u) || i), u;\n            };\n            return (r.cache = new (Eu.Cache || Nr)()), r;\n          }\n          function Su(t) {\n            if (\"function\" != typeof t) throw new bt(u);\n            return function () {\n              var n = arguments;\n              switch (n.length) {\n                case 0:\n                  return !t.call(this);\n                case 1:\n                  return !t.call(this, n[0]);\n                case 2:\n                  return !t.call(this, n[0], n[1]);\n                case 3:\n                  return !t.call(this, n[0], n[1], n[2]);\n              }\n              return !t.apply(this, n);\n            };\n          }\n          Eu.Cache = Nr;\n          var Ou = so(function (t, n) {\n              var r = (n =\n                1 == n.length && Du(n[0])\n                  ? dn(n[0], kn(Yo()))\n                  : dn(ue(n, 1), kn(Yo()))).length;\n              return Le(function (e) {\n                for (var o = -1, i = ar(e.length, r); ++o < i; )\n                  e[o] = n[o].call(this, e[o]);\n                return cn(t, this, e);\n              });\n            }),\n            Au = Le(function (t, n) {\n              return Mo(t, 32, void 0, n, Hn(n, Ko(Au)));\n            }),\n            Tu = Le(function (t, n) {\n              return Mo(t, 64, void 0, n, Hn(n, Ko(Tu)));\n            }),\n            Cu = Vo(function (t, n) {\n              return Mo(t, 256, void 0, void 0, void 0, n);\n            });\n          function Iu(t, n) {\n            return t === n || (t != t && n != n);\n          }\n          var Pu = No(de),\n            ku = No(function (t, n) {\n              return t >= n;\n            }),\n            Ru = me(\n              (function () {\n                return arguments;\n              })(),\n            )\n              ? me\n              : function (t) {\n                  return Wu(t) && St.call(t, \"callee\") && !Jt.call(t, \"callee\");\n                },\n            Du = e.isArray,\n            Uu = tn\n              ? kn(tn)\n              : function (t) {\n                  return Wu(t) && ve(t) == E;\n                };\n          function Nu(t) {\n            return null != t && Bu(t.length) && !Mu(t);\n          }\n          function zu(t) {\n            return Wu(t) && Nu(t);\n          }\n          var Fu = er || ua,\n            Lu = nn\n              ? kn(nn)\n              : function (t) {\n                  return Wu(t) && ve(t) == p;\n                };\n          function qu(t) {\n            if (!Wu(t)) return !1;\n            var n = ve(t);\n            return (\n              n == h ||\n              \"[object DOMException]\" == n ||\n              (\"string\" == typeof t.message &&\n                \"string\" == typeof t.name &&\n                !Zu(t))\n            );\n          }\n          function Mu(t) {\n            if (!Hu(t)) return !1;\n            var n = ve(t);\n            return (\n              n == v ||\n              n == d ||\n              \"[object AsyncFunction]\" == n ||\n              \"[object Proxy]\" == n\n            );\n          }\n          function $u(t) {\n            return \"number\" == typeof t && t == oc(t);\n          }\n          function Bu(t) {\n            return (\n              \"number\" == typeof t &&\n              t > -1 &&\n              t % 1 == 0 &&\n              t <= 9007199254740991\n            );\n          }\n          function Hu(t) {\n            var n = i(t);\n            return null != t && (\"object\" == n || \"function\" == n);\n          }\n          function Wu(t) {\n            return null != t && \"object\" == i(t);\n          }\n          var Vu = rn\n            ? kn(rn)\n            : function (t) {\n                return Wu(t) && oi(t) == y;\n              };\n          function Gu(t) {\n            return \"number\" == typeof t || (Wu(t) && ve(t) == _);\n          }\n          function Zu(t) {\n            if (!Wu(t) || ve(t) != g) return !1;\n            var n = Vt(t);\n            if (null === n) return !0;\n            var r = St.call(n, \"constructor\") && n.constructor;\n            return \"function\" == typeof r && r instanceof r && Et.call(r) == Ct;\n          }\n          var Ju = en\n            ? kn(en)\n            : function (t) {\n                return Wu(t) && ve(t) == b;\n              };\n          var Xu = on\n            ? kn(on)\n            : function (t) {\n                return Wu(t) && oi(t) == m;\n              };\n          function Ku(t) {\n            return \"string\" == typeof t || (!Du(t) && Wu(t) && ve(t) == w);\n          }\n          function Yu(t) {\n            return \"symbol\" == i(t) || (Wu(t) && ve(t) == x);\n          }\n          var Qu = un\n            ? kn(un)\n            : function (t) {\n                return Wu(t) && Bu(t.length) && !!Mt[ve(t)];\n              };\n          var tc = No(Ae),\n            nc = No(function (t, n) {\n              return t <= n;\n            });\n          function rc(t) {\n            if (!t) return [];\n            if (Nu(t)) return Ku(t) ? Zn(t) : bo(t);\n            if (Qt && t[Qt])\n              return (function (t) {\n                for (var n, r = []; !(n = t.next()).done; ) r.push(n.value);\n                return r;\n              })(t[Qt]());\n            var n = oi(t);\n            return (n == y ? $n : n == m ? Wn : Ic)(t);\n          }\n          function ec(t) {\n            return t\n              ? (t = uc(t)) === 1 / 0 || t === -1 / 0\n                ? 17976931348623157e292 * (t < 0 ? -1 : 1)\n                : t == t\n                  ? t\n                  : 0\n              : 0 === t\n                ? t\n                : 0;\n          }\n          function oc(t) {\n            var n = ec(t),\n              r = n % 1;\n            return n == n ? (r ? n - r : n) : 0;\n          }\n          function ic(t) {\n            return t ? Xr(oc(t), 0, 4294967295) : 0;\n          }\n          function uc(t) {\n            if (\"number\" == typeof t) return t;\n            if (Yu(t)) return NaN;\n            if (Hu(t)) {\n              var n = \"function\" == typeof t.valueOf ? t.valueOf() : t;\n              t = Hu(n) ? n + \"\" : n;\n            }\n            if (\"string\" != typeof t) return 0 === t ? t : +t;\n            t = t.replace(J, \"\");\n            var r = ut.test(t);\n            return r || at.test(t)\n              ? Wt(t.slice(2), r ? 2 : 8)\n              : it.test(t)\n                ? NaN\n                : +t;\n          }\n          function cc(t) {\n            return mo(t, xc(t));\n          }\n          function ac(t) {\n            return null == t ? \"\" : Ye(t);\n          }\n          var sc = xo(function (t, n) {\n              if (hi(n) || Nu(n)) mo(n, wc(n), t);\n              else for (var r in n) St.call(n, r) && Hr(t, r, n[r]);\n            }),\n            fc = xo(function (t, n) {\n              mo(n, xc(n), t);\n            }),\n            lc = xo(function (t, n, r, e) {\n              mo(n, xc(n), t, e);\n            }),\n            pc = xo(function (t, n, r, e) {\n              mo(n, wc(n), t, e);\n            }),\n            hc = Vo(Jr);\n          var vc = Le(function (t, n) {\n              t = yt(t);\n              var r = -1,\n                e = n.length,\n                o = e > 2 ? n[2] : void 0;\n              for (o && si(n[0], n[1], o) && (e = 1); ++r < e; )\n                for (var i = n[r], u = xc(i), c = -1, a = u.length; ++c < a; ) {\n                  var s = u[c],\n                    f = t[s];\n                  (void 0 === f || (Iu(f, xt[s]) && !St.call(t, s))) &&\n                    (t[s] = i[s]);\n                }\n              return t;\n            }),\n            dc = Le(function (t) {\n              return t.push(void 0, Bo), cn(Ec, void 0, t);\n            });\n          function yc(t, n, r) {\n            var e = null == t ? void 0 : pe(t, n);\n            return void 0 === e ? r : e;\n          }\n          function _c(t, n) {\n            return null != t && ii(t, n, _e);\n          }\n          var gc = Po(function (t, n, r) {\n              null != n && \"function\" != typeof n.toString && (n = Tt.call(n)),\n                (t[n] = r);\n            }, Hc(Gc)),\n            bc = Po(function (t, n, r) {\n              null != n && \"function\" != typeof n.toString && (n = Tt.call(n)),\n                St.call(t, n) ? t[n].push(r) : (t[n] = [r]);\n            }, Yo),\n            mc = Le(be);\n          function wc(t) {\n            return Nu(t) ? Lr(t) : Se(t);\n          }\n          function xc(t) {\n            return Nu(t) ? Lr(t, !0) : Oe(t);\n          }\n          var jc = xo(function (t, n, r) {\n              Pe(t, n, r);\n            }),\n            Ec = xo(function (t, n, r, e) {\n              Pe(t, n, r, e);\n            }),\n            Sc = Vo(function (t, n) {\n              var r = {};\n              if (null == t) return r;\n              var e = !1;\n              (n = dn(n, function (n) {\n                return (n = ao(n, t)), e || (e = n.length > 1), n;\n              })),\n                mo(t, Zo(t), r),\n                e && (r = Kr(r, 7, Ho));\n              for (var o = n.length; o--; ) to(r, n[o]);\n              return r;\n            });\n          var Oc = Vo(function (t, n) {\n            return null == t\n              ? {}\n              : (function (t, n) {\n                  return De(t, n, function (n, r) {\n                    return _c(t, r);\n                  });\n                })(t, n);\n          });\n          function Ac(t, n) {\n            if (null == t) return {};\n            var r = dn(Zo(t), function (t) {\n              return [t];\n            });\n            return (\n              (n = Yo(n)),\n              De(t, r, function (t, r) {\n                return n(t, r[0]);\n              })\n            );\n          }\n          var Tc = qo(wc),\n            Cc = qo(xc);\n          function Ic(t) {\n            return null == t ? [] : Rn(t, wc(t));\n          }\n          var Pc = Oo(function (t, n, r) {\n            return (n = n.toLowerCase()), t + (r ? kc(n) : n);\n          });\n          function kc(t) {\n            return qc(ac(t).toLowerCase());\n          }\n          function Rc(t) {\n            return (t = ac(t)) && t.replace(ft, Fn).replace(Dt, \"\");\n          }\n          var Dc = Oo(function (t, n, r) {\n              return t + (r ? \"-\" : \"\") + n.toLowerCase();\n            }),\n            Uc = Oo(function (t, n, r) {\n              return t + (r ? \" \" : \"\") + n.toLowerCase();\n            }),\n            Nc = So(\"toLowerCase\");\n          var zc = Oo(function (t, n, r) {\n            return t + (r ? \"_\" : \"\") + n.toLowerCase();\n          });\n          var Fc = Oo(function (t, n, r) {\n            return t + (r ? \" \" : \"\") + qc(n);\n          });\n          var Lc = Oo(function (t, n, r) {\n              return t + (r ? \" \" : \"\") + n.toUpperCase();\n            }),\n            qc = So(\"toUpperCase\");\n          function Mc(t, n, r) {\n            return (\n              (t = ac(t)),\n              void 0 === (n = r ? void 0 : n)\n                ? (function (t) {\n                    return Ft.test(t);\n                  })(t)\n                  ? (function (t) {\n                      return t.match(Nt) || [];\n                    })(t)\n                  : (function (t) {\n                      return t.match(nt) || [];\n                    })(t)\n                : t.match(n) || []\n            );\n          }\n          var $c = Le(function (t, n) {\n              try {\n                return cn(t, void 0, n);\n              } catch (t) {\n                return qu(t) ? t : new ht(t);\n              }\n            }),\n            Bc = Vo(function (t, n) {\n              return (\n                sn(n, function (n) {\n                  (n = Ai(n)), Zr(t, n, bu(t[n], t));\n                }),\n                t\n              );\n            });\n          function Hc(t) {\n            return function () {\n              return t;\n            };\n          }\n          var Wc = Co(),\n            Vc = Co(!0);\n          function Gc(t) {\n            return t;\n          }\n          function Zc(t) {\n            return Ee(\"function\" == typeof t ? t : Kr(t, 1));\n          }\n          var Jc = Le(function (t, n) {\n              return function (r) {\n                return be(r, t, n);\n              };\n            }),\n            Xc = Le(function (t, n) {\n              return function (r) {\n                return be(t, r, n);\n              };\n            });\n          function Kc(t, n, r) {\n            var e = wc(n),\n              o = le(n, e);\n            null != r ||\n              (Hu(n) && (o.length || !e.length)) ||\n              ((r = n), (n = t), (t = this), (o = le(n, wc(n))));\n            var i = !(Hu(r) && \"chain\" in r && !r.chain),\n              u = Mu(t);\n            return (\n              sn(o, function (r) {\n                var e = n[r];\n                (t[r] = e),\n                  u &&\n                    (t.prototype[r] = function () {\n                      var n = this.__chain__;\n                      if (i || n) {\n                        var r = t(this.__wrapped__),\n                          o = (r.__actions__ = bo(this.__actions__));\n                        return (\n                          o.push({ func: e, args: arguments, thisArg: t }),\n                          (r.__chain__ = n),\n                          r\n                        );\n                      }\n                      return e.apply(t, yn([this.value()], arguments));\n                    });\n              }),\n              t\n            );\n          }\n          function Yc() {}\n          var Qc = Ro(dn),\n            ta = Ro(ln),\n            na = Ro(bn);\n          function ra(t) {\n            return fi(t)\n              ? An(Ai(t))\n              : (function (t) {\n                  return function (n) {\n                    return pe(n, t);\n                  };\n                })(t);\n          }\n          var ea = Uo(),\n            oa = Uo(!0);\n          function ia() {\n            return [];\n          }\n          function ua() {\n            return !1;\n          }\n          var ca = ko(function (t, n) {\n              return t + n;\n            }, 0),\n            aa = Fo(\"ceil\"),\n            sa = ko(function (t, n) {\n              return t / n;\n            }, 1),\n            fa = Fo(\"floor\");\n          var la,\n            pa = ko(function (t, n) {\n              return t * n;\n            }, 1),\n            ha = Fo(\"round\"),\n            va = ko(function (t, n) {\n              return t - n;\n            }, 0);\n          return (\n            (Cr.after = function (t, n) {\n              if (\"function\" != typeof n) throw new bt(u);\n              return (\n                (t = oc(t)),\n                function () {\n                  if (--t < 1) return n.apply(this, arguments);\n                }\n              );\n            }),\n            (Cr.ary = _u),\n            (Cr.assign = sc),\n            (Cr.assignIn = fc),\n            (Cr.assignInWith = lc),\n            (Cr.assignWith = pc),\n            (Cr.at = hc),\n            (Cr.before = gu),\n            (Cr.bind = bu),\n            (Cr.bindAll = Bc),\n            (Cr.bindKey = mu),\n            (Cr.castArray = function () {\n              if (!arguments.length) return [];\n              var t = arguments[0];\n              return Du(t) ? t : [t];\n            }),\n            (Cr.chain = ru),\n            (Cr.chunk = function (t, n, r) {\n              n = (r ? si(t, n, r) : void 0 === n) ? 1 : cr(oc(n), 0);\n              var o = null == t ? 0 : t.length;\n              if (!o || n < 1) return [];\n              for (var i = 0, u = 0, c = e(tr(o / n)); i < o; )\n                c[u++] = Ve(t, i, (i += n));\n              return c;\n            }),\n            (Cr.compact = function (t) {\n              for (\n                var n = -1, r = null == t ? 0 : t.length, e = 0, o = [];\n                ++n < r;\n\n              ) {\n                var i = t[n];\n                i && (o[e++] = i);\n              }\n              return o;\n            }),\n            (Cr.concat = function () {\n              var t = arguments.length;\n              if (!t) return [];\n              for (var n = e(t - 1), r = arguments[0], o = t; o--; )\n                n[o - 1] = arguments[o];\n              return yn(Du(r) ? bo(r) : [r], ue(n, 1));\n            }),\n            (Cr.cond = function (t) {\n              var n = null == t ? 0 : t.length,\n                r = Yo();\n              return (\n                (t = n\n                  ? dn(t, function (t) {\n                      if (\"function\" != typeof t[1]) throw new bt(u);\n                      return [r(t[0]), t[1]];\n                    })\n                  : []),\n                Le(function (r) {\n                  for (var e = -1; ++e < n; ) {\n                    var o = t[e];\n                    if (cn(o[0], this, r)) return cn(o[1], this, r);\n                  }\n                })\n              );\n            }),\n            (Cr.conforms = function (t) {\n              return (function (t) {\n                var n = wc(t);\n                return function (r) {\n                  return Yr(r, t, n);\n                };\n              })(Kr(t, 1));\n            }),\n            (Cr.constant = Hc),\n            (Cr.countBy = iu),\n            (Cr.create = function (t, n) {\n              var r = Ir(t);\n              return null == n ? r : Gr(r, n);\n            }),\n            (Cr.curry = function t(n, r, e) {\n              var o = Mo(\n                n,\n                8,\n                void 0,\n                void 0,\n                void 0,\n                void 0,\n                void 0,\n                (r = e ? void 0 : r),\n              );\n              return (o.placeholder = t.placeholder), o;\n            }),\n            (Cr.curryRight = function t(n, r, e) {\n              var o = Mo(\n                n,\n                16,\n                void 0,\n                void 0,\n                void 0,\n                void 0,\n                void 0,\n                (r = e ? void 0 : r),\n              );\n              return (o.placeholder = t.placeholder), o;\n            }),\n            (Cr.debounce = wu),\n            (Cr.defaults = vc),\n            (Cr.defaultsDeep = dc),\n            (Cr.defer = xu),\n            (Cr.delay = ju),\n            (Cr.difference = Ii),\n            (Cr.differenceBy = Pi),\n            (Cr.differenceWith = ki),\n            (Cr.drop = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              return e\n                ? Ve(t, (n = r || void 0 === n ? 1 : oc(n)) < 0 ? 0 : n, e)\n                : [];\n            }),\n            (Cr.dropRight = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              return e\n                ? Ve(\n                    t,\n                    0,\n                    (n = e - (n = r || void 0 === n ? 1 : oc(n))) < 0 ? 0 : n,\n                  )\n                : [];\n            }),\n            (Cr.dropRightWhile = function (t, n) {\n              return t && t.length ? ro(t, Yo(n, 3), !0, !0) : [];\n            }),\n            (Cr.dropWhile = function (t, n) {\n              return t && t.length ? ro(t, Yo(n, 3), !0) : [];\n            }),\n            (Cr.fill = function (t, n, r, e) {\n              var o = null == t ? 0 : t.length;\n              return o\n                ? (r &&\n                    \"number\" != typeof r &&\n                    si(t, n, r) &&\n                    ((r = 0), (e = o)),\n                  (function (t, n, r, e) {\n                    var o = t.length;\n                    for (\n                      (r = oc(r)) < 0 && (r = -r > o ? 0 : o + r),\n                        (e = void 0 === e || e > o ? o : oc(e)) < 0 && (e += o),\n                        e = r > e ? 0 : ic(e);\n                      r < e;\n\n                    )\n                      t[r++] = n;\n                    return t;\n                  })(t, n, r, e))\n                : [];\n            }),\n            (Cr.filter = function (t, n) {\n              return (Du(t) ? pn : ie)(t, Yo(n, 3));\n            }),\n            (Cr.flatMap = function (t, n) {\n              return ue(hu(t, n), 1);\n            }),\n            (Cr.flatMapDeep = function (t, n) {\n              return ue(hu(t, n), 1 / 0);\n            }),\n            (Cr.flatMapDepth = function (t, n, r) {\n              return (r = void 0 === r ? 1 : oc(r)), ue(hu(t, n), r);\n            }),\n            (Cr.flatten = Ui),\n            (Cr.flattenDeep = function (t) {\n              return (null == t ? 0 : t.length) ? ue(t, 1 / 0) : [];\n            }),\n            (Cr.flattenDepth = function (t, n) {\n              return (null == t ? 0 : t.length)\n                ? ue(t, (n = void 0 === n ? 1 : oc(n)))\n                : [];\n            }),\n            (Cr.flip = function (t) {\n              return Mo(t, 512);\n            }),\n            (Cr.flow = Wc),\n            (Cr.flowRight = Vc),\n            (Cr.fromPairs = function (t) {\n              for (\n                var n = -1, r = null == t ? 0 : t.length, e = {};\n                ++n < r;\n\n              ) {\n                var o = t[n];\n                e[o[0]] = o[1];\n              }\n              return e;\n            }),\n            (Cr.functions = function (t) {\n              return null == t ? [] : le(t, wc(t));\n            }),\n            (Cr.functionsIn = function (t) {\n              return null == t ? [] : le(t, xc(t));\n            }),\n            (Cr.groupBy = fu),\n            (Cr.initial = function (t) {\n              return (null == t ? 0 : t.length) ? Ve(t, 0, -1) : [];\n            }),\n            (Cr.intersection = zi),\n            (Cr.intersectionBy = Fi),\n            (Cr.intersectionWith = Li),\n            (Cr.invert = gc),\n            (Cr.invertBy = bc),\n            (Cr.invokeMap = lu),\n            (Cr.iteratee = Zc),\n            (Cr.keyBy = pu),\n            (Cr.keys = wc),\n            (Cr.keysIn = xc),\n            (Cr.map = hu),\n            (Cr.mapKeys = function (t, n) {\n              var r = {};\n              return (\n                (n = Yo(n, 3)),\n                se(t, function (t, e, o) {\n                  Zr(r, n(t, e, o), t);\n                }),\n                r\n              );\n            }),\n            (Cr.mapValues = function (t, n) {\n              var r = {};\n              return (\n                (n = Yo(n, 3)),\n                se(t, function (t, e, o) {\n                  Zr(r, e, n(t, e, o));\n                }),\n                r\n              );\n            }),\n            (Cr.matches = function (t) {\n              return Ce(Kr(t, 1));\n            }),\n            (Cr.matchesProperty = function (t, n) {\n              return Ie(t, Kr(n, 1));\n            }),\n            (Cr.memoize = Eu),\n            (Cr.merge = jc),\n            (Cr.mergeWith = Ec),\n            (Cr.method = Jc),\n            (Cr.methodOf = Xc),\n            (Cr.mixin = Kc),\n            (Cr.negate = Su),\n            (Cr.nthArg = function (t) {\n              return (\n                (t = oc(t)),\n                Le(function (n) {\n                  return ke(n, t);\n                })\n              );\n            }),\n            (Cr.omit = Sc),\n            (Cr.omitBy = function (t, n) {\n              return Ac(t, Su(Yo(n)));\n            }),\n            (Cr.once = function (t) {\n              return gu(2, t);\n            }),\n            (Cr.orderBy = function (t, n, r, e) {\n              return null == t\n                ? []\n                : (Du(n) || (n = null == n ? [] : [n]),\n                  Du((r = e ? void 0 : r)) || (r = null == r ? [] : [r]),\n                  Re(t, n, r));\n            }),\n            (Cr.over = Qc),\n            (Cr.overArgs = Ou),\n            (Cr.overEvery = ta),\n            (Cr.overSome = na),\n            (Cr.partial = Au),\n            (Cr.partialRight = Tu),\n            (Cr.partition = vu),\n            (Cr.pick = Oc),\n            (Cr.pickBy = Ac),\n            (Cr.property = ra),\n            (Cr.propertyOf = function (t) {\n              return function (n) {\n                return null == t ? void 0 : pe(t, n);\n              };\n            }),\n            (Cr.pull = Mi),\n            (Cr.pullAll = $i),\n            (Cr.pullAllBy = function (t, n, r) {\n              return t && t.length && n && n.length ? Ue(t, n, Yo(r, 2)) : t;\n            }),\n            (Cr.pullAllWith = function (t, n, r) {\n              return t && t.length && n && n.length ? Ue(t, n, void 0, r) : t;\n            }),\n            (Cr.pullAt = Bi),\n            (Cr.range = ea),\n            (Cr.rangeRight = oa),\n            (Cr.rearg = Cu),\n            (Cr.reject = function (t, n) {\n              return (Du(t) ? pn : ie)(t, Su(Yo(n, 3)));\n            }),\n            (Cr.remove = function (t, n) {\n              var r = [];\n              if (!t || !t.length) return r;\n              var e = -1,\n                o = [],\n                i = t.length;\n              for (n = Yo(n, 3); ++e < i; ) {\n                var u = t[e];\n                n(u, e, t) && (r.push(u), o.push(e));\n              }\n              return Ne(t, o), r;\n            }),\n            (Cr.rest = function (t, n) {\n              if (\"function\" != typeof t) throw new bt(u);\n              return Le(t, (n = void 0 === n ? n : oc(n)));\n            }),\n            (Cr.reverse = Hi),\n            (Cr.sampleSize = function (t, n, r) {\n              return (\n                (n = (r ? si(t, n, r) : void 0 === n) ? 1 : oc(n)),\n                (Du(t) ? Mr : Me)(t, n)\n              );\n            }),\n            (Cr.set = function (t, n, r) {\n              return null == t ? t : $e(t, n, r);\n            }),\n            (Cr.setWith = function (t, n, r, e) {\n              return (\n                (e = \"function\" == typeof e ? e : void 0),\n                null == t ? t : $e(t, n, r, e)\n              );\n            }),\n            (Cr.shuffle = function (t) {\n              return (Du(t) ? $r : We)(t);\n            }),\n            (Cr.slice = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              return e\n                ? (r && \"number\" != typeof r && si(t, n, r)\n                    ? ((n = 0), (r = e))\n                    : ((n = null == n ? 0 : oc(n)),\n                      (r = void 0 === r ? e : oc(r))),\n                  Ve(t, n, r))\n                : [];\n            }),\n            (Cr.sortBy = du),\n            (Cr.sortedUniq = function (t) {\n              return t && t.length ? Xe(t) : [];\n            }),\n            (Cr.sortedUniqBy = function (t, n) {\n              return t && t.length ? Xe(t, Yo(n, 2)) : [];\n            }),\n            (Cr.split = function (t, n, r) {\n              return (\n                r && \"number\" != typeof r && si(t, n, r) && (n = r = void 0),\n                (r = void 0 === r ? 4294967295 : r >>> 0)\n                  ? (t = ac(t)) &&\n                    (\"string\" == typeof n || (null != n && !Ju(n))) &&\n                    !(n = Ye(n)) &&\n                    Mn(t)\n                    ? fo(Zn(t), 0, r)\n                    : t.split(n, r)\n                  : []\n              );\n            }),\n            (Cr.spread = function (t, n) {\n              if (\"function\" != typeof t) throw new bt(u);\n              return (\n                (n = null == n ? 0 : cr(oc(n), 0)),\n                Le(function (r) {\n                  var e = r[n],\n                    o = fo(r, 0, n);\n                  return e && yn(o, e), cn(t, this, o);\n                })\n              );\n            }),\n            (Cr.tail = function (t) {\n              var n = null == t ? 0 : t.length;\n              return n ? Ve(t, 1, n) : [];\n            }),\n            (Cr.take = function (t, n, r) {\n              return t && t.length\n                ? Ve(t, 0, (n = r || void 0 === n ? 1 : oc(n)) < 0 ? 0 : n)\n                : [];\n            }),\n            (Cr.takeRight = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              return e\n                ? Ve(\n                    t,\n                    (n = e - (n = r || void 0 === n ? 1 : oc(n))) < 0 ? 0 : n,\n                    e,\n                  )\n                : [];\n            }),\n            (Cr.takeRightWhile = function (t, n) {\n              return t && t.length ? ro(t, Yo(n, 3), !1, !0) : [];\n            }),\n            (Cr.takeWhile = function (t, n) {\n              return t && t.length ? ro(t, Yo(n, 3)) : [];\n            }),\n            (Cr.tap = function (t, n) {\n              return n(t), t;\n            }),\n            (Cr.throttle = function (t, n, r) {\n              var e = !0,\n                o = !0;\n              if (\"function\" != typeof t) throw new bt(u);\n              return (\n                Hu(r) &&\n                  ((e = \"leading\" in r ? !!r.leading : e),\n                  (o = \"trailing\" in r ? !!r.trailing : o)),\n                wu(t, n, { leading: e, maxWait: n, trailing: o })\n              );\n            }),\n            (Cr.thru = eu),\n            (Cr.toArray = rc),\n            (Cr.toPairs = Tc),\n            (Cr.toPairsIn = Cc),\n            (Cr.toPath = function (t) {\n              return Du(t) ? dn(t, Ai) : Yu(t) ? [t] : bo(Oi(ac(t)));\n            }),\n            (Cr.toPlainObject = cc),\n            (Cr.transform = function (t, n, r) {\n              var e = Du(t),\n                o = e || Fu(t) || Qu(t);\n              if (((n = Yo(n, 4)), null == r)) {\n                var i = t && t.constructor;\n                r = o ? (e ? new i() : []) : Hu(t) && Mu(i) ? Ir(Vt(t)) : {};\n              }\n              return (\n                (o ? sn : se)(t, function (t, e, o) {\n                  return n(r, t, e, o);\n                }),\n                r\n              );\n            }),\n            (Cr.unary = function (t) {\n              return _u(t, 1);\n            }),\n            (Cr.union = Wi),\n            (Cr.unionBy = Vi),\n            (Cr.unionWith = Gi),\n            (Cr.uniq = function (t) {\n              return t && t.length ? Qe(t) : [];\n            }),\n            (Cr.uniqBy = function (t, n) {\n              return t && t.length ? Qe(t, Yo(n, 2)) : [];\n            }),\n            (Cr.uniqWith = function (t, n) {\n              return (\n                (n = \"function\" == typeof n ? n : void 0),\n                t && t.length ? Qe(t, void 0, n) : []\n              );\n            }),\n            (Cr.unset = function (t, n) {\n              return null == t || to(t, n);\n            }),\n            (Cr.unzip = Zi),\n            (Cr.unzipWith = Ji),\n            (Cr.update = function (t, n, r) {\n              return null == t ? t : no(t, n, co(r));\n            }),\n            (Cr.updateWith = function (t, n, r, e) {\n              return (\n                (e = \"function\" == typeof e ? e : void 0),\n                null == t ? t : no(t, n, co(r), e)\n              );\n            }),\n            (Cr.values = Ic),\n            (Cr.valuesIn = function (t) {\n              return null == t ? [] : Rn(t, xc(t));\n            }),\n            (Cr.without = Xi),\n            (Cr.words = Mc),\n            (Cr.wrap = function (t, n) {\n              return Au(co(n), t);\n            }),\n            (Cr.xor = Ki),\n            (Cr.xorBy = Yi),\n            (Cr.xorWith = Qi),\n            (Cr.zip = tu),\n            (Cr.zipObject = function (t, n) {\n              return io(t || [], n || [], Hr);\n            }),\n            (Cr.zipObjectDeep = function (t, n) {\n              return io(t || [], n || [], $e);\n            }),\n            (Cr.zipWith = nu),\n            (Cr.entries = Tc),\n            (Cr.entriesIn = Cc),\n            (Cr.extend = fc),\n            (Cr.extendWith = lc),\n            Kc(Cr, Cr),\n            (Cr.add = ca),\n            (Cr.attempt = $c),\n            (Cr.camelCase = Pc),\n            (Cr.capitalize = kc),\n            (Cr.ceil = aa),\n            (Cr.clamp = function (t, n, r) {\n              return (\n                void 0 === r && ((r = n), (n = void 0)),\n                void 0 !== r && (r = (r = uc(r)) == r ? r : 0),\n                void 0 !== n && (n = (n = uc(n)) == n ? n : 0),\n                Xr(uc(t), n, r)\n              );\n            }),\n            (Cr.clone = function (t) {\n              return Kr(t, 4);\n            }),\n            (Cr.cloneDeep = function (t) {\n              return Kr(t, 5);\n            }),\n            (Cr.cloneDeepWith = function (t, n) {\n              return Kr(t, 5, (n = \"function\" == typeof n ? n : void 0));\n            }),\n            (Cr.cloneWith = function (t, n) {\n              return Kr(t, 4, (n = \"function\" == typeof n ? n : void 0));\n            }),\n            (Cr.conformsTo = function (t, n) {\n              return null == n || Yr(t, n, wc(n));\n            }),\n            (Cr.deburr = Rc),\n            (Cr.defaultTo = function (t, n) {\n              return null == t || t != t ? n : t;\n            }),\n            (Cr.divide = sa),\n            (Cr.endsWith = function (t, n, r) {\n              (t = ac(t)), (n = Ye(n));\n              var e = t.length,\n                o = (r = void 0 === r ? e : Xr(oc(r), 0, e));\n              return (r -= n.length) >= 0 && t.slice(r, o) == n;\n            }),\n            (Cr.eq = Iu),\n            (Cr.escape = function (t) {\n              return (t = ac(t)) && q.test(t) ? t.replace(F, Ln) : t;\n            }),\n            (Cr.escapeRegExp = function (t) {\n              return (t = ac(t)) && Z.test(t) ? t.replace(G, \"\\\\$&\") : t;\n            }),\n            (Cr.every = function (t, n, r) {\n              var e = Du(t) ? ln : ee;\n              return r && si(t, n, r) && (n = void 0), e(t, Yo(n, 3));\n            }),\n            (Cr.find = uu),\n            (Cr.findIndex = Ri),\n            (Cr.findKey = function (t, n) {\n              return wn(t, Yo(n, 3), se);\n            }),\n            (Cr.findLast = cu),\n            (Cr.findLastIndex = Di),\n            (Cr.findLastKey = function (t, n) {\n              return wn(t, Yo(n, 3), fe);\n            }),\n            (Cr.floor = fa),\n            (Cr.forEach = au),\n            (Cr.forEachRight = su),\n            (Cr.forIn = function (t, n) {\n              return null == t ? t : ce(t, Yo(n, 3), xc);\n            }),\n            (Cr.forInRight = function (t, n) {\n              return null == t ? t : ae(t, Yo(n, 3), xc);\n            }),\n            (Cr.forOwn = function (t, n) {\n              return t && se(t, Yo(n, 3));\n            }),\n            (Cr.forOwnRight = function (t, n) {\n              return t && fe(t, Yo(n, 3));\n            }),\n            (Cr.get = yc),\n            (Cr.gt = Pu),\n            (Cr.gte = ku),\n            (Cr.has = function (t, n) {\n              return null != t && ii(t, n, ye);\n            }),\n            (Cr.hasIn = _c),\n            (Cr.head = Ni),\n            (Cr.identity = Gc),\n            (Cr.includes = function (t, n, r, e) {\n              (t = Nu(t) ? t : Ic(t)), (r = r && !e ? oc(r) : 0);\n              var o = t.length;\n              return (\n                r < 0 && (r = cr(o + r, 0)),\n                Ku(t) ? r <= o && t.indexOf(n, r) > -1 : !!o && jn(t, n, r) > -1\n              );\n            }),\n            (Cr.indexOf = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              if (!e) return -1;\n              var o = null == r ? 0 : oc(r);\n              return o < 0 && (o = cr(e + o, 0)), jn(t, n, o);\n            }),\n            (Cr.inRange = function (t, n, r) {\n              return (\n                (n = ec(n)),\n                void 0 === r ? ((r = n), (n = 0)) : (r = ec(r)),\n                (function (t, n, r) {\n                  return t >= ar(n, r) && t < cr(n, r);\n                })((t = uc(t)), n, r)\n              );\n            }),\n            (Cr.invoke = mc),\n            (Cr.isArguments = Ru),\n            (Cr.isArray = Du),\n            (Cr.isArrayBuffer = Uu),\n            (Cr.isArrayLike = Nu),\n            (Cr.isArrayLikeObject = zu),\n            (Cr.isBoolean = function (t) {\n              return !0 === t || !1 === t || (Wu(t) && ve(t) == l);\n            }),\n            (Cr.isBuffer = Fu),\n            (Cr.isDate = Lu),\n            (Cr.isElement = function (t) {\n              return Wu(t) && 1 === t.nodeType && !Zu(t);\n            }),\n            (Cr.isEmpty = function (t) {\n              if (null == t) return !0;\n              if (\n                Nu(t) &&\n                (Du(t) ||\n                  \"string\" == typeof t ||\n                  \"function\" == typeof t.splice ||\n                  Fu(t) ||\n                  Qu(t) ||\n                  Ru(t))\n              )\n                return !t.length;\n              var n = oi(t);\n              if (n == y || n == m) return !t.size;\n              if (hi(t)) return !Se(t).length;\n              for (var r in t) if (St.call(t, r)) return !1;\n              return !0;\n            }),\n            (Cr.isEqual = function (t, n) {\n              return we(t, n);\n            }),\n            (Cr.isEqualWith = function (t, n, r) {\n              var e = (r = \"function\" == typeof r ? r : void 0)\n                ? r(t, n)\n                : void 0;\n              return void 0 === e ? we(t, n, void 0, r) : !!e;\n            }),\n            (Cr.isError = qu),\n            (Cr.isFinite = function (t) {\n              return \"number\" == typeof t && or(t);\n            }),\n            (Cr.isFunction = Mu),\n            (Cr.isInteger = $u),\n            (Cr.isLength = Bu),\n            (Cr.isMap = Vu),\n            (Cr.isMatch = function (t, n) {\n              return t === n || xe(t, n, ti(n));\n            }),\n            (Cr.isMatchWith = function (t, n, r) {\n              return (\n                (r = \"function\" == typeof r ? r : void 0), xe(t, n, ti(n), r)\n              );\n            }),\n            (Cr.isNaN = function (t) {\n              return Gu(t) && t != +t;\n            }),\n            (Cr.isNative = function (t) {\n              if (pi(t))\n                throw new ht(\n                  \"Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\",\n                );\n              return je(t);\n            }),\n            (Cr.isNil = function (t) {\n              return null == t;\n            }),\n            (Cr.isNull = function (t) {\n              return null === t;\n            }),\n            (Cr.isNumber = Gu),\n            (Cr.isObject = Hu),\n            (Cr.isObjectLike = Wu),\n            (Cr.isPlainObject = Zu),\n            (Cr.isRegExp = Ju),\n            (Cr.isSafeInteger = function (t) {\n              return $u(t) && t >= -9007199254740991 && t <= 9007199254740991;\n            }),\n            (Cr.isSet = Xu),\n            (Cr.isString = Ku),\n            (Cr.isSymbol = Yu),\n            (Cr.isTypedArray = Qu),\n            (Cr.isUndefined = function (t) {\n              return void 0 === t;\n            }),\n            (Cr.isWeakMap = function (t) {\n              return Wu(t) && oi(t) == j;\n            }),\n            (Cr.isWeakSet = function (t) {\n              return Wu(t) && \"[object WeakSet]\" == ve(t);\n            }),\n            (Cr.join = function (t, n) {\n              return null == t ? \"\" : ir.call(t, n);\n            }),\n            (Cr.kebabCase = Dc),\n            (Cr.last = qi),\n            (Cr.lastIndexOf = function (t, n, r) {\n              var e = null == t ? 0 : t.length;\n              if (!e) return -1;\n              var o = e;\n              return (\n                void 0 !== r &&\n                  (o = (o = oc(r)) < 0 ? cr(e + o, 0) : ar(o, e - 1)),\n                n == n\n                  ? (function (t, n, r) {\n                      for (var e = r + 1; e--; ) if (t[e] === n) return e;\n                      return e;\n                    })(t, n, o)\n                  : xn(t, Sn, o, !0)\n              );\n            }),\n            (Cr.lowerCase = Uc),\n            (Cr.lowerFirst = Nc),\n            (Cr.lt = tc),\n            (Cr.lte = nc),\n            (Cr.max = function (t) {\n              return t && t.length ? oe(t, Gc, de) : void 0;\n            }),\n            (Cr.maxBy = function (t, n) {\n              return t && t.length ? oe(t, Yo(n, 2), de) : void 0;\n            }),\n            (Cr.mean = function (t) {\n              return On(t, Gc);\n            }),\n            (Cr.meanBy = function (t, n) {\n              return On(t, Yo(n, 2));\n            }),\n            (Cr.min = function (t) {\n              return t && t.length ? oe(t, Gc, Ae) : void 0;\n            }),\n            (Cr.minBy = function (t, n) {\n              return t && t.length ? oe(t, Yo(n, 2), Ae) : void 0;\n            }),\n            (Cr.stubArray = ia),\n            (Cr.stubFalse = ua),\n            (Cr.stubObject = function () {\n              return {};\n            }),\n            (Cr.stubString = function () {\n              return \"\";\n            }),\n            (Cr.stubTrue = function () {\n              return !0;\n            }),\n            (Cr.multiply = pa),\n            (Cr.nth = function (t, n) {\n              return t && t.length ? ke(t, oc(n)) : void 0;\n            }),\n            (Cr.noConflict = function () {\n              return Zt._ === this && (Zt._ = It), this;\n            }),\n            (Cr.noop = Yc),\n            (Cr.now = yu),\n            (Cr.pad = function (t, n, r) {\n              t = ac(t);\n              var e = (n = oc(n)) ? Gn(t) : 0;\n              if (!n || e >= n) return t;\n              var o = (n - e) / 2;\n              return Do(nr(o), r) + t + Do(tr(o), r);\n            }),\n            (Cr.padEnd = function (t, n, r) {\n              t = ac(t);\n              var e = (n = oc(n)) ? Gn(t) : 0;\n              return n && e < n ? t + Do(n - e, r) : t;\n            }),\n            (Cr.padStart = function (t, n, r) {\n              t = ac(t);\n              var e = (n = oc(n)) ? Gn(t) : 0;\n              return n && e < n ? Do(n - e, r) + t : t;\n            }),\n            (Cr.parseInt = function (t, n, r) {\n              return (\n                r || null == n ? (n = 0) : n && (n = +n),\n                fr(ac(t).replace(X, \"\"), n || 0)\n              );\n            }),\n            (Cr.random = function (t, n, r) {\n              if (\n                (r && \"boolean\" != typeof r && si(t, n, r) && (n = r = void 0),\n                void 0 === r &&\n                  (\"boolean\" == typeof n\n                    ? ((r = n), (n = void 0))\n                    : \"boolean\" == typeof t && ((r = t), (t = void 0))),\n                void 0 === t && void 0 === n\n                  ? ((t = 0), (n = 1))\n                  : ((t = ec(t)),\n                    void 0 === n ? ((n = t), (t = 0)) : (n = ec(n))),\n                t > n)\n              ) {\n                var e = t;\n                (t = n), (n = e);\n              }\n              if (r || t % 1 || n % 1) {\n                var o = lr();\n                return ar(\n                  t + o * (n - t + Ht(\"1e-\" + ((o + \"\").length - 1))),\n                  n,\n                );\n              }\n              return ze(t, n);\n            }),\n            (Cr.reduce = function (t, n, r) {\n              var e = Du(t) ? _n : Cn,\n                o = arguments.length < 3;\n              return e(t, Yo(n, 4), r, o, ne);\n            }),\n            (Cr.reduceRight = function (t, n, r) {\n              var e = Du(t) ? gn : Cn,\n                o = arguments.length < 3;\n              return e(t, Yo(n, 4), r, o, re);\n            }),\n            (Cr.repeat = function (t, n, r) {\n              return (\n                (n = (r ? si(t, n, r) : void 0 === n) ? 1 : oc(n)), Fe(ac(t), n)\n              );\n            }),\n            (Cr.replace = function () {\n              var t = arguments,\n                n = ac(t[0]);\n              return t.length < 3 ? n : n.replace(t[1], t[2]);\n            }),\n            (Cr.result = function (t, n, r) {\n              var e = -1,\n                o = (n = ao(n, t)).length;\n              for (o || ((o = 1), (t = void 0)); ++e < o; ) {\n                var i = null == t ? void 0 : t[Ai(n[e])];\n                void 0 === i && ((e = o), (i = r)), (t = Mu(i) ? i.call(t) : i);\n              }\n              return t;\n            }),\n            (Cr.round = ha),\n            (Cr.runInContext = t),\n            (Cr.sample = function (t) {\n              return (Du(t) ? qr : qe)(t);\n            }),\n            (Cr.size = function (t) {\n              if (null == t) return 0;\n              if (Nu(t)) return Ku(t) ? Gn(t) : t.length;\n              var n = oi(t);\n              return n == y || n == m ? t.size : Se(t).length;\n            }),\n            (Cr.snakeCase = zc),\n            (Cr.some = function (t, n, r) {\n              var e = Du(t) ? bn : Ge;\n              return r && si(t, n, r) && (n = void 0), e(t, Yo(n, 3));\n            }),\n            (Cr.sortedIndex = function (t, n) {\n              return Ze(t, n);\n            }),\n            (Cr.sortedIndexBy = function (t, n, r) {\n              return Je(t, n, Yo(r, 2));\n            }),\n            (Cr.sortedIndexOf = function (t, n) {\n              var r = null == t ? 0 : t.length;\n              if (r) {\n                var e = Ze(t, n);\n                if (e < r && Iu(t[e], n)) return e;\n              }\n              return -1;\n            }),\n            (Cr.sortedLastIndex = function (t, n) {\n              return Ze(t, n, !0);\n            }),\n            (Cr.sortedLastIndexBy = function (t, n, r) {\n              return Je(t, n, Yo(r, 2), !0);\n            }),\n            (Cr.sortedLastIndexOf = function (t, n) {\n              if (null == t ? 0 : t.length) {\n                var r = Ze(t, n, !0) - 1;\n                if (Iu(t[r], n)) return r;\n              }\n              return -1;\n            }),\n            (Cr.startCase = Fc),\n            (Cr.startsWith = function (t, n, r) {\n              return (\n                (t = ac(t)),\n                (r = null == r ? 0 : Xr(oc(r), 0, t.length)),\n                (n = Ye(n)),\n                t.slice(r, r + n.length) == n\n              );\n            }),\n            (Cr.subtract = va),\n            (Cr.sum = function (t) {\n              return t && t.length ? In(t, Gc) : 0;\n            }),\n            (Cr.sumBy = function (t, n) {\n              return t && t.length ? In(t, Yo(n, 2)) : 0;\n            }),\n            (Cr.template = function (t, n, r) {\n              var e = Cr.templateSettings;\n              r && si(t, n, r) && (n = void 0),\n                (t = ac(t)),\n                (n = lc({}, n, e, $o));\n              var o,\n                i,\n                u = lc({}, n.imports, e.imports, $o),\n                c = wc(u),\n                a = Rn(u, c),\n                s = 0,\n                f = n.interpolate || lt,\n                l = \"__p += '\",\n                p = _t(\n                  (n.escape || lt).source +\n                    \"|\" +\n                    f.source +\n                    \"|\" +\n                    (f === B ? et : lt).source +\n                    \"|\" +\n                    (n.evaluate || lt).source +\n                    \"|$\",\n                  \"g\",\n                ),\n                h =\n                  \"//# sourceURL=\" +\n                  (St.call(n, \"sourceURL\")\n                    ? (n.sourceURL + \"\").replace(/[\\r\\n]/g, \" \")\n                    : \"lodash.templateSources[\" + ++qt + \"]\") +\n                  \"\\n\";\n              t.replace(p, function (n, r, e, u, c, a) {\n                return (\n                  e || (e = u),\n                  (l += t.slice(s, a).replace(pt, qn)),\n                  r && ((o = !0), (l += \"' +\\n__e(\" + r + \") +\\n'\")),\n                  c && ((i = !0), (l += \"';\\n\" + c + \";\\n__p += '\")),\n                  e &&\n                    (l += \"' +\\n((__t = (\" + e + \")) == null ? '' : __t) +\\n'\"),\n                  (s = a + n.length),\n                  n\n                );\n              }),\n                (l += \"';\\n\");\n              var v = St.call(n, \"variable\") && n.variable;\n              v || (l = \"with (obj) {\\n\" + l + \"\\n}\\n\"),\n                (l = (i ? l.replace(D, \"\") : l)\n                  .replace(U, \"$1\")\n                  .replace(N, \"$1;\")),\n                (l =\n                  \"function(\" +\n                  (v || \"obj\") +\n                  \") {\\n\" +\n                  (v ? \"\" : \"obj || (obj = {});\\n\") +\n                  \"var __t, __p = ''\" +\n                  (o ? \", __e = _.escape\" : \"\") +\n                  (i\n                    ? \", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\"\n                    : \";\\n\") +\n                  l +\n                  \"return __p\\n}\");\n              var d = $c(function () {\n                return vt(c, h + \"return \" + l).apply(void 0, a);\n              });\n              if (((d.source = l), qu(d))) throw d;\n              return d;\n            }),\n            (Cr.times = function (t, n) {\n              if ((t = oc(t)) < 1 || t > 9007199254740991) return [];\n              var r = 4294967295,\n                e = ar(t, 4294967295);\n              t -= 4294967295;\n              for (var o = Pn(e, (n = Yo(n))); ++r < t; ) n(r);\n              return o;\n            }),\n            (Cr.toFinite = ec),\n            (Cr.toInteger = oc),\n            (Cr.toLength = ic),\n            (Cr.toLower = function (t) {\n              return ac(t).toLowerCase();\n            }),\n            (Cr.toNumber = uc),\n            (Cr.toSafeInteger = function (t) {\n              return t\n                ? Xr(oc(t), -9007199254740991, 9007199254740991)\n                : 0 === t\n                  ? t\n                  : 0;\n            }),\n            (Cr.toString = ac),\n            (Cr.toUpper = function (t) {\n              return ac(t).toUpperCase();\n            }),\n            (Cr.trim = function (t, n, r) {\n              if ((t = ac(t)) && (r || void 0 === n)) return t.replace(J, \"\");\n              if (!t || !(n = Ye(n))) return t;\n              var e = Zn(t),\n                o = Zn(n);\n              return fo(e, Un(e, o), Nn(e, o) + 1).join(\"\");\n            }),\n            (Cr.trimEnd = function (t, n, r) {\n              if ((t = ac(t)) && (r || void 0 === n)) return t.replace(K, \"\");\n              if (!t || !(n = Ye(n))) return t;\n              var e = Zn(t);\n              return fo(e, 0, Nn(e, Zn(n)) + 1).join(\"\");\n            }),\n            (Cr.trimStart = function (t, n, r) {\n              if ((t = ac(t)) && (r || void 0 === n)) return t.replace(X, \"\");\n              if (!t || !(n = Ye(n))) return t;\n              var e = Zn(t);\n              return fo(e, Un(e, Zn(n))).join(\"\");\n            }),\n            (Cr.truncate = function (t, n) {\n              var r = 30,\n                e = \"...\";\n              if (Hu(n)) {\n                var o = \"separator\" in n ? n.separator : o;\n                (r = \"length\" in n ? oc(n.length) : r),\n                  (e = \"omission\" in n ? Ye(n.omission) : e);\n              }\n              var i = (t = ac(t)).length;\n              if (Mn(t)) {\n                var u = Zn(t);\n                i = u.length;\n              }\n              if (r >= i) return t;\n              var c = r - Gn(e);\n              if (c < 1) return e;\n              var a = u ? fo(u, 0, c).join(\"\") : t.slice(0, c);\n              if (void 0 === o) return a + e;\n              if ((u && (c += a.length - c), Ju(o))) {\n                if (t.slice(c).search(o)) {\n                  var s,\n                    f = a;\n                  for (\n                    o.global || (o = _t(o.source, ac(ot.exec(o)) + \"g\")),\n                      o.lastIndex = 0;\n                    (s = o.exec(f));\n\n                  )\n                    var l = s.index;\n                  a = a.slice(0, void 0 === l ? c : l);\n                }\n              } else if (t.indexOf(Ye(o), c) != c) {\n                var p = a.lastIndexOf(o);\n                p > -1 && (a = a.slice(0, p));\n              }\n              return a + e;\n            }),\n            (Cr.unescape = function (t) {\n              return (t = ac(t)) && L.test(t) ? t.replace(z, Jn) : t;\n            }),\n            (Cr.uniqueId = function (t) {\n              var n = ++Ot;\n              return ac(t) + n;\n            }),\n            (Cr.upperCase = Lc),\n            (Cr.upperFirst = qc),\n            (Cr.each = au),\n            (Cr.eachRight = su),\n            (Cr.first = Ni),\n            Kc(\n              Cr,\n              ((la = {}),\n              se(Cr, function (t, n) {\n                St.call(Cr.prototype, n) || (la[n] = t);\n              }),\n              la),\n              { chain: !1 },\n            ),\n            (Cr.VERSION = \"4.17.15\"),\n            sn(\n              [\n                \"bind\",\n                \"bindKey\",\n                \"curry\",\n                \"curryRight\",\n                \"partial\",\n                \"partialRight\",\n              ],\n              function (t) {\n                Cr[t].placeholder = Cr;\n              },\n            ),\n            sn([\"drop\", \"take\"], function (t, n) {\n              (Rr.prototype[t] = function (r) {\n                r = void 0 === r ? 1 : cr(oc(r), 0);\n                var e = this.__filtered__ && !n ? new Rr(this) : this.clone();\n                return (\n                  e.__filtered__\n                    ? (e.__takeCount__ = ar(r, e.__takeCount__))\n                    : e.__views__.push({\n                        size: ar(r, 4294967295),\n                        type: t + (e.__dir__ < 0 ? \"Right\" : \"\"),\n                      }),\n                  e\n                );\n              }),\n                (Rr.prototype[t + \"Right\"] = function (n) {\n                  return this.reverse()[t](n).reverse();\n                });\n            }),\n            sn([\"filter\", \"map\", \"takeWhile\"], function (t, n) {\n              var r = n + 1,\n                e = 1 == r || 3 == r;\n              Rr.prototype[t] = function (t) {\n                var n = this.clone();\n                return (\n                  n.__iteratees__.push({ iteratee: Yo(t, 3), type: r }),\n                  (n.__filtered__ = n.__filtered__ || e),\n                  n\n                );\n              };\n            }),\n            sn([\"head\", \"last\"], function (t, n) {\n              var r = \"take\" + (n ? \"Right\" : \"\");\n              Rr.prototype[t] = function () {\n                return this[r](1).value()[0];\n              };\n            }),\n            sn([\"initial\", \"tail\"], function (t, n) {\n              var r = \"drop\" + (n ? \"\" : \"Right\");\n              Rr.prototype[t] = function () {\n                return this.__filtered__ ? new Rr(this) : this[r](1);\n              };\n            }),\n            (Rr.prototype.compact = function () {\n              return this.filter(Gc);\n            }),\n            (Rr.prototype.find = function (t) {\n              return this.filter(t).head();\n            }),\n            (Rr.prototype.findLast = function (t) {\n              return this.reverse().find(t);\n            }),\n            (Rr.prototype.invokeMap = Le(function (t, n) {\n              return \"function\" == typeof t\n                ? new Rr(this)\n                : this.map(function (r) {\n                    return be(r, t, n);\n                  });\n            })),\n            (Rr.prototype.reject = function (t) {\n              return this.filter(Su(Yo(t)));\n            }),\n            (Rr.prototype.slice = function (t, n) {\n              t = oc(t);\n              var r = this;\n              return r.__filtered__ && (t > 0 || n < 0)\n                ? new Rr(r)\n                : (t < 0 ? (r = r.takeRight(-t)) : t && (r = r.drop(t)),\n                  void 0 !== n &&\n                    (r = (n = oc(n)) < 0 ? r.dropRight(-n) : r.take(n - t)),\n                  r);\n            }),\n            (Rr.prototype.takeRightWhile = function (t) {\n              return this.reverse().takeWhile(t).reverse();\n            }),\n            (Rr.prototype.toArray = function () {\n              return this.take(4294967295);\n            }),\n            se(Rr.prototype, function (t, n) {\n              var r = /^(?:filter|find|map|reject)|While$/.test(n),\n                e = /^(?:head|last)$/.test(n),\n                o = Cr[e ? \"take\" + (\"last\" == n ? \"Right\" : \"\") : n],\n                i = e || /^find/.test(n);\n              o &&\n                (Cr.prototype[n] = function () {\n                  var n = this.__wrapped__,\n                    u = e ? [1] : arguments,\n                    c = n instanceof Rr,\n                    a = u[0],\n                    s = c || Du(n),\n                    f = function (t) {\n                      var n = o.apply(Cr, yn([t], u));\n                      return e && l ? n[0] : n;\n                    };\n                  s &&\n                    r &&\n                    \"function\" == typeof a &&\n                    1 != a.length &&\n                    (c = s = !1);\n                  var l = this.__chain__,\n                    p = !!this.__actions__.length,\n                    h = i && !l,\n                    v = c && !p;\n                  if (!i && s) {\n                    n = v ? n : new Rr(this);\n                    var d = t.apply(n, u);\n                    return (\n                      d.__actions__.push({\n                        func: eu,\n                        args: [f],\n                        thisArg: void 0,\n                      }),\n                      new kr(d, l)\n                    );\n                  }\n                  return h && v\n                    ? t.apply(this, u)\n                    : ((d = this.thru(f)),\n                      h ? (e ? d.value()[0] : d.value()) : d);\n                });\n            }),\n            sn(\n              [\"pop\", \"push\", \"shift\", \"sort\", \"splice\", \"unshift\"],\n              function (t) {\n                var n = mt[t],\n                  r = /^(?:push|sort|unshift)$/.test(t) ? \"tap\" : \"thru\",\n                  e = /^(?:pop|shift)$/.test(t);\n                Cr.prototype[t] = function () {\n                  var t = arguments;\n                  if (e && !this.__chain__) {\n                    var o = this.value();\n                    return n.apply(Du(o) ? o : [], t);\n                  }\n                  return this[r](function (r) {\n                    return n.apply(Du(r) ? r : [], t);\n                  });\n                };\n              },\n            ),\n            se(Rr.prototype, function (t, n) {\n              var r = Cr[n];\n              if (r) {\n                var e = r.name + \"\";\n                St.call(mr, e) || (mr[e] = []),\n                  mr[e].push({ name: n, func: r });\n              }\n            }),\n            (mr[Io(void 0, 2).name] = [{ name: \"wrapper\", func: void 0 }]),\n            (Rr.prototype.clone = function () {\n              var t = new Rr(this.__wrapped__);\n              return (\n                (t.__actions__ = bo(this.__actions__)),\n                (t.__dir__ = this.__dir__),\n                (t.__filtered__ = this.__filtered__),\n                (t.__iteratees__ = bo(this.__iteratees__)),\n                (t.__takeCount__ = this.__takeCount__),\n                (t.__views__ = bo(this.__views__)),\n                t\n              );\n            }),\n            (Rr.prototype.reverse = function () {\n              if (this.__filtered__) {\n                var t = new Rr(this);\n                (t.__dir__ = -1), (t.__filtered__ = !0);\n              } else (t = this.clone()).__dir__ *= -1;\n              return t;\n            }),\n            (Rr.prototype.value = function () {\n              var t = this.__wrapped__.value(),\n                n = this.__dir__,\n                r = Du(t),\n                e = n < 0,\n                o = r ? t.length : 0,\n                i = (function (t, n, r) {\n                  var e = -1,\n                    o = r.length;\n                  for (; ++e < o; ) {\n                    var i = r[e],\n                      u = i.size;\n                    switch (i.type) {\n                      case \"drop\":\n                        t += u;\n                        break;\n                      case \"dropRight\":\n                        n -= u;\n                        break;\n                      case \"take\":\n                        n = ar(n, t + u);\n                        break;\n                      case \"takeRight\":\n                        t = cr(t, n - u);\n                    }\n                  }\n                  return { start: t, end: n };\n                })(0, o, this.__views__),\n                u = i.start,\n                c = i.end,\n                a = c - u,\n                s = e ? c : u - 1,\n                f = this.__iteratees__,\n                l = f.length,\n                p = 0,\n                h = ar(a, this.__takeCount__);\n              if (!r || (!e && o == a && h == a))\n                return eo(t, this.__actions__);\n              var v = [];\n              t: for (; a-- && p < h; ) {\n                for (var d = -1, y = t[(s += n)]; ++d < l; ) {\n                  var _ = f[d],\n                    g = _.iteratee,\n                    b = _.type,\n                    m = g(y);\n                  if (2 == b) y = m;\n                  else if (!m) {\n                    if (1 == b) continue t;\n                    break t;\n                  }\n                }\n                v[p++] = y;\n              }\n              return v;\n            }),\n            (Cr.prototype.at = ou),\n            (Cr.prototype.chain = function () {\n              return ru(this);\n            }),\n            (Cr.prototype.commit = function () {\n              return new kr(this.value(), this.__chain__);\n            }),\n            (Cr.prototype.next = function () {\n              void 0 === this.__values__ &&\n                (this.__values__ = rc(this.value()));\n              var t = this.__index__ >= this.__values__.length;\n              return {\n                done: t,\n                value: t ? void 0 : this.__values__[this.__index__++],\n              };\n            }),\n            (Cr.prototype.plant = function (t) {\n              for (var n, r = this; r instanceof Pr; ) {\n                var e = Ci(r);\n                (e.__index__ = 0),\n                  (e.__values__ = void 0),\n                  n ? (o.__wrapped__ = e) : (n = e);\n                var o = e;\n                r = r.__wrapped__;\n              }\n              return (o.__wrapped__ = t), n;\n            }),\n            (Cr.prototype.reverse = function () {\n              var t = this.__wrapped__;\n              if (t instanceof Rr) {\n                var n = t;\n                return (\n                  this.__actions__.length && (n = new Rr(this)),\n                  (n = n.reverse()).__actions__.push({\n                    func: eu,\n                    args: [Hi],\n                    thisArg: void 0,\n                  }),\n                  new kr(n, this.__chain__)\n                );\n              }\n              return this.thru(Hi);\n            }),\n            (Cr.prototype.toJSON =\n              Cr.prototype.valueOf =\n              Cr.prototype.value =\n                function () {\n                  return eo(this.__wrapped__, this.__actions__);\n                }),\n            (Cr.prototype.first = Cr.prototype.head),\n            Qt &&\n              (Cr.prototype[Qt] = function () {\n                return this;\n              }),\n            Cr\n          );\n        })();\n        \"object\" == i(r(46)) && r(46)\n          ? ((Zt._ = Xn),\n            void 0 ===\n              (o = function () {\n                return Xn;\n              }.call(n, r, n, e)) || (e.exports = o))\n          : Xt\n            ? (((Xt.exports = Xn)._ = Xn), (Jt._ = Xn))\n            : (Zt._ = Xn);\n      }).call(this);\n    }).call(this, r(11), r(14)(t));\n  },\n  function (t, n, r) {\n    var e = r(87);\n    t.exports = {\n      Graph: e.Graph,\n      json: r(213),\n      alg: r(214),\n      version: e.version,\n    };\n  },\n  function (t, n, r) {\n    t.exports = { Graph: r(28), version: r(212) };\n  },\n  function (t, n, r) {\n    var e = r(89);\n    t.exports = function (t) {\n      return e(t, 4);\n    };\n  },\n  function (t, n, r) {\n    var e = r(29),\n      o = r(33),\n      i = r(49),\n      u = r(118),\n      c = r(124),\n      a = r(127),\n      s = r(128),\n      f = r(129),\n      l = r(130),\n      p = r(59),\n      h = r(131),\n      v = r(10),\n      d = r(135),\n      y = r(136),\n      _ = r(141),\n      g = r(0),\n      b = r(12),\n      m = r(142),\n      w = r(5),\n      x = r(144),\n      j = r(6),\n      E = {};\n    (E[\"[object Arguments]\"] =\n      E[\"[object Array]\"] =\n      E[\"[object ArrayBuffer]\"] =\n      E[\"[object DataView]\"] =\n      E[\"[object Boolean]\"] =\n      E[\"[object Date]\"] =\n      E[\"[object Float32Array]\"] =\n      E[\"[object Float64Array]\"] =\n      E[\"[object Int8Array]\"] =\n      E[\"[object Int16Array]\"] =\n      E[\"[object Int32Array]\"] =\n      E[\"[object Map]\"] =\n      E[\"[object Number]\"] =\n      E[\"[object Object]\"] =\n      E[\"[object RegExp]\"] =\n      E[\"[object Set]\"] =\n      E[\"[object String]\"] =\n      E[\"[object Symbol]\"] =\n      E[\"[object Uint8Array]\"] =\n      E[\"[object Uint8ClampedArray]\"] =\n      E[\"[object Uint16Array]\"] =\n      E[\"[object Uint32Array]\"] =\n        !0),\n      (E[\"[object Error]\"] =\n        E[\"[object Function]\"] =\n        E[\"[object WeakMap]\"] =\n          !1),\n      (t.exports = function t(n, r, S, O, A, T) {\n        var C,\n          I = 1 & r,\n          P = 2 & r,\n          k = 4 & r;\n        if ((S && (C = A ? S(n, O, A, T) : S(n)), void 0 !== C)) return C;\n        if (!w(n)) return n;\n        var R = g(n);\n        if (R) {\n          if (((C = d(n)), !I)) return s(n, C);\n        } else {\n          var D = v(n),\n            U = \"[object Function]\" == D || \"[object GeneratorFunction]\" == D;\n          if (b(n)) return a(n, I);\n          if (\n            \"[object Object]\" == D ||\n            \"[object Arguments]\" == D ||\n            (U && !A)\n          ) {\n            if (((C = P || U ? {} : _(n)), !I))\n              return P ? l(n, c(C, n)) : f(n, u(C, n));\n          } else {\n            if (!E[D]) return A ? n : {};\n            C = y(n, D, I);\n          }\n        }\n        T || (T = new e());\n        var N = T.get(n);\n        if (N) return N;\n        T.set(n, C),\n          x(n)\n            ? n.forEach(function (e) {\n                C.add(t(e, r, S, e, n, T));\n              })\n            : m(n) &&\n              n.forEach(function (e, o) {\n                C.set(o, t(e, r, S, o, n, T));\n              });\n        var z = k ? (P ? h : p) : P ? keysIn : j,\n          F = R ? void 0 : z(n);\n        return (\n          o(F || n, function (e, o) {\n            F && (e = n[(o = e)]), i(C, o, t(e, r, S, o, n, T));\n          }),\n          C\n        );\n      });\n  },\n  function (t, n) {\n    t.exports = function () {\n      (this.__data__ = []), (this.size = 0);\n    };\n  },\n  function (t, n, r) {\n    var e = r(16),\n      o = Array.prototype.splice;\n    t.exports = function (t) {\n      var n = this.__data__,\n        r = e(n, t);\n      return (\n        !(r < 0) &&\n        (r == n.length - 1 ? n.pop() : o.call(n, r, 1), --this.size, !0)\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(16);\n    t.exports = function (t) {\n      var n = this.__data__,\n        r = e(n, t);\n      return r < 0 ? void 0 : n[r][1];\n    };\n  },\n  function (t, n, r) {\n    var e = r(16);\n    t.exports = function (t) {\n      return e(this.__data__, t) > -1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(16);\n    t.exports = function (t, n) {\n      var r = this.__data__,\n        o = e(r, t);\n      return o < 0 ? (++this.size, r.push([t, n])) : (r[o][1] = n), this;\n    };\n  },\n  function (t, n, r) {\n    var e = r(15);\n    t.exports = function () {\n      (this.__data__ = new e()), (this.size = 0);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      var n = this.__data__,\n        r = n.delete(t);\n      return (this.size = n.size), r;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return this.__data__.get(t);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return this.__data__.has(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(15),\n      o = r(31),\n      i = r(32);\n    t.exports = function (t, n) {\n      var r = this.__data__;\n      if (r instanceof e) {\n        var u = r.__data__;\n        if (!o || u.length < 199)\n          return u.push([t, n]), (this.size = ++r.size), this;\n        r = this.__data__ = new i(u);\n      }\n      return r.set(t, n), (this.size = r.size), this;\n    };\n  },\n  function (t, n, r) {\n    var e = r(17),\n      o = r(103),\n      i = r(5),\n      u = r(48),\n      c = /^\\[object .+?Constructor\\]$/,\n      a = Function.prototype,\n      s = Object.prototype,\n      f = a.toString,\n      l = s.hasOwnProperty,\n      p = RegExp(\n        \"^\" +\n          f\n            .call(l)\n            .replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\")\n            .replace(\n              /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n              \"$1.*?\",\n            ) +\n          \"$\",\n      );\n    t.exports = function (t) {\n      return !(!i(t) || o(t)) && (e(t) ? p : c).test(u(t));\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = Object.prototype,\n      i = o.hasOwnProperty,\n      u = o.toString,\n      c = e ? e.toStringTag : void 0;\n    t.exports = function (t) {\n      var n = i.call(t, c),\n        r = t[c];\n      try {\n        t[c] = void 0;\n        var e = !0;\n      } catch (t) {}\n      var o = u.call(t);\n      return e && (n ? (t[c] = r) : delete t[c]), o;\n    };\n  },\n  function (t, n) {\n    var r = Object.prototype.toString;\n    t.exports = function (t) {\n      return r.call(t);\n    };\n  },\n  function (t, n, r) {\n    var e,\n      o = r(104),\n      i = (e = /[^.]+$/.exec((o && o.keys && o.keys.IE_PROTO) || \"\"))\n        ? \"Symbol(src)_1.\" + e\n        : \"\";\n    t.exports = function (t) {\n      return !!i && i in t;\n    };\n  },\n  function (t, n, r) {\n    var e = r(2)[\"__core-js_shared__\"];\n    t.exports = e;\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return null == t ? void 0 : t[n];\n    };\n  },\n  function (t, n, r) {\n    var e = r(107),\n      o = r(15),\n      i = r(31);\n    t.exports = function () {\n      (this.size = 0),\n        (this.__data__ = {\n          hash: new e(),\n          map: new (i || o)(),\n          string: new e(),\n        });\n    };\n  },\n  function (t, n, r) {\n    var e = r(108),\n      o = r(109),\n      i = r(110),\n      u = r(111),\n      c = r(112);\n    function a(t) {\n      var n = -1,\n        r = null == t ? 0 : t.length;\n      for (this.clear(); ++n < r; ) {\n        var e = t[n];\n        this.set(e[0], e[1]);\n      }\n    }\n    (a.prototype.clear = e),\n      (a.prototype.delete = o),\n      (a.prototype.get = i),\n      (a.prototype.has = u),\n      (a.prototype.set = c),\n      (t.exports = a);\n  },\n  function (t, n, r) {\n    var e = r(18);\n    t.exports = function () {\n      (this.__data__ = e ? e(null) : {}), (this.size = 0);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      var n = this.has(t) && delete this.__data__[t];\n      return (this.size -= n ? 1 : 0), n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(18),\n      o = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      var n = this.__data__;\n      if (e) {\n        var r = n[t];\n        return \"__lodash_hash_undefined__\" === r ? void 0 : r;\n      }\n      return o.call(n, t) ? n[t] : void 0;\n    };\n  },\n  function (t, n, r) {\n    var e = r(18),\n      o = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      var n = this.__data__;\n      return e ? void 0 !== n[t] : o.call(n, t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(18);\n    t.exports = function (t, n) {\n      var r = this.__data__;\n      return (\n        (this.size += this.has(t) ? 0 : 1),\n        (r[t] = e && void 0 === n ? \"__lodash_hash_undefined__\" : n),\n        this\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(19);\n    t.exports = function (t) {\n      var n = e(this, t).delete(t);\n      return (this.size -= n ? 1 : 0), n;\n    };\n  },\n  function (t, n) {\n    function r(t) {\n      return (r =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    t.exports = function (t) {\n      var n = r(t);\n      return \"string\" == n || \"number\" == n || \"symbol\" == n || \"boolean\" == n\n        ? \"__proto__\" !== t\n        : null === t;\n    };\n  },\n  function (t, n, r) {\n    var e = r(19);\n    t.exports = function (t) {\n      return e(this, t).get(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(19);\n    t.exports = function (t) {\n      return e(this, t).has(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(19);\n    t.exports = function (t, n) {\n      var r = e(this, t),\n        o = r.size;\n      return r.set(t, n), (this.size += r.size == o ? 0 : 1), this;\n    };\n  },\n  function (t, n, r) {\n    var e = r(20),\n      o = r(6);\n    t.exports = function (t, n) {\n      return t && e(n, o(n), t);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (var r = -1, e = Array(t); ++r < t; ) e[r] = n(r);\n      return e;\n    };\n  },\n  function (t, n, r) {\n    var e = r(8),\n      o = r(3);\n    t.exports = function (t) {\n      return o(t) && \"[object Arguments]\" == e(t);\n    };\n  },\n  function (t, n) {\n    t.exports = function () {\n      return !1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(8),\n      o = r(34),\n      i = r(3),\n      u = {};\n    (u[\"[object Float32Array]\"] =\n      u[\"[object Float64Array]\"] =\n      u[\"[object Int8Array]\"] =\n      u[\"[object Int16Array]\"] =\n      u[\"[object Int32Array]\"] =\n      u[\"[object Uint8Array]\"] =\n      u[\"[object Uint8ClampedArray]\"] =\n      u[\"[object Uint16Array]\"] =\n      u[\"[object Uint32Array]\"] =\n        !0),\n      (u[\"[object Arguments]\"] =\n        u[\"[object Array]\"] =\n        u[\"[object ArrayBuffer]\"] =\n        u[\"[object Boolean]\"] =\n        u[\"[object DataView]\"] =\n        u[\"[object Date]\"] =\n        u[\"[object Error]\"] =\n        u[\"[object Function]\"] =\n        u[\"[object Map]\"] =\n        u[\"[object Number]\"] =\n        u[\"[object Object]\"] =\n        u[\"[object RegExp]\"] =\n        u[\"[object Set]\"] =\n        u[\"[object String]\"] =\n        u[\"[object WeakMap]\"] =\n          !1),\n      (t.exports = function (t) {\n        return i(t) && o(t.length) && !!u[e(t)];\n      });\n  },\n  function (t, n, r) {\n    var e = r(54)(Object.keys, Object);\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(20),\n      o = r(55);\n    t.exports = function (t, n) {\n      return t && e(n, o(n), t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(5),\n      o = r(23),\n      i = r(126),\n      u = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      if (!e(t)) return i(t);\n      var n = o(t),\n        r = [];\n      for (var c in t)\n        (\"constructor\" != c || (!n && u.call(t, c))) && r.push(c);\n      return r;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      var n = [];\n      if (null != t) for (var r in Object(t)) n.push(r);\n      return n;\n    };\n  },\n  function (t, n, r) {\n    (function (t) {\n      function e(t) {\n        return (e =\n          \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n            ? function (t) {\n                return typeof t;\n              }\n            : function (t) {\n                return t &&\n                  \"function\" == typeof Symbol &&\n                  t.constructor === Symbol &&\n                  t !== Symbol.prototype\n                  ? \"symbol\"\n                  : typeof t;\n              })(t);\n      }\n      var o = r(2),\n        i = \"object\" == e(n) && n && !n.nodeType && n,\n        u = i && \"object\" == e(t) && t && !t.nodeType && t,\n        c = u && u.exports === i ? o.Buffer : void 0,\n        a = c ? c.allocUnsafe : void 0;\n      t.exports = function (t, n) {\n        if (n) return t.slice();\n        var r = t.length,\n          e = a ? a(r) : new t.constructor(r);\n        return t.copy(e), e;\n      };\n    }).call(this, r(14)(t));\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      var r = -1,\n        e = t.length;\n      for (n || (n = Array(e)); ++r < e; ) n[r] = t[r];\n      return n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(20),\n      o = r(38);\n    t.exports = function (t, n) {\n      return e(t, o(t), n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(20),\n      o = r(58);\n    t.exports = function (t, n) {\n      return e(t, o(t), n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(60),\n      o = r(58),\n      i = r(55);\n    t.exports = function (t) {\n      return e(t, i, o);\n    };\n  },\n  function (t, n, r) {\n    var e = r(4)(r(2), \"DataView\");\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(4)(r(2), \"Promise\");\n    t.exports = e;\n  },\n  function (t, n, r) {\n    var e = r(4)(r(2), \"WeakMap\");\n    t.exports = e;\n  },\n  function (t, n) {\n    var r = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      var n = t.length,\n        e = new t.constructor(n);\n      return (\n        n &&\n          \"string\" == typeof t[0] &&\n          r.call(t, \"index\") &&\n          ((e.index = t.index), (e.input = t.input)),\n        e\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(41),\n      o = r(137),\n      i = r(138),\n      u = r(139),\n      c = r(140);\n    t.exports = function (t, n, r) {\n      var a = t.constructor;\n      switch (n) {\n        case \"[object ArrayBuffer]\":\n          return e(t);\n        case \"[object Boolean]\":\n        case \"[object Date]\":\n          return new a(+t);\n        case \"[object DataView]\":\n          return o(t, r);\n        case \"[object Float32Array]\":\n        case \"[object Float64Array]\":\n        case \"[object Int8Array]\":\n        case \"[object Int16Array]\":\n        case \"[object Int32Array]\":\n        case \"[object Uint8Array]\":\n        case \"[object Uint8ClampedArray]\":\n        case \"[object Uint16Array]\":\n        case \"[object Uint32Array]\":\n          return c(t, r);\n        case \"[object Map]\":\n          return new a();\n        case \"[object Number]\":\n        case \"[object String]\":\n          return new a(t);\n        case \"[object RegExp]\":\n          return i(t);\n        case \"[object Set]\":\n          return new a();\n        case \"[object Symbol]\":\n          return u(t);\n      }\n    };\n  },\n  function (t, n, r) {\n    var e = r(41);\n    t.exports = function (t, n) {\n      var r = n ? e(t.buffer) : t.buffer;\n      return new t.constructor(r, t.byteOffset, t.byteLength);\n    };\n  },\n  function (t, n) {\n    var r = /\\w*$/;\n    t.exports = function (t) {\n      var n = new t.constructor(t.source, r.exec(t));\n      return (n.lastIndex = t.lastIndex), n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = e ? e.prototype : void 0,\n      i = o ? o.valueOf : void 0;\n    t.exports = function (t) {\n      return i ? Object(i.call(t)) : {};\n    };\n  },\n  function (t, n, r) {\n    var e = r(41);\n    t.exports = function (t, n) {\n      var r = n ? e(t.buffer) : t.buffer;\n      return new t.constructor(r, t.byteOffset, t.length);\n    };\n  },\n  function (t, n, r) {\n    var e = r(63),\n      o = r(40),\n      i = r(23);\n    t.exports = function (t) {\n      return \"function\" != typeof t.constructor || i(t) ? {} : e(o(t));\n    };\n  },\n  function (t, n, r) {\n    var e = r(143),\n      o = r(35),\n      i = r(36),\n      u = i && i.isMap,\n      c = u ? o(u) : e;\n    t.exports = c;\n  },\n  function (t, n, r) {\n    var e = r(10),\n      o = r(3);\n    t.exports = function (t) {\n      return o(t) && \"[object Map]\" == e(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(145),\n      o = r(35),\n      i = r(36),\n      u = i && i.isSet,\n      c = u ? o(u) : e;\n    t.exports = c;\n  },\n  function (t, n, r) {\n    var e = r(10),\n      o = r(3);\n    t.exports = function (t) {\n      return o(t) && \"[object Set]\" == e(t);\n    };\n  },\n  function (t, n, r) {\n    t.exports = r(147);\n  },\n  function (t, n, r) {\n    var e = r(33),\n      o = r(24),\n      i = r(151),\n      u = r(0);\n    t.exports = function (t, n) {\n      return (u(t) ? e : o)(t, i(n));\n    };\n  },\n  function (t, n, r) {\n    var e = r(149)();\n    t.exports = e;\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return function (n, r, e) {\n        for (var o = -1, i = Object(n), u = e(n), c = u.length; c--; ) {\n          var a = u[t ? c : ++o];\n          if (!1 === r(i[a], a, i)) break;\n        }\n        return n;\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(7);\n    t.exports = function (t, n) {\n      return function (r, o) {\n        if (null == r) return r;\n        if (!e(r)) return t(r, o);\n        for (\n          var i = r.length, u = n ? i : -1, c = Object(r);\n          (n ? u-- : ++u < i) && !1 !== o(c[u], u, c);\n\n        );\n        return r;\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(25);\n    t.exports = function (t) {\n      return \"function\" == typeof t ? t : e;\n    };\n  },\n  function (t, n, r) {\n    var e = r(56),\n      o = r(153),\n      i = r(26),\n      u = r(0);\n    t.exports = function (t, n) {\n      return (u(t) ? e : o)(t, i(n, 3));\n    };\n  },\n  function (t, n, r) {\n    var e = r(24);\n    t.exports = function (t, n) {\n      var r = [];\n      return (\n        e(t, function (t, e, o) {\n          n(t, e, o) && r.push(t);\n        }),\n        r\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(155),\n      o = r(163),\n      i = r(71);\n    t.exports = function (t) {\n      var n = o(t);\n      return 1 == n.length && n[0][2]\n        ? i(n[0][0], n[0][1])\n        : function (r) {\n            return r === t || e(r, t, n);\n          };\n    };\n  },\n  function (t, n, r) {\n    var e = r(29),\n      o = r(66);\n    t.exports = function (t, n, r, i) {\n      var u = r.length,\n        c = u,\n        a = !i;\n      if (null == t) return !c;\n      for (t = Object(t); u--; ) {\n        var s = r[u];\n        if (a && s[2] ? s[1] !== t[s[0]] : !(s[0] in t)) return !1;\n      }\n      for (; ++u < c; ) {\n        var f = (s = r[u])[0],\n          l = t[f],\n          p = s[1];\n        if (a && s[2]) {\n          if (void 0 === l && !(f in t)) return !1;\n        } else {\n          var h = new e();\n          if (i) var v = i(l, p, f, t, n, h);\n          if (!(void 0 === v ? o(p, l, 3, i, h) : v)) return !1;\n        }\n      }\n      return !0;\n    };\n  },\n  function (t, n, r) {\n    var e = r(29),\n      o = r(67),\n      i = r(160),\n      u = r(162),\n      c = r(10),\n      a = r(0),\n      s = r(12),\n      f = r(22),\n      l = \"[object Object]\",\n      p = Object.prototype.hasOwnProperty;\n    t.exports = function (t, n, r, h, v, d) {\n      var y = a(t),\n        _ = a(n),\n        g = y ? \"[object Array]\" : c(t),\n        b = _ ? \"[object Array]\" : c(n),\n        m = (g = \"[object Arguments]\" == g ? l : g) == l,\n        w = (b = \"[object Arguments]\" == b ? l : b) == l,\n        x = g == b;\n      if (x && s(t)) {\n        if (!s(n)) return !1;\n        (y = !0), (m = !1);\n      }\n      if (x && !m)\n        return (\n          d || (d = new e()),\n          y || f(t) ? o(t, n, r, h, v, d) : i(t, n, g, r, h, v, d)\n        );\n      if (!(1 & r)) {\n        var j = m && p.call(t, \"__wrapped__\"),\n          E = w && p.call(n, \"__wrapped__\");\n        if (j || E) {\n          var S = j ? t.value() : t,\n            O = E ? n.value() : n;\n          return d || (d = new e()), v(S, O, r, h, d);\n        }\n      }\n      return !!x && (d || (d = new e()), u(t, n, r, h, v, d));\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return this.__data__.set(t, \"__lodash_hash_undefined__\"), this;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return this.__data__.has(t);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      for (var r = -1, e = null == t ? 0 : t.length; ++r < e; )\n        if (n(t[r], r, t)) return !0;\n      return !1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = r(62),\n      i = r(30),\n      u = r(67),\n      c = r(161),\n      a = r(42),\n      s = e ? e.prototype : void 0,\n      f = s ? s.valueOf : void 0;\n    t.exports = function (t, n, r, e, s, l, p) {\n      switch (r) {\n        case \"[object DataView]\":\n          if (t.byteLength != n.byteLength || t.byteOffset != n.byteOffset)\n            return !1;\n          (t = t.buffer), (n = n.buffer);\n        case \"[object ArrayBuffer]\":\n          return !(t.byteLength != n.byteLength || !l(new o(t), new o(n)));\n        case \"[object Boolean]\":\n        case \"[object Date]\":\n        case \"[object Number]\":\n          return i(+t, +n);\n        case \"[object Error]\":\n          return t.name == n.name && t.message == n.message;\n        case \"[object RegExp]\":\n        case \"[object String]\":\n          return t == n + \"\";\n        case \"[object Map]\":\n          var h = c;\n        case \"[object Set]\":\n          var v = 1 & e;\n          if ((h || (h = a), t.size != n.size && !v)) return !1;\n          var d = p.get(t);\n          if (d) return d == n;\n          (e |= 2), p.set(t, n);\n          var y = u(h(t), h(n), e, s, l, p);\n          return p.delete(t), y;\n        case \"[object Symbol]\":\n          if (f) return f.call(t) == f.call(n);\n      }\n      return !1;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      var n = -1,\n        r = Array(t.size);\n      return (\n        t.forEach(function (t, e) {\n          r[++n] = [e, t];\n        }),\n        r\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(59),\n      o = Object.prototype.hasOwnProperty;\n    t.exports = function (t, n, r, i, u, c) {\n      var a = 1 & r,\n        s = e(t),\n        f = s.length;\n      if (f != e(n).length && !a) return !1;\n      for (var l = f; l--; ) {\n        var p = s[l];\n        if (!(a ? p in n : o.call(n, p))) return !1;\n      }\n      var h = c.get(t);\n      if (h && c.get(n)) return h == n;\n      var v = !0;\n      c.set(t, n), c.set(n, t);\n      for (var d = a; ++l < f; ) {\n        var y = t[(p = s[l])],\n          _ = n[p];\n        if (i) var g = a ? i(_, y, p, n, t, c) : i(y, _, p, t, n, c);\n        if (!(void 0 === g ? y === _ || u(y, _, r, i, c) : g)) {\n          v = !1;\n          break;\n        }\n        d || (d = \"constructor\" == p);\n      }\n      if (v && !d) {\n        var b = t.constructor,\n          m = n.constructor;\n        b != m &&\n          \"constructor\" in t &&\n          \"constructor\" in n &&\n          !(\n            \"function\" == typeof b &&\n            b instanceof b &&\n            \"function\" == typeof m &&\n            m instanceof m\n          ) &&\n          (v = !1);\n      }\n      return c.delete(t), c.delete(n), v;\n    };\n  },\n  function (t, n, r) {\n    var e = r(70),\n      o = r(6);\n    t.exports = function (t) {\n      for (var n = o(t), r = n.length; r--; ) {\n        var i = n[r],\n          u = t[i];\n        n[r] = [i, u, e(u)];\n      }\n      return n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(66),\n      o = r(165),\n      i = r(171),\n      u = r(43),\n      c = r(70),\n      a = r(71),\n      s = r(27);\n    t.exports = function (t, n) {\n      return u(t) && c(n)\n        ? a(s(t), n)\n        : function (r) {\n            var u = o(r, t);\n            return void 0 === u && u === n ? i(r, t) : e(n, u, 3);\n          };\n    };\n  },\n  function (t, n, r) {\n    var e = r(72);\n    t.exports = function (t, n, r) {\n      var o = null == t ? void 0 : e(t, n);\n      return void 0 === o ? r : o;\n    };\n  },\n  function (t, n, r) {\n    var e = r(167),\n      o =\n        /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,\n      i = /\\\\(\\\\)?/g,\n      u = e(function (t) {\n        var n = [];\n        return (\n          46 === t.charCodeAt(0) && n.push(\"\"),\n          t.replace(o, function (t, r, e, o) {\n            n.push(e ? o.replace(i, \"$1\") : r || t);\n          }),\n          n\n        );\n      });\n    t.exports = u;\n  },\n  function (t, n, r) {\n    var e = r(168);\n    t.exports = function (t) {\n      var n = e(t, function (t) {\n          return 500 === r.size && r.clear(), t;\n        }),\n        r = n.cache;\n      return n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(32);\n    function o(t, n) {\n      if (\"function\" != typeof t || (null != n && \"function\" != typeof n))\n        throw new TypeError(\"Expected a function\");\n      var r = function r() {\n        var e = arguments,\n          o = n ? n.apply(this, e) : e[0],\n          i = r.cache;\n        if (i.has(o)) return i.get(o);\n        var u = t.apply(this, e);\n        return (r.cache = i.set(o, u) || i), u;\n      };\n      return (r.cache = new (o.Cache || e)()), r;\n    }\n    (o.Cache = e), (t.exports = o);\n  },\n  function (t, n, r) {\n    var e = r(170);\n    t.exports = function (t) {\n      return null == t ? \"\" : e(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = r(45),\n      i = r(0),\n      u = r(44),\n      c = e ? e.prototype : void 0,\n      a = c ? c.toString : void 0;\n    t.exports = function t(n) {\n      if (\"string\" == typeof n) return n;\n      if (i(n)) return o(n, t) + \"\";\n      if (u(n)) return a ? a.call(n) : \"\";\n      var r = n + \"\";\n      return \"0\" == r && 1 / n == -1 / 0 ? \"-0\" : r;\n    };\n  },\n  function (t, n, r) {\n    var e = r(172),\n      o = r(74);\n    t.exports = function (t, n) {\n      return null != t && o(t, n, e);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n) {\n      return null != t && n in Object(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(75),\n      o = r(174),\n      i = r(43),\n      u = r(27);\n    t.exports = function (t) {\n      return i(t) ? e(u(t)) : o(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(72);\n    t.exports = function (t) {\n      return function (n) {\n        return e(n, t);\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(176),\n      o = r(74);\n    t.exports = function (t, n) {\n      return null != t && o(t, n, e);\n    };\n  },\n  function (t, n) {\n    var r = Object.prototype.hasOwnProperty;\n    t.exports = function (t, n) {\n      return null != t && r.call(t, n);\n    };\n  },\n  function (t, n, r) {\n    var e = r(37),\n      o = r(10),\n      i = r(21),\n      u = r(0),\n      c = r(7),\n      a = r(12),\n      s = r(23),\n      f = r(22),\n      l = Object.prototype.hasOwnProperty;\n    t.exports = function (t) {\n      if (null == t) return !0;\n      if (\n        c(t) &&\n        (u(t) ||\n          \"string\" == typeof t ||\n          \"function\" == typeof t.splice ||\n          a(t) ||\n          f(t) ||\n          i(t))\n      )\n        return !t.length;\n      var n = o(t);\n      if (\"[object Map]\" == n || \"[object Set]\" == n) return !t.size;\n      if (s(t)) return !e(t).length;\n      for (var r in t) if (l.call(t, r)) return !1;\n      return !0;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return void 0 === t;\n    };\n  },\n  function (t, n, r) {\n    var e = r(45),\n      o = r(26),\n      i = r(180),\n      u = r(0);\n    t.exports = function (t, n) {\n      return (u(t) ? e : i)(t, o(n, 3));\n    };\n  },\n  function (t, n, r) {\n    var e = r(24),\n      o = r(7);\n    t.exports = function (t, n) {\n      var r = -1,\n        i = o(t) ? Array(t.length) : [];\n      return (\n        e(t, function (t, e, o) {\n          i[++r] = n(t, e, o);\n        }),\n        i\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(182),\n      o = r(24),\n      i = r(26),\n      u = r(183),\n      c = r(0);\n    t.exports = function (t, n, r) {\n      var a = c(t) ? e : u,\n        s = arguments.length < 3;\n      return a(t, i(n, 4), r, s, o);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r, e) {\n      var o = -1,\n        i = null == t ? 0 : t.length;\n      for (e && i && (r = t[++o]); ++o < i; ) r = n(r, t[o], o, t);\n      return r;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r, e, o) {\n      return (\n        o(t, function (t, o, i) {\n          r = e ? ((e = !1), t) : n(r, t, o, i);\n        }),\n        r\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(37),\n      o = r(10),\n      i = r(7),\n      u = r(185),\n      c = r(186);\n    t.exports = function (t) {\n      if (null == t) return 0;\n      if (i(t)) return u(t) ? c(t) : t.length;\n      var n = o(t);\n      return \"[object Map]\" == n || \"[object Set]\" == n ? t.size : e(t).length;\n    };\n  },\n  function (t, n, r) {\n    var e = r(8),\n      o = r(0),\n      i = r(3);\n    t.exports = function (t) {\n      return (\n        \"string\" == typeof t || (!o(t) && i(t) && \"[object String]\" == e(t))\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(187),\n      o = r(188),\n      i = r(189);\n    t.exports = function (t) {\n      return o(t) ? i(t) : e(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(75)(\"length\");\n    t.exports = e;\n  },\n  function (t, n) {\n    var r = RegExp(\n      \"[\\\\u200d\\\\ud800-\\\\udfff\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\\\\ufe0e\\\\ufe0f]\",\n    );\n    t.exports = function (t) {\n      return r.test(t);\n    };\n  },\n  function (t, n) {\n    var r = \"[\\\\ud800-\\\\udfff]\",\n      e = \"[\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff]\",\n      o = \"\\\\ud83c[\\\\udffb-\\\\udfff]\",\n      i = \"[^\\\\ud800-\\\\udfff]\",\n      u = \"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",\n      c = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",\n      a = \"(?:\" + e + \"|\" + o + \")\" + \"?\",\n      s =\n        \"[\\\\ufe0e\\\\ufe0f]?\" +\n        a +\n        (\"(?:\\\\u200d(?:\" +\n          [i, u, c].join(\"|\") +\n          \")[\\\\ufe0e\\\\ufe0f]?\" +\n          a +\n          \")*\"),\n      f = \"(?:\" + [i + e + \"?\", e, u, c, r].join(\"|\") + \")\",\n      l = RegExp(o + \"(?=\" + o + \")|\" + f + s, \"g\");\n    t.exports = function (t) {\n      for (var n = (l.lastIndex = 0); l.test(t); ) ++n;\n      return n;\n    };\n  },\n  function (t, n, r) {\n    var e = r(33),\n      o = r(63),\n      i = r(65),\n      u = r(26),\n      c = r(40),\n      a = r(0),\n      s = r(12),\n      f = r(17),\n      l = r(5),\n      p = r(22);\n    t.exports = function (t, n, r) {\n      var h = a(t),\n        v = h || s(t) || p(t);\n      if (((n = u(n, 4)), null == r)) {\n        var d = t && t.constructor;\n        r = v ? (h ? new d() : []) : l(t) && f(d) ? o(c(t)) : {};\n      }\n      return (\n        (v ? e : i)(t, function (t, e, o) {\n          return n(r, t, e, o);\n        }),\n        r\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(192),\n      o = r(194),\n      i = r(200),\n      u = r(209),\n      c = o(function (t) {\n        return i(e(t, 1, u, !0));\n      });\n    t.exports = c;\n  },\n  function (t, n, r) {\n    var e = r(39),\n      o = r(193);\n    t.exports = function t(n, r, i, u, c) {\n      var a = -1,\n        s = n.length;\n      for (i || (i = o), c || (c = []); ++a < s; ) {\n        var f = n[a];\n        r > 0 && i(f)\n          ? r > 1\n            ? t(f, r - 1, i, u, c)\n            : e(c, f)\n          : u || (c[c.length] = f);\n      }\n      return c;\n    };\n  },\n  function (t, n, r) {\n    var e = r(9),\n      o = r(21),\n      i = r(0),\n      u = e ? e.isConcatSpreadable : void 0;\n    t.exports = function (t) {\n      return i(t) || o(t) || !!(u && t && t[u]);\n    };\n  },\n  function (t, n, r) {\n    var e = r(25),\n      o = r(195),\n      i = r(197);\n    t.exports = function (t, n) {\n      return i(o(t, n, e), t + \"\");\n    };\n  },\n  function (t, n, r) {\n    var e = r(196),\n      o = Math.max;\n    t.exports = function (t, n, r) {\n      return (\n        (n = o(void 0 === n ? t.length - 1 : n, 0)),\n        function () {\n          for (\n            var i = arguments, u = -1, c = o(i.length - n, 0), a = Array(c);\n            ++u < c;\n\n          )\n            a[u] = i[n + u];\n          u = -1;\n          for (var s = Array(n + 1); ++u < n; ) s[u] = i[u];\n          return (s[n] = r(a)), e(t, this, s);\n        }\n      );\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r) {\n      switch (r.length) {\n        case 0:\n          return t.call(n);\n        case 1:\n          return t.call(n, r[0]);\n        case 2:\n          return t.call(n, r[0], r[1]);\n        case 3:\n          return t.call(n, r[0], r[1], r[2]);\n      }\n      return t.apply(n, r);\n    };\n  },\n  function (t, n, r) {\n    var e = r(198),\n      o = r(199)(e);\n    t.exports = o;\n  },\n  function (t, n, r) {\n    var e = r(64),\n      o = r(51),\n      i = r(25),\n      u = o\n        ? function (t, n) {\n            return o(t, \"toString\", {\n              configurable: !0,\n              enumerable: !1,\n              value: e(n),\n              writable: !0,\n            });\n          }\n        : i;\n    t.exports = u;\n  },\n  function (t, n) {\n    var r = Date.now;\n    t.exports = function (t) {\n      var n = 0,\n        e = 0;\n      return function () {\n        var o = r(),\n          i = 16 - (o - e);\n        if (((e = o), i > 0)) {\n          if (++n >= 800) return arguments[0];\n        } else n = 0;\n        return t.apply(void 0, arguments);\n      };\n    };\n  },\n  function (t, n, r) {\n    var e = r(68),\n      o = r(201),\n      i = r(206),\n      u = r(69),\n      c = r(207),\n      a = r(42);\n    t.exports = function (t, n, r) {\n      var s = -1,\n        f = o,\n        l = t.length,\n        p = !0,\n        h = [],\n        v = h;\n      if (r) (p = !1), (f = i);\n      else if (l >= 200) {\n        var d = n ? null : c(t);\n        if (d) return a(d);\n        (p = !1), (f = u), (v = new e());\n      } else v = n ? [] : h;\n      t: for (; ++s < l; ) {\n        var y = t[s],\n          _ = n ? n(y) : y;\n        if (((y = r || 0 !== y ? y : 0), p && _ == _)) {\n          for (var g = v.length; g--; ) if (v[g] === _) continue t;\n          n && v.push(_), h.push(y);\n        } else f(v, _, r) || (v !== h && v.push(_), h.push(y));\n      }\n      return h;\n    };\n  },\n  function (t, n, r) {\n    var e = r(202);\n    t.exports = function (t, n) {\n      return !!(null == t ? 0 : t.length) && e(t, n, 0) > -1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(203),\n      o = r(204),\n      i = r(205);\n    t.exports = function (t, n, r) {\n      return n == n ? i(t, n, r) : e(t, o, r);\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r, e) {\n      for (var o = t.length, i = r + (e ? 1 : -1); e ? i-- : ++i < o; )\n        if (n(t[i], i, t)) return i;\n      return -1;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t) {\n      return t != t;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r) {\n      for (var e = r - 1, o = t.length; ++e < o; ) if (t[e] === n) return e;\n      return -1;\n    };\n  },\n  function (t, n) {\n    t.exports = function (t, n, r) {\n      for (var e = -1, o = null == t ? 0 : t.length; ++e < o; )\n        if (r(n, t[e])) return !0;\n      return !1;\n    };\n  },\n  function (t, n, r) {\n    var e = r(61),\n      o = r(208),\n      i = r(42),\n      u =\n        e && 1 / i(new e([, -0]))[1] == 1 / 0\n          ? function (t) {\n              return new e(t);\n            }\n          : o;\n    t.exports = u;\n  },\n  function (t, n) {\n    t.exports = function () {};\n  },\n  function (t, n, r) {\n    var e = r(7),\n      o = r(3);\n    t.exports = function (t) {\n      return o(t) && e(t);\n    };\n  },\n  function (t, n, r) {\n    var e = r(211),\n      o = r(6);\n    t.exports = function (t) {\n      return null == t ? [] : e(t, o(t));\n    };\n  },\n  function (t, n, r) {\n    var e = r(45);\n    t.exports = function (t, n) {\n      return e(n, function (n) {\n        return t[n];\n      });\n    };\n  },\n  function (t, n) {\n    t.exports = \"2.1.8\";\n  },\n  function (t, n, r) {\n    var e = r(1),\n      o = r(28);\n    function i(t) {\n      return e.map(t.nodes(), function (n) {\n        var r = t.node(n),\n          o = t.parent(n),\n          i = { v: n };\n        return (\n          e.isUndefined(r) || (i.value = r),\n          e.isUndefined(o) || (i.parent = o),\n          i\n        );\n      });\n    }\n    function u(t) {\n      return e.map(t.edges(), function (n) {\n        var r = t.edge(n),\n          o = { v: n.v, w: n.w };\n        return (\n          e.isUndefined(n.name) || (o.name = n.name),\n          e.isUndefined(r) || (o.value = r),\n          o\n        );\n      });\n    }\n    t.exports = {\n      write: function (t) {\n        var n = {\n          options: {\n            directed: t.isDirected(),\n            multigraph: t.isMultigraph(),\n            compound: t.isCompound(),\n          },\n          nodes: i(t),\n          edges: u(t),\n        };\n        e.isUndefined(t.graph()) || (n.value = e.clone(t.graph()));\n        return n;\n      },\n      read: function (t) {\n        var n = new o(t.options).setGraph(t.value);\n        return (\n          e.each(t.nodes, function (t) {\n            n.setNode(t.v, t.value), t.parent && n.setParent(t.v, t.parent);\n          }),\n          e.each(t.edges, function (t) {\n            n.setEdge({ v: t.v, w: t.w, name: t.name }, t.value);\n          }),\n          n\n        );\n      },\n    };\n  },\n  function (t, n, r) {\n    t.exports = {\n      components: r(215),\n      dijkstra: r(76),\n      dijkstraAll: r(216),\n      findCycles: r(217),\n      floydWarshall: r(218),\n      isAcyclic: r(219),\n      postorder: r(220),\n      preorder: r(221),\n      prim: r(222),\n      tarjan: r(78),\n      topsort: r(79),\n    };\n  },\n  function (t, n, r) {\n    var e = r(1);\n    t.exports = function (t) {\n      var n,\n        r = {},\n        o = [];\n      function i(o) {\n        e.has(r, o) ||\n          ((r[o] = !0),\n          n.push(o),\n          e.each(t.successors(o), i),\n          e.each(t.predecessors(o), i));\n      }\n      return (\n        e.each(t.nodes(), function (t) {\n          (n = []), i(t), n.length && o.push(n);\n        }),\n        o\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(76),\n      o = r(1);\n    t.exports = function (t, n, r) {\n      return o.transform(\n        t.nodes(),\n        function (o, i) {\n          o[i] = e(t, i, n, r);\n        },\n        {},\n      );\n    };\n  },\n  function (t, n, r) {\n    var e = r(1),\n      o = r(78);\n    t.exports = function (t) {\n      return e.filter(o(t), function (n) {\n        return n.length > 1 || (1 === n.length && t.hasEdge(n[0], n[0]));\n      });\n    };\n  },\n  function (t, n, r) {\n    var e = r(1);\n    t.exports = function (t, n, r) {\n      return (function (t, n, r) {\n        var e = {},\n          o = t.nodes();\n        return (\n          o.forEach(function (t) {\n            (e[t] = {}),\n              (e[t][t] = { distance: 0 }),\n              o.forEach(function (n) {\n                t !== n && (e[t][n] = { distance: Number.POSITIVE_INFINITY });\n              }),\n              r(t).forEach(function (r) {\n                var o = r.v === t ? r.w : r.v,\n                  i = n(r);\n                e[t][o] = { distance: i, predecessor: t };\n              });\n          }),\n          o.forEach(function (t) {\n            var n = e[t];\n            o.forEach(function (r) {\n              var i = e[r];\n              o.forEach(function (r) {\n                var e = i[t],\n                  o = n[r],\n                  u = i[r],\n                  c = e.distance + o.distance;\n                c < u.distance &&\n                  ((u.distance = c), (u.predecessor = o.predecessor));\n              });\n            });\n          }),\n          e\n        );\n      })(\n        t,\n        n || o,\n        r ||\n          function (n) {\n            return t.outEdges(n);\n          },\n      );\n    };\n    var o = e.constant(1);\n  },\n  function (t, n, r) {\n    var e = r(79);\n    t.exports = function (t) {\n      try {\n        e(t);\n      } catch (t) {\n        if (t instanceof e.CycleException) return !1;\n        throw t;\n      }\n      return !0;\n    };\n  },\n  function (t, n, r) {\n    var e = r(80);\n    t.exports = function (t, n) {\n      return e(t, n, \"post\");\n    };\n  },\n  function (t, n, r) {\n    var e = r(80);\n    t.exports = function (t, n) {\n      return e(t, n, \"pre\");\n    };\n  },\n  function (t, n, r) {\n    var e = r(1),\n      o = r(28),\n      i = r(77);\n    t.exports = function (t, n) {\n      var r,\n        u = new o(),\n        c = {},\n        a = new i();\n      function s(t) {\n        var e = t.v === r ? t.w : t.v,\n          o = a.priority(e);\n        if (void 0 !== o) {\n          var i = n(t);\n          i < o && ((c[e] = r), a.decrease(e, i));\n        }\n      }\n      if (0 === t.nodeCount()) return u;\n      e.each(t.nodes(), function (t) {\n        a.add(t, Number.POSITIVE_INFINITY), u.setNode(t);\n      }),\n        a.decrease(t.nodes()[0], 0);\n      var f = !1;\n      for (; a.size() > 0; ) {\n        if (((r = a.removeMin()), e.has(c, r))) u.setEdge(r, c[r]);\n        else {\n          if (f) throw new Error(\"Input graph is not connected: \" + t);\n          f = !0;\n        }\n        t.nodeEdges(r).forEach(s);\n      }\n      return u;\n    };\n  },\n  function (t, n, r) {\n    (function (t) {\n      function r(t, n) {\n        for (var r = 0, e = t.length - 1; e >= 0; e--) {\n          var o = t[e];\n          \".\" === o\n            ? t.splice(e, 1)\n            : \"..\" === o\n              ? (t.splice(e, 1), r++)\n              : r && (t.splice(e, 1), r--);\n        }\n        if (n) for (; r--; r) t.unshift(\"..\");\n        return t;\n      }\n      function e(t, n) {\n        if (t.filter) return t.filter(n);\n        for (var r = [], e = 0; e < t.length; e++)\n          n(t[e], e, t) && r.push(t[e]);\n        return r;\n      }\n      (n.resolve = function () {\n        for (var n = \"\", o = !1, i = arguments.length - 1; i >= -1 && !o; i--) {\n          var u = i >= 0 ? arguments[i] : t.cwd();\n          if (\"string\" != typeof u)\n            throw new TypeError(\"Arguments to path.resolve must be strings\");\n          u && ((n = u + \"/\" + n), (o = \"/\" === u.charAt(0)));\n        }\n        return (\n          (o ? \"/\" : \"\") +\n            (n = r(\n              e(n.split(\"/\"), function (t) {\n                return !!t;\n              }),\n              !o,\n            ).join(\"/\")) || \".\"\n        );\n      }),\n        (n.normalize = function (t) {\n          var i = n.isAbsolute(t),\n            u = \"/\" === o(t, -1);\n          return (\n            (t = r(\n              e(t.split(\"/\"), function (t) {\n                return !!t;\n              }),\n              !i,\n            ).join(\"/\")) ||\n              i ||\n              (t = \".\"),\n            t && u && (t += \"/\"),\n            (i ? \"/\" : \"\") + t\n          );\n        }),\n        (n.isAbsolute = function (t) {\n          return \"/\" === t.charAt(0);\n        }),\n        (n.join = function () {\n          var t = Array.prototype.slice.call(arguments, 0);\n          return n.normalize(\n            e(t, function (t, n) {\n              if (\"string\" != typeof t)\n                throw new TypeError(\"Arguments to path.join must be strings\");\n              return t;\n            }).join(\"/\"),\n          );\n        }),\n        (n.relative = function (t, r) {\n          function e(t) {\n            for (var n = 0; n < t.length && \"\" === t[n]; n++);\n            for (var r = t.length - 1; r >= 0 && \"\" === t[r]; r--);\n            return n > r ? [] : t.slice(n, r - n + 1);\n          }\n          (t = n.resolve(t).substr(1)), (r = n.resolve(r).substr(1));\n          for (\n            var o = e(t.split(\"/\")),\n              i = e(r.split(\"/\")),\n              u = Math.min(o.length, i.length),\n              c = u,\n              a = 0;\n            a < u;\n            a++\n          )\n            if (o[a] !== i[a]) {\n              c = a;\n              break;\n            }\n          var s = [];\n          for (a = c; a < o.length; a++) s.push(\"..\");\n          return (s = s.concat(i.slice(c))).join(\"/\");\n        }),\n        (n.sep = \"/\"),\n        (n.delimiter = \":\"),\n        (n.dirname = function (t) {\n          if ((\"string\" != typeof t && (t += \"\"), 0 === t.length)) return \".\";\n          for (\n            var n = t.charCodeAt(0),\n              r = 47 === n,\n              e = -1,\n              o = !0,\n              i = t.length - 1;\n            i >= 1;\n            --i\n          )\n            if (47 === (n = t.charCodeAt(i))) {\n              if (!o) {\n                e = i;\n                break;\n              }\n            } else o = !1;\n          return -1 === e\n            ? r\n              ? \"/\"\n              : \".\"\n            : r && 1 === e\n              ? \"/\"\n              : t.slice(0, e);\n        }),\n        (n.basename = function (t, n) {\n          var r = (function (t) {\n            \"string\" != typeof t && (t += \"\");\n            var n,\n              r = 0,\n              e = -1,\n              o = !0;\n            for (n = t.length - 1; n >= 0; --n)\n              if (47 === t.charCodeAt(n)) {\n                if (!o) {\n                  r = n + 1;\n                  break;\n                }\n              } else -1 === e && ((o = !1), (e = n + 1));\n            return -1 === e ? \"\" : t.slice(r, e);\n          })(t);\n          return (\n            n &&\n              r.substr(-1 * n.length) === n &&\n              (r = r.substr(0, r.length - n.length)),\n            r\n          );\n        }),\n        (n.extname = function (t) {\n          \"string\" != typeof t && (t += \"\");\n          for (\n            var n = -1, r = 0, e = -1, o = !0, i = 0, u = t.length - 1;\n            u >= 0;\n            --u\n          ) {\n            var c = t.charCodeAt(u);\n            if (47 !== c)\n              -1 === e && ((o = !1), (e = u + 1)),\n                46 === c\n                  ? -1 === n\n                    ? (n = u)\n                    : 1 !== i && (i = 1)\n                  : -1 !== n && (i = -1);\n            else if (!o) {\n              r = u + 1;\n              break;\n            }\n          }\n          return -1 === n ||\n            -1 === e ||\n            0 === i ||\n            (1 === i && n === e - 1 && n === r + 1)\n            ? \"\"\n            : t.slice(n, e);\n        });\n      var o =\n        \"b\" === \"ab\".substr(-1)\n          ? function (t, n, r) {\n              return t.substr(n, r);\n            }\n          : function (t, n, r) {\n              return n < 0 && (n = t.length + n), t.substr(n, r);\n            };\n    }).call(this, r(13));\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = { file: r(225), http: r(81), https: r(81) },\n      i =\n        \"object\" === (\"undefined\" == typeof window ? \"undefined\" : e(window)) ||\n        \"function\" == typeof importScripts\n          ? o.http\n          : o.file;\n    \"undefined\" == typeof Promise && r(83),\n      (t.exports.load = function (t, n) {\n        var r = Promise.resolve();\n        return (\n          void 0 === n && (n = {}),\n          (r = (r = r.then(function () {\n            if (void 0 === t) throw new TypeError(\"location is required\");\n            if (\"string\" != typeof t)\n              throw new TypeError(\"location must be a string\");\n            if (void 0 !== n) {\n              if (\"object\" !== e(n))\n                throw new TypeError(\"options must be an object\");\n              if (\n                void 0 !== n.processContent &&\n                \"function\" != typeof n.processContent\n              )\n                throw new TypeError(\n                  \"options.processContent must be a function\",\n                );\n            }\n          }))\n            .then(function () {\n              return new Promise(function (r, e) {\n                (function (t) {\n                  var n = (function (t) {\n                      return (\n                        void 0 !== t &&\n                          (t =\n                            -1 === t.indexOf(\"://\") ? \"\" : t.split(\"://\")[0]),\n                        t\n                      );\n                    })(t),\n                    r = o[n];\n                  if (void 0 === r) {\n                    if (\"\" !== n) throw new Error(\"Unsupported scheme: \" + n);\n                    r = i;\n                  }\n                  return r;\n                })(t).load(t, n || {}, function (t, n) {\n                  t ? e(t) : r(n);\n                });\n              });\n            })\n            .then(function (r) {\n              return n.processContent\n                ? new Promise(function (o, i) {\n                    \"object\" !== e(r) && (r = { text: r }),\n                      (r.location = t),\n                      n.processContent(r, function (t, n) {\n                        t ? i(t) : o(n);\n                      });\n                  })\n                : \"object\" === e(r)\n                  ? r.text\n                  : r;\n            }))\n        );\n      });\n  },\n  function (t, n, r) {\n    \"use strict\";\n    var e = new TypeError(\"The 'file' scheme is not supported in the browser\");\n    (t.exports.getBase = function () {\n      throw e;\n    }),\n      (t.exports.load = function () {\n        var t = arguments[arguments.length - 1];\n        if (\"function\" != typeof t) throw e;\n        t(e);\n      });\n  },\n  function (t, n, r) {\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o;\n    \"undefined\" != typeof window\n      ? (o = window)\n      : \"undefined\" != typeof self\n        ? (o = self)\n        : (console.warn(\n            \"Using browser-only version of superagent in non-browser environment\",\n          ),\n          (o = this));\n    var i = r(227),\n      u = r(228),\n      c = r(82),\n      a = r(229),\n      s = r(231);\n    function f() {}\n    var l =\n      (n =\n      t.exports =\n        function (t, r) {\n          return \"function\" == typeof r\n            ? new n.Request(\"GET\", t).end(r)\n            : 1 == arguments.length\n              ? new n.Request(\"GET\", t)\n              : new n.Request(t, r);\n        });\n    (n.Request = g),\n      (l.getXHR = function () {\n        if (\n          !(\n            !o.XMLHttpRequest ||\n            (o.location && \"file:\" == o.location.protocol && o.ActiveXObject)\n          )\n        )\n          return new XMLHttpRequest();\n        try {\n          return new ActiveXObject(\"Microsoft.XMLHTTP\");\n        } catch (t) {}\n        try {\n          return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\");\n        } catch (t) {}\n        try {\n          return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\");\n        } catch (t) {}\n        try {\n          return new ActiveXObject(\"Msxml2.XMLHTTP\");\n        } catch (t) {}\n        throw Error(\"Browser-only version of superagent could not find XHR\");\n      });\n    var p = \"\".trim\n      ? function (t) {\n          return t.trim();\n        }\n      : function (t) {\n          return t.replace(/(^\\s*|\\s*$)/g, \"\");\n        };\n    function h(t) {\n      if (!c(t)) return t;\n      var n = [];\n      for (var r in t) v(n, r, t[r]);\n      return n.join(\"&\");\n    }\n    function v(t, n, r) {\n      if (null != r)\n        if (Array.isArray(r))\n          r.forEach(function (r) {\n            v(t, n, r);\n          });\n        else if (c(r)) for (var e in r) v(t, n + \"[\" + e + \"]\", r[e]);\n        else t.push(encodeURIComponent(n) + \"=\" + encodeURIComponent(r));\n      else null === r && t.push(encodeURIComponent(n));\n    }\n    function d(t) {\n      for (var n, r, e = {}, o = t.split(\"&\"), i = 0, u = o.length; i < u; ++i)\n        -1 == (r = (n = o[i]).indexOf(\"=\"))\n          ? (e[decodeURIComponent(n)] = \"\")\n          : (e[decodeURIComponent(n.slice(0, r))] = decodeURIComponent(\n              n.slice(r + 1),\n            ));\n      return e;\n    }\n    function y(t) {\n      return /[\\/+]json($|[^-\\w])/.test(t);\n    }\n    function _(t) {\n      (this.req = t),\n        (this.xhr = this.req.xhr),\n        (this.text =\n          (\"HEAD\" != this.req.method &&\n            (\"\" === this.xhr.responseType ||\n              \"text\" === this.xhr.responseType)) ||\n          void 0 === this.xhr.responseType\n            ? this.xhr.responseText\n            : null),\n        (this.statusText = this.req.xhr.statusText);\n      var n = this.xhr.status;\n      1223 === n && (n = 204),\n        this._setStatusProperties(n),\n        (this.header = this.headers =\n          (function (t) {\n            for (\n              var n, r, e, o, i = t.split(/\\r?\\n/), u = {}, c = 0, a = i.length;\n              c < a;\n              ++c\n            )\n              -1 !== (n = (r = i[c]).indexOf(\":\")) &&\n                ((e = r.slice(0, n).toLowerCase()),\n                (o = p(r.slice(n + 1))),\n                (u[e] = o));\n            return u;\n          })(this.xhr.getAllResponseHeaders())),\n        (this.header[\"content-type\"] =\n          this.xhr.getResponseHeader(\"content-type\")),\n        this._setHeaderProperties(this.header),\n        null === this.text && t._responseType\n          ? (this.body = this.xhr.response)\n          : (this.body =\n              \"HEAD\" != this.req.method\n                ? this._parseBody(this.text ? this.text : this.xhr.response)\n                : null);\n    }\n    function g(t, n) {\n      var r = this;\n      (this._query = this._query || []),\n        (this.method = t),\n        (this.url = n),\n        (this.header = {}),\n        (this._header = {}),\n        this.on(\"end\", function () {\n          var t,\n            n = null,\n            e = null;\n          try {\n            e = new _(r);\n          } catch (t) {\n            return (\n              ((n = new Error(\"Parser is unable to parse the response\")).parse =\n                !0),\n              (n.original = t),\n              r.xhr\n                ? ((n.rawResponse =\n                    void 0 === r.xhr.responseType\n                      ? r.xhr.responseText\n                      : r.xhr.response),\n                  (n.status = r.xhr.status ? r.xhr.status : null),\n                  (n.statusCode = n.status))\n                : ((n.rawResponse = null), (n.status = null)),\n              r.callback(n)\n            );\n          }\n          r.emit(\"response\", e);\n          try {\n            r._isResponseOK(e) ||\n              (t = new Error(e.statusText || \"Unsuccessful HTTP response\"));\n          } catch (n) {\n            t = n;\n          }\n          t\n            ? ((t.original = n),\n              (t.response = e),\n              (t.status = e.status),\n              r.callback(t, e))\n            : r.callback(null, e);\n        });\n    }\n    function b(t, n, r) {\n      var e = l(\"DELETE\", t);\n      return (\n        \"function\" == typeof n && ((r = n), (n = null)),\n        n && e.send(n),\n        r && e.end(r),\n        e\n      );\n    }\n    (l.serializeObject = h),\n      (l.parseString = d),\n      (l.types = {\n        html: \"text/html\",\n        json: \"application/json\",\n        xml: \"text/xml\",\n        urlencoded: \"application/x-www-form-urlencoded\",\n        form: \"application/x-www-form-urlencoded\",\n        \"form-data\": \"application/x-www-form-urlencoded\",\n      }),\n      (l.serialize = {\n        \"application/x-www-form-urlencoded\": h,\n        \"application/json\": JSON.stringify,\n      }),\n      (l.parse = {\n        \"application/x-www-form-urlencoded\": d,\n        \"application/json\": JSON.parse,\n      }),\n      a(_.prototype),\n      (_.prototype._parseBody = function (t) {\n        var n = l.parse[this.type];\n        return this.req._parser\n          ? this.req._parser(this, t)\n          : (!n && y(this.type) && (n = l.parse[\"application/json\"]),\n            n && t && (t.length || t instanceof Object) ? n(t) : null);\n      }),\n      (_.prototype.toError = function () {\n        var t = this.req,\n          n = t.method,\n          r = t.url,\n          e = \"cannot \" + n + \" \" + r + \" (\" + this.status + \")\",\n          o = new Error(e);\n        return (o.status = this.status), (o.method = n), (o.url = r), o;\n      }),\n      (l.Response = _),\n      i(g.prototype),\n      u(g.prototype),\n      (g.prototype.type = function (t) {\n        return this.set(\"Content-Type\", l.types[t] || t), this;\n      }),\n      (g.prototype.accept = function (t) {\n        return this.set(\"Accept\", l.types[t] || t), this;\n      }),\n      (g.prototype.auth = function (t, n, r) {\n        1 === arguments.length && (n = \"\"),\n          \"object\" === e(n) && null !== n && ((r = n), (n = \"\")),\n          r || (r = { type: \"function\" == typeof btoa ? \"basic\" : \"auto\" });\n        var o = function (t) {\n          if (\"function\" == typeof btoa) return btoa(t);\n          throw new Error(\"Cannot use basic auth, btoa is not a function\");\n        };\n        return this._auth(t, n, r, o);\n      }),\n      (g.prototype.query = function (t) {\n        return (\n          \"string\" != typeof t && (t = h(t)), t && this._query.push(t), this\n        );\n      }),\n      (g.prototype.attach = function (t, n, r) {\n        if (n) {\n          if (this._data)\n            throw Error(\"superagent can't mix .send() and .attach()\");\n          this._getFormData().append(t, n, r || n.name);\n        }\n        return this;\n      }),\n      (g.prototype._getFormData = function () {\n        return (\n          this._formData || (this._formData = new o.FormData()), this._formData\n        );\n      }),\n      (g.prototype.callback = function (t, n) {\n        if (this._shouldRetry(t, n)) return this._retry();\n        var r = this._callback;\n        this.clearTimeout(),\n          t &&\n            (this._maxRetries && (t.retries = this._retries - 1),\n            this.emit(\"error\", t)),\n          r(t, n);\n      }),\n      (g.prototype.crossDomainError = function () {\n        var t = new Error(\n          \"Request has been terminated\\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.\",\n        );\n        (t.crossDomain = !0),\n          (t.status = this.status),\n          (t.method = this.method),\n          (t.url = this.url),\n          this.callback(t);\n      }),\n      (g.prototype.buffer =\n        g.prototype.ca =\n        g.prototype.agent =\n          function () {\n            return (\n              console.warn(\n                \"This is not supported in browser version of superagent\",\n              ),\n              this\n            );\n          }),\n      (g.prototype.pipe = g.prototype.write =\n        function () {\n          throw Error(\n            \"Streaming is not supported in browser version of superagent\",\n          );\n        }),\n      (g.prototype._isHost = function (t) {\n        return (\n          t &&\n          \"object\" === e(t) &&\n          !Array.isArray(t) &&\n          \"[object Object]\" !== Object.prototype.toString.call(t)\n        );\n      }),\n      (g.prototype.end = function (t) {\n        return (\n          this._endCalled &&\n            console.warn(\n              \"Warning: .end() was called twice. This is not supported in superagent\",\n            ),\n          (this._endCalled = !0),\n          (this._callback = t || f),\n          this._finalizeQueryString(),\n          this._end()\n        );\n      }),\n      (g.prototype._end = function () {\n        var t = this,\n          n = (this.xhr = l.getXHR()),\n          r = this._formData || this._data;\n        this._setTimeouts(),\n          (n.onreadystatechange = function () {\n            var r = n.readyState;\n            if (\n              (r >= 2 &&\n                t._responseTimeoutTimer &&\n                clearTimeout(t._responseTimeoutTimer),\n              4 == r)\n            ) {\n              var e;\n              try {\n                e = n.status;\n              } catch (t) {\n                e = 0;\n              }\n              if (!e) {\n                if (t.timedout || t._aborted) return;\n                return t.crossDomainError();\n              }\n              t.emit(\"end\");\n            }\n          });\n        var e = function (n, r) {\n          r.total > 0 && (r.percent = (r.loaded / r.total) * 100),\n            (r.direction = n),\n            t.emit(\"progress\", r);\n        };\n        if (this.hasListeners(\"progress\"))\n          try {\n            (n.onprogress = e.bind(null, \"download\")),\n              n.upload && (n.upload.onprogress = e.bind(null, \"upload\"));\n          } catch (t) {}\n        try {\n          this.username && this.password\n            ? n.open(this.method, this.url, !0, this.username, this.password)\n            : n.open(this.method, this.url, !0);\n        } catch (t) {\n          return this.callback(t);\n        }\n        if (\n          (this._withCredentials && (n.withCredentials = !0),\n          !this._formData &&\n            \"GET\" != this.method &&\n            \"HEAD\" != this.method &&\n            \"string\" != typeof r &&\n            !this._isHost(r))\n        ) {\n          var o = this._header[\"content-type\"],\n            i = this._serializer || l.serialize[o ? o.split(\";\")[0] : \"\"];\n          !i && y(o) && (i = l.serialize[\"application/json\"]), i && (r = i(r));\n        }\n        for (var u in this.header)\n          null != this.header[u] &&\n            this.header.hasOwnProperty(u) &&\n            n.setRequestHeader(u, this.header[u]);\n        return (\n          this._responseType && (n.responseType = this._responseType),\n          this.emit(\"request\", this),\n          n.send(void 0 !== r ? r : null),\n          this\n        );\n      }),\n      (l.agent = function () {\n        return new s();\n      }),\n      [\"GET\", \"POST\", \"OPTIONS\", \"PATCH\", \"PUT\", \"DELETE\"].forEach(\n        function (t) {\n          s.prototype[t.toLowerCase()] = function (n, r) {\n            var e = new l.Request(t, n);\n            return this._setDefaults(e), r && e.end(r), e;\n          };\n        },\n      ),\n      (s.prototype.del = s.prototype.delete),\n      (l.get = function (t, n, r) {\n        var e = l(\"GET\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.query(n),\n          r && e.end(r),\n          e\n        );\n      }),\n      (l.head = function (t, n, r) {\n        var e = l(\"HEAD\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.query(n),\n          r && e.end(r),\n          e\n        );\n      }),\n      (l.options = function (t, n, r) {\n        var e = l(\"OPTIONS\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.send(n),\n          r && e.end(r),\n          e\n        );\n      }),\n      (l.del = b),\n      (l.delete = b),\n      (l.patch = function (t, n, r) {\n        var e = l(\"PATCH\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.send(n),\n          r && e.end(r),\n          e\n        );\n      }),\n      (l.post = function (t, n, r) {\n        var e = l(\"POST\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.send(n),\n          r && e.end(r),\n          e\n        );\n      }),\n      (l.put = function (t, n, r) {\n        var e = l(\"PUT\", t);\n        return (\n          \"function\" == typeof n && ((r = n), (n = null)),\n          n && e.send(n),\n          r && e.end(r),\n          e\n        );\n      });\n  },\n  function (t, n, r) {\n    function e(t) {\n      if (t)\n        return (function (t) {\n          for (var n in e.prototype) t[n] = e.prototype[n];\n          return t;\n        })(t);\n    }\n    (t.exports = e),\n      (e.prototype.on = e.prototype.addEventListener =\n        function (t, n) {\n          return (\n            (this._callbacks = this._callbacks || {}),\n            (this._callbacks[\"$\" + t] = this._callbacks[\"$\" + t] || []).push(n),\n            this\n          );\n        }),\n      (e.prototype.once = function (t, n) {\n        function r() {\n          this.off(t, r), n.apply(this, arguments);\n        }\n        return (r.fn = n), this.on(t, r), this;\n      }),\n      (e.prototype.off =\n        e.prototype.removeListener =\n        e.prototype.removeAllListeners =\n        e.prototype.removeEventListener =\n          function (t, n) {\n            if (\n              ((this._callbacks = this._callbacks || {}), 0 == arguments.length)\n            )\n              return (this._callbacks = {}), this;\n            var r,\n              e = this._callbacks[\"$\" + t];\n            if (!e) return this;\n            if (1 == arguments.length)\n              return delete this._callbacks[\"$\" + t], this;\n            for (var o = 0; o < e.length; o++)\n              if ((r = e[o]) === n || r.fn === n) {\n                e.splice(o, 1);\n                break;\n              }\n            return this;\n          }),\n      (e.prototype.emit = function (t) {\n        this._callbacks = this._callbacks || {};\n        var n = [].slice.call(arguments, 1),\n          r = this._callbacks[\"$\" + t];\n        if (r)\n          for (var e = 0, o = (r = r.slice(0)).length; e < o; ++e)\n            r[e].apply(this, n);\n        return this;\n      }),\n      (e.prototype.listeners = function (t) {\n        return (\n          (this._callbacks = this._callbacks || {}),\n          this._callbacks[\"$\" + t] || []\n        );\n      }),\n      (e.prototype.hasListeners = function (t) {\n        return !!this.listeners(t).length;\n      });\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = r(82);\n    function i(t) {\n      if (t)\n        return (function (t) {\n          for (var n in i.prototype) t[n] = i.prototype[n];\n          return t;\n        })(t);\n    }\n    (t.exports = i),\n      (i.prototype.clearTimeout = function () {\n        return (\n          clearTimeout(this._timer),\n          clearTimeout(this._responseTimeoutTimer),\n          delete this._timer,\n          delete this._responseTimeoutTimer,\n          this\n        );\n      }),\n      (i.prototype.parse = function (t) {\n        return (this._parser = t), this;\n      }),\n      (i.prototype.responseType = function (t) {\n        return (this._responseType = t), this;\n      }),\n      (i.prototype.serialize = function (t) {\n        return (this._serializer = t), this;\n      }),\n      (i.prototype.timeout = function (t) {\n        if (!t || \"object\" !== e(t))\n          return (this._timeout = t), (this._responseTimeout = 0), this;\n        for (var n in t)\n          switch (n) {\n            case \"deadline\":\n              this._timeout = t.deadline;\n              break;\n            case \"response\":\n              this._responseTimeout = t.response;\n              break;\n            default:\n              console.warn(\"Unknown timeout option\", n);\n          }\n        return this;\n      }),\n      (i.prototype.retry = function (t, n) {\n        return (\n          (0 !== arguments.length && !0 !== t) || (t = 1),\n          t <= 0 && (t = 0),\n          (this._maxRetries = t),\n          (this._retries = 0),\n          (this._retryCallback = n),\n          this\n        );\n      });\n    var u = [\"ECONNRESET\", \"ETIMEDOUT\", \"EADDRINFO\", \"ESOCKETTIMEDOUT\"];\n    (i.prototype._shouldRetry = function (t, n) {\n      if (!this._maxRetries || this._retries++ >= this._maxRetries) return !1;\n      if (this._retryCallback)\n        try {\n          var r = this._retryCallback(t, n);\n          if (!0 === r) return !0;\n          if (!1 === r) return !1;\n        } catch (t) {\n          console.error(t);\n        }\n      if (n && n.status && n.status >= 500 && 501 != n.status) return !0;\n      if (t) {\n        if (t.code && ~u.indexOf(t.code)) return !0;\n        if (t.timeout && \"ECONNABORTED\" == t.code) return !0;\n        if (t.crossDomain) return !0;\n      }\n      return !1;\n    }),\n      (i.prototype._retry = function () {\n        return (\n          this.clearTimeout(),\n          this.req && ((this.req = null), (this.req = this.request())),\n          (this._aborted = !1),\n          (this.timedout = !1),\n          this._end()\n        );\n      }),\n      (i.prototype.then = function (t, n) {\n        if (!this._fullfilledPromise) {\n          var r = this;\n          this._endCalled &&\n            console.warn(\n              \"Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises\",\n            ),\n            (this._fullfilledPromise = new Promise(function (t, n) {\n              r.end(function (r, e) {\n                r ? n(r) : t(e);\n              });\n            }));\n        }\n        return this._fullfilledPromise.then(t, n);\n      }),\n      (i.prototype.catch = function (t) {\n        return this.then(void 0, t);\n      }),\n      (i.prototype.use = function (t) {\n        return t(this), this;\n      }),\n      (i.prototype.ok = function (t) {\n        if (\"function\" != typeof t) throw Error(\"Callback required\");\n        return (this._okCallback = t), this;\n      }),\n      (i.prototype._isResponseOK = function (t) {\n        return (\n          !!t &&\n          (this._okCallback\n            ? this._okCallback(t)\n            : t.status >= 200 && t.status < 300)\n        );\n      }),\n      (i.prototype.get = function (t) {\n        return this._header[t.toLowerCase()];\n      }),\n      (i.prototype.getHeader = i.prototype.get),\n      (i.prototype.set = function (t, n) {\n        if (o(t)) {\n          for (var r in t) this.set(r, t[r]);\n          return this;\n        }\n        return (this._header[t.toLowerCase()] = n), (this.header[t] = n), this;\n      }),\n      (i.prototype.unset = function (t) {\n        return (\n          delete this._header[t.toLowerCase()], delete this.header[t], this\n        );\n      }),\n      (i.prototype.field = function (t, n) {\n        if (null == t)\n          throw new Error(\".field(name, val) name can not be empty\");\n        if (\n          (this._data &&\n            console.error(\n              \".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()\",\n            ),\n          o(t))\n        ) {\n          for (var r in t) this.field(r, t[r]);\n          return this;\n        }\n        if (Array.isArray(n)) {\n          for (var e in n) this.field(t, n[e]);\n          return this;\n        }\n        if (null == n)\n          throw new Error(\".field(name, val) val can not be empty\");\n        return (\n          \"boolean\" == typeof n && (n = \"\" + n),\n          this._getFormData().append(t, n),\n          this\n        );\n      }),\n      (i.prototype.abort = function () {\n        return (\n          this._aborted ||\n            ((this._aborted = !0),\n            this.xhr && this.xhr.abort(),\n            this.req && this.req.abort(),\n            this.clearTimeout(),\n            this.emit(\"abort\")),\n          this\n        );\n      }),\n      (i.prototype._auth = function (t, n, r, e) {\n        switch (r.type) {\n          case \"basic\":\n            this.set(\"Authorization\", \"Basic \" + e(t + \":\" + n));\n            break;\n          case \"auto\":\n            (this.username = t), (this.password = n);\n            break;\n          case \"bearer\":\n            this.set(\"Authorization\", \"Bearer \" + t);\n        }\n        return this;\n      }),\n      (i.prototype.withCredentials = function (t) {\n        return null == t && (t = !0), (this._withCredentials = t), this;\n      }),\n      (i.prototype.redirects = function (t) {\n        return (this._maxRedirects = t), this;\n      }),\n      (i.prototype.maxResponseSize = function (t) {\n        if (\"number\" != typeof t) throw TypeError(\"Invalid argument\");\n        return (this._maxResponseSize = t), this;\n      }),\n      (i.prototype.toJSON = function () {\n        return {\n          method: this.method,\n          url: this.url,\n          data: this._data,\n          headers: this._header,\n        };\n      }),\n      (i.prototype.send = function (t) {\n        var n = o(t),\n          r = this._header[\"content-type\"];\n        if (\n          (this._formData &&\n            console.error(\n              \".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()\",\n            ),\n          n && !this._data)\n        )\n          Array.isArray(t)\n            ? (this._data = [])\n            : this._isHost(t) || (this._data = {});\n        else if (t && this._data && this._isHost(this._data))\n          throw Error(\"Can't merge these send calls\");\n        if (n && o(this._data)) for (var e in t) this._data[e] = t[e];\n        else\n          \"string\" == typeof t\n            ? (r || this.type(\"form\"),\n              (r = this._header[\"content-type\"]),\n              (this._data =\n                \"application/x-www-form-urlencoded\" == r\n                  ? this._data\n                    ? this._data + \"&\" + t\n                    : t\n                  : (this._data || \"\") + t))\n            : (this._data = t);\n        return !n || this._isHost(t) || r || this.type(\"json\"), this;\n      }),\n      (i.prototype.sortQuery = function (t) {\n        return (this._sort = void 0 === t || t), this;\n      }),\n      (i.prototype._finalizeQueryString = function () {\n        var t = this._query.join(\"&\");\n        if (\n          (t && (this.url += (this.url.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + t),\n          (this._query.length = 0),\n          this._sort)\n        ) {\n          var n = this.url.indexOf(\"?\");\n          if (n >= 0) {\n            var r = this.url.substring(n + 1).split(\"&\");\n            \"function\" == typeof this._sort ? r.sort(this._sort) : r.sort(),\n              (this.url = this.url.substring(0, n) + \"?\" + r.join(\"&\"));\n          }\n        }\n      }),\n      (i.prototype._appendQueryString = function () {\n        console.trace(\"Unsupported\");\n      }),\n      (i.prototype._timeoutError = function (t, n, r) {\n        if (!this._aborted) {\n          var e = new Error(t + n + \"ms exceeded\");\n          (e.timeout = n),\n            (e.code = \"ECONNABORTED\"),\n            (e.errno = r),\n            (this.timedout = !0),\n            this.abort(),\n            this.callback(e);\n        }\n      }),\n      (i.prototype._setTimeouts = function () {\n        var t = this;\n        this._timeout &&\n          !this._timer &&\n          (this._timer = setTimeout(function () {\n            t._timeoutError(\"Timeout of \", t._timeout, \"ETIME\");\n          }, this._timeout)),\n          this._responseTimeout &&\n            !this._responseTimeoutTimer &&\n            (this._responseTimeoutTimer = setTimeout(function () {\n              t._timeoutError(\n                \"Response timeout of \",\n                t._responseTimeout,\n                \"ETIMEDOUT\",\n              );\n            }, this._responseTimeout));\n      });\n  },\n  function (t, n, r) {\n    \"use strict\";\n    var e = r(230);\n    function o(t) {\n      if (t)\n        return (function (t) {\n          for (var n in o.prototype) t[n] = o.prototype[n];\n          return t;\n        })(t);\n    }\n    (t.exports = o),\n      (o.prototype.get = function (t) {\n        return this.header[t.toLowerCase()];\n      }),\n      (o.prototype._setHeaderProperties = function (t) {\n        var n = t[\"content-type\"] || \"\";\n        this.type = e.type(n);\n        var r = e.params(n);\n        for (var o in r) this[o] = r[o];\n        this.links = {};\n        try {\n          t.link && (this.links = e.parseLinks(t.link));\n        } catch (t) {}\n      }),\n      (o.prototype._setStatusProperties = function (t) {\n        var n = (t / 100) | 0;\n        (this.status = this.statusCode = t),\n          (this.statusType = n),\n          (this.info = 1 == n),\n          (this.ok = 2 == n),\n          (this.redirect = 3 == n),\n          (this.clientError = 4 == n),\n          (this.serverError = 5 == n),\n          (this.error = (4 == n || 5 == n) && this.toError()),\n          (this.created = 201 == t),\n          (this.accepted = 202 == t),\n          (this.noContent = 204 == t),\n          (this.badRequest = 400 == t),\n          (this.unauthorized = 401 == t),\n          (this.notAcceptable = 406 == t),\n          (this.forbidden = 403 == t),\n          (this.notFound = 404 == t),\n          (this.unprocessableEntity = 422 == t);\n      });\n  },\n  function (t, n, r) {\n    \"use strict\";\n    (n.type = function (t) {\n      return t.split(/ *; */).shift();\n    }),\n      (n.params = function (t) {\n        return t.split(/ *; */).reduce(function (t, n) {\n          var r = n.split(/ *= */),\n            e = r.shift(),\n            o = r.shift();\n          return e && o && (t[e] = o), t;\n        }, {});\n      }),\n      (n.parseLinks = function (t) {\n        return t.split(/ *, */).reduce(function (t, n) {\n          var r = n.split(/ *; */),\n            e = r[0].slice(1, -1);\n          return (t[r[1].split(/ *= */)[1].slice(1, -1)] = e), t;\n        }, {});\n      }),\n      (n.cleanHeader = function (t, n) {\n        return (\n          delete t[\"content-type\"],\n          delete t[\"content-length\"],\n          delete t[\"transfer-encoding\"],\n          delete t.host,\n          n && (delete t.authorization, delete t.cookie),\n          t\n        );\n      });\n  },\n  function (t, n) {\n    function r() {\n      this._defaults = [];\n    }\n    [\n      \"use\",\n      \"on\",\n      \"once\",\n      \"set\",\n      \"query\",\n      \"type\",\n      \"accept\",\n      \"auth\",\n      \"withCredentials\",\n      \"sortQuery\",\n      \"retry\",\n      \"ok\",\n      \"redirects\",\n      \"timeout\",\n      \"buffer\",\n      \"serialize\",\n      \"parse\",\n      \"ca\",\n      \"key\",\n      \"pfx\",\n      \"cert\",\n    ].forEach(function (t) {\n      r.prototype[t] = function () {\n        return this._defaults.push({ fn: t, arguments: arguments }), this;\n      };\n    }),\n      (r.prototype._setDefaults = function (t) {\n        this._defaults.forEach(function (n) {\n          t[n.fn].apply(t, n.arguments);\n        });\n      }),\n      (t.exports = r);\n  },\n  function (t, n, r) {\n    (function (t) {\n      var e =\n          (void 0 !== t && t) || (\"undefined\" != typeof self && self) || window,\n        o = Function.prototype.apply;\n      function i(t, n) {\n        (this._id = t), (this._clearFn = n);\n      }\n      (n.setTimeout = function () {\n        return new i(o.call(setTimeout, e, arguments), clearTimeout);\n      }),\n        (n.setInterval = function () {\n          return new i(o.call(setInterval, e, arguments), clearInterval);\n        }),\n        (n.clearTimeout = n.clearInterval =\n          function (t) {\n            t && t.close();\n          }),\n        (i.prototype.unref = i.prototype.ref = function () {}),\n        (i.prototype.close = function () {\n          this._clearFn.call(e, this._id);\n        }),\n        (n.enroll = function (t, n) {\n          clearTimeout(t._idleTimeoutId), (t._idleTimeout = n);\n        }),\n        (n.unenroll = function (t) {\n          clearTimeout(t._idleTimeoutId), (t._idleTimeout = -1);\n        }),\n        (n._unrefActive = n.active =\n          function (t) {\n            clearTimeout(t._idleTimeoutId);\n            var n = t._idleTimeout;\n            n >= 0 &&\n              (t._idleTimeoutId = setTimeout(function () {\n                t._onTimeout && t._onTimeout();\n              }, n));\n          }),\n        r(233),\n        (n.setImmediate =\n          (\"undefined\" != typeof self && self.setImmediate) ||\n          (void 0 !== t && t.setImmediate) ||\n          (this && this.setImmediate)),\n        (n.clearImmediate =\n          (\"undefined\" != typeof self && self.clearImmediate) ||\n          (void 0 !== t && t.clearImmediate) ||\n          (this && this.clearImmediate));\n    }).call(this, r(11));\n  },\n  function (t, n, r) {\n    (function (t, n) {\n      !(function (t, r) {\n        \"use strict\";\n        if (!t.setImmediate) {\n          var e,\n            o,\n            i,\n            u,\n            c,\n            a = 1,\n            s = {},\n            f = !1,\n            l = t.document,\n            p = Object.getPrototypeOf && Object.getPrototypeOf(t);\n          (p = p && p.setTimeout ? p : t),\n            \"[object process]\" === {}.toString.call(t.process)\n              ? (e = function (t) {\n                  n.nextTick(function () {\n                    v(t);\n                  });\n                })\n              : !(function () {\n                    if (t.postMessage && !t.importScripts) {\n                      var n = !0,\n                        r = t.onmessage;\n                      return (\n                        (t.onmessage = function () {\n                          n = !1;\n                        }),\n                        t.postMessage(\"\", \"*\"),\n                        (t.onmessage = r),\n                        n\n                      );\n                    }\n                  })()\n                ? t.MessageChannel\n                  ? (((i = new MessageChannel()).port1.onmessage = function (\n                      t,\n                    ) {\n                      v(t.data);\n                    }),\n                    (e = function (t) {\n                      i.port2.postMessage(t);\n                    }))\n                  : l && \"onreadystatechange\" in l.createElement(\"script\")\n                    ? ((o = l.documentElement),\n                      (e = function (t) {\n                        var n = l.createElement(\"script\");\n                        (n.onreadystatechange = function () {\n                          v(t),\n                            (n.onreadystatechange = null),\n                            o.removeChild(n),\n                            (n = null);\n                        }),\n                          o.appendChild(n);\n                      }))\n                    : (e = function (t) {\n                        setTimeout(v, 0, t);\n                      })\n                : ((u = \"setImmediate$\" + Math.random() + \"$\"),\n                  (c = function (n) {\n                    n.source === t &&\n                      \"string\" == typeof n.data &&\n                      0 === n.data.indexOf(u) &&\n                      v(+n.data.slice(u.length));\n                  }),\n                  t.addEventListener\n                    ? t.addEventListener(\"message\", c, !1)\n                    : t.attachEvent(\"onmessage\", c),\n                  (e = function (n) {\n                    t.postMessage(u + n, \"*\");\n                  })),\n            (p.setImmediate = function (t) {\n              \"function\" != typeof t && (t = new Function(\"\" + t));\n              for (\n                var n = new Array(arguments.length - 1), r = 0;\n                r < n.length;\n                r++\n              )\n                n[r] = arguments[r + 1];\n              var o = { callback: t, args: n };\n              return (s[a] = o), e(a), a++;\n            }),\n            (p.clearImmediate = h);\n        }\n        function h(t) {\n          delete s[t];\n        }\n        function v(t) {\n          if (f) setTimeout(v, 0, t);\n          else {\n            var n = s[t];\n            if (n) {\n              f = !0;\n              try {\n                !(function (t) {\n                  var n = t.callback,\n                    r = t.args;\n                  switch (r.length) {\n                    case 0:\n                      n();\n                      break;\n                    case 1:\n                      n(r[0]);\n                      break;\n                    case 2:\n                      n(r[0], r[1]);\n                      break;\n                    case 3:\n                      n(r[0], r[1], r[2]);\n                      break;\n                    default:\n                      n.apply(void 0, r);\n                  }\n                })(n);\n              } finally {\n                h(t), (f = !1);\n              }\n            }\n          }\n        }\n      })(\"undefined\" == typeof self ? (void 0 === t ? this : t) : self);\n    }).call(this, r(11), r(13));\n  },\n  function (t, n, r) {\n    \"use strict\";\n    (n.decode = n.parse = r(235)), (n.encode = n.stringify = r(236));\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t, n) {\n      return Object.prototype.hasOwnProperty.call(t, n);\n    }\n    t.exports = function (t, n, r, i) {\n      (n = n || \"&\"), (r = r || \"=\");\n      var u = {};\n      if (\"string\" != typeof t || 0 === t.length) return u;\n      var c = /\\+/g;\n      t = t.split(n);\n      var a = 1e3;\n      i && \"number\" == typeof i.maxKeys && (a = i.maxKeys);\n      var s = t.length;\n      a > 0 && s > a && (s = a);\n      for (var f = 0; f < s; ++f) {\n        var l,\n          p,\n          h,\n          v,\n          d = t[f].replace(c, \"%20\"),\n          y = d.indexOf(r);\n        y >= 0\n          ? ((l = d.substr(0, y)), (p = d.substr(y + 1)))\n          : ((l = d), (p = \"\")),\n          (h = decodeURIComponent(l)),\n          (v = decodeURIComponent(p)),\n          e(u, h) ? (o(u[h]) ? u[h].push(v) : (u[h] = [u[h], v])) : (u[h] = v);\n      }\n      return u;\n    };\n    var o =\n      Array.isArray ||\n      function (t) {\n        return \"[object Array]\" === Object.prototype.toString.call(t);\n      };\n  },\n  function (t, n, r) {\n    \"use strict\";\n    function e(t) {\n      return (e =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    var o = function (t) {\n      switch (e(t)) {\n        case \"string\":\n          return t;\n        case \"boolean\":\n          return t ? \"true\" : \"false\";\n        case \"number\":\n          return isFinite(t) ? t : \"\";\n        default:\n          return \"\";\n      }\n    };\n    t.exports = function (t, n, r, a) {\n      return (\n        (n = n || \"&\"),\n        (r = r || \"=\"),\n        null === t && (t = void 0),\n        \"object\" === e(t)\n          ? u(c(t), function (e) {\n              var c = encodeURIComponent(o(e)) + r;\n              return i(t[e])\n                ? u(t[e], function (t) {\n                    return c + encodeURIComponent(o(t));\n                  }).join(n)\n                : c + encodeURIComponent(o(t[e]));\n            }).join(n)\n          : a\n            ? encodeURIComponent(o(a)) + r + encodeURIComponent(o(t))\n            : \"\"\n      );\n    };\n    var i =\n      Array.isArray ||\n      function (t) {\n        return \"[object Array]\" === Object.prototype.toString.call(t);\n      };\n    function u(t, n) {\n      if (t.map) return t.map(n);\n      for (var r = [], e = 0; e < t.length; e++) r.push(n(t[e], e));\n      return r;\n    }\n    var c =\n      Object.keys ||\n      function (t) {\n        var n = [];\n        for (var r in t)\n          Object.prototype.hasOwnProperty.call(t, r) && n.push(r);\n        return n;\n      };\n  },\n  function (t, n, r) {\n    \"use strict\";\n    t.exports = function (t) {\n      var n = /^\\\\\\\\\\?\\\\/.test(t),\n        r = /[^\\u0000-\\u0080]+/.test(t);\n      return n || r ? t : t.replace(/\\\\/g, \"/\");\n    };\n  },\n  function (t, n, r) {\n    var e, o, i, u;\n    function c(t) {\n      return (c =\n        \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator\n          ? function (t) {\n              return typeof t;\n            }\n          : function (t) {\n              return t &&\n                \"function\" == typeof Symbol &&\n                t.constructor === Symbol &&\n                t !== Symbol.prototype\n                ? \"symbol\"\n                : typeof t;\n            })(t);\n    }\n    /** @license URI.js v4.2.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ (u =\n      function (t) {\n        \"use strict\";\n        function n() {\n          for (var t = arguments.length, n = Array(t), r = 0; r < t; r++)\n            n[r] = arguments[r];\n          if (n.length > 1) {\n            n[0] = n[0].slice(0, -1);\n            for (var e = n.length - 1, o = 1; o < e; ++o)\n              n[o] = n[o].slice(1, -1);\n            return (n[e] = n[e].slice(1)), n.join(\"\");\n          }\n          return n[0];\n        }\n        function r(t) {\n          return \"(?:\" + t + \")\";\n        }\n        function e(t) {\n          return void 0 === t\n            ? \"undefined\"\n            : null === t\n              ? \"null\"\n              : Object.prototype.toString\n                  .call(t)\n                  .split(\" \")\n                  .pop()\n                  .split(\"]\")\n                  .shift()\n                  .toLowerCase();\n        }\n        function o(t) {\n          return t.toUpperCase();\n        }\n        function i(t) {\n          var e = n(\"[0-9]\", \"[A-Fa-f]\"),\n            o = r(\n              r(\"%[EFef]\" + e + \"%\" + e + e + \"%\" + e + e) +\n                \"|\" +\n                r(\"%[89A-Fa-f]\" + e + \"%\" + e + e) +\n                \"|\" +\n                r(\"%\" + e + e),\n            ),\n            i = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n            u = n(\"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\", i),\n            c = t ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\",\n            a = n(\n              \"[A-Za-z]\",\n              \"[0-9]\",\n              \"[\\\\-\\\\.\\\\_\\\\~]\",\n              t\n                ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\"\n                : \"[]\",\n            ),\n            s = r(\"[A-Za-z]\" + n(\"[A-Za-z]\", \"[0-9]\", \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n            f = r(r(o + \"|\" + n(a, i, \"[\\\\:]\")) + \"*\"),\n            l =\n              (r(\n                r(\"25[0-5]\") +\n                  \"|\" +\n                  r(\"2[0-4][0-9]\") +\n                  \"|\" +\n                  r(\"1[0-9][0-9]\") +\n                  \"|\" +\n                  r(\"[1-9][0-9]\") +\n                  \"|[0-9]\",\n              ),\n              r(\n                r(\"25[0-5]\") +\n                  \"|\" +\n                  r(\"2[0-4][0-9]\") +\n                  \"|\" +\n                  r(\"1[0-9][0-9]\") +\n                  \"|\" +\n                  r(\"0?[1-9][0-9]\") +\n                  \"|0?0?[0-9]\",\n              )),\n            p = r(l + \"\\\\.\" + l + \"\\\\.\" + l + \"\\\\.\" + l),\n            h = r(e + \"{1,4}\"),\n            v = r(r(h + \"\\\\:\" + h) + \"|\" + p),\n            d = r(r(h + \"\\\\:\") + \"{6}\" + v),\n            y = r(\"\\\\:\\\\:\" + r(h + \"\\\\:\") + \"{5}\" + v),\n            _ = r(r(h) + \"?\\\\:\\\\:\" + r(h + \"\\\\:\") + \"{4}\" + v),\n            g = r(\n              r(r(h + \"\\\\:\") + \"{0,1}\" + h) +\n                \"?\\\\:\\\\:\" +\n                r(h + \"\\\\:\") +\n                \"{3}\" +\n                v,\n            ),\n            b = r(\n              r(r(h + \"\\\\:\") + \"{0,2}\" + h) +\n                \"?\\\\:\\\\:\" +\n                r(h + \"\\\\:\") +\n                \"{2}\" +\n                v,\n            ),\n            m = r(r(r(h + \"\\\\:\") + \"{0,3}\" + h) + \"?\\\\:\\\\:\" + h + \"\\\\:\" + v),\n            w = r(r(r(h + \"\\\\:\") + \"{0,4}\" + h) + \"?\\\\:\\\\:\" + v),\n            x = r(r(r(h + \"\\\\:\") + \"{0,5}\" + h) + \"?\\\\:\\\\:\" + h),\n            j = r(r(r(h + \"\\\\:\") + \"{0,6}\" + h) + \"?\\\\:\\\\:\"),\n            E = r([d, y, _, g, b, m, w, x, j].join(\"|\")),\n            S = r(r(a + \"|\" + o) + \"+\"),\n            O = (r(E + \"\\\\%25\" + S), r(E + r(\"\\\\%25|\\\\%(?!\" + e + \"{2})\") + S)),\n            A = r(\"[vV]\" + e + \"+\\\\.\" + n(a, i, \"[\\\\:]\") + \"+\"),\n            T = r(\"\\\\[\" + r(O + \"|\" + E + \"|\" + A) + \"\\\\]\"),\n            C = r(r(o + \"|\" + n(a, i)) + \"*\"),\n            I = r(T + \"|\" + p + \"(?!\" + C + \")|\" + C),\n            P = r(\"[0-9]*\"),\n            k = r(r(f + \"@\") + \"?\" + I + r(\"\\\\:\" + P) + \"?\"),\n            R = r(o + \"|\" + n(a, i, \"[\\\\:\\\\@]\")),\n            D = r(R + \"*\"),\n            U = r(R + \"+\"),\n            N = r(r(o + \"|\" + n(a, i, \"[\\\\@]\")) + \"+\"),\n            z = r(r(\"\\\\/\" + D) + \"*\"),\n            F = r(\"\\\\/\" + r(U + z) + \"?\"),\n            L = r(N + z),\n            q = r(U + z),\n            M = \"(?!\" + R + \")\",\n            $ =\n              (r(z + \"|\" + F + \"|\" + L + \"|\" + q + \"|\" + M),\n              r(r(R + \"|\" + n(\"[\\\\/\\\\?]\", c)) + \"*\")),\n            B = r(r(R + \"|[\\\\/\\\\?]\") + \"*\"),\n            H = r(r(\"\\\\/\\\\/\" + k + z) + \"|\" + F + \"|\" + q + \"|\" + M),\n            W = r(s + \"\\\\:\" + H + r(\"\\\\?\" + $) + \"?\" + r(\"\\\\#\" + B) + \"?\"),\n            V = r(r(\"\\\\/\\\\/\" + k + z) + \"|\" + F + \"|\" + L + \"|\" + M),\n            G = r(V + r(\"\\\\?\" + $) + \"?\" + r(\"\\\\#\" + B) + \"?\");\n          return (\n            r(W + \"|\" + G),\n            r(s + \"\\\\:\" + H + r(\"\\\\?\" + $) + \"?\"),\n            r(\n              r(\n                \"\\\\/\\\\/(\" +\n                  r(\"(\" + f + \")@\") +\n                  \"?(\" +\n                  I +\n                  \")\" +\n                  r(\"\\\\:(\" + P + \")\") +\n                  \"?)\",\n              ) +\n                \"?(\" +\n                z +\n                \"|\" +\n                F +\n                \"|\" +\n                q +\n                \"|\" +\n                M +\n                \")\",\n            ),\n            r(\"\\\\?(\" + $ + \")\"),\n            r(\"\\\\#(\" + B + \")\"),\n            r(\n              r(\n                \"\\\\/\\\\/(\" +\n                  r(\"(\" + f + \")@\") +\n                  \"?(\" +\n                  I +\n                  \")\" +\n                  r(\"\\\\:(\" + P + \")\") +\n                  \"?)\",\n              ) +\n                \"?(\" +\n                z +\n                \"|\" +\n                F +\n                \"|\" +\n                L +\n                \"|\" +\n                M +\n                \")\",\n            ),\n            r(\"\\\\?(\" + $ + \")\"),\n            r(\"\\\\#(\" + B + \")\"),\n            r(\n              r(\n                \"\\\\/\\\\/(\" +\n                  r(\"(\" + f + \")@\") +\n                  \"?(\" +\n                  I +\n                  \")\" +\n                  r(\"\\\\:(\" + P + \")\") +\n                  \"?)\",\n              ) +\n                \"?(\" +\n                z +\n                \"|\" +\n                F +\n                \"|\" +\n                q +\n                \"|\" +\n                M +\n                \")\",\n            ),\n            r(\"\\\\?(\" + $ + \")\"),\n            r(\"\\\\#(\" + B + \")\"),\n            r(\"(\" + f + \")@\"),\n            r(\"\\\\:(\" + P + \")\"),\n            {\n              NOT_SCHEME: new RegExp(\n                n(\"[^]\", \"[A-Za-z]\", \"[0-9]\", \"[\\\\+\\\\-\\\\.]\"),\n                \"g\",\n              ),\n              NOT_USERINFO: new RegExp(n(\"[^\\\\%\\\\:]\", a, i), \"g\"),\n              NOT_HOST: new RegExp(n(\"[^\\\\%\\\\[\\\\]\\\\:]\", a, i), \"g\"),\n              NOT_PATH: new RegExp(n(\"[^\\\\%\\\\/\\\\:\\\\@]\", a, i), \"g\"),\n              NOT_PATH_NOSCHEME: new RegExp(n(\"[^\\\\%\\\\/\\\\@]\", a, i), \"g\"),\n              NOT_QUERY: new RegExp(\n                n(\"[^\\\\%]\", a, i, \"[\\\\:\\\\@\\\\/\\\\?]\", c),\n                \"g\",\n              ),\n              NOT_FRAGMENT: new RegExp(\n                n(\"[^\\\\%]\", a, i, \"[\\\\:\\\\@\\\\/\\\\?]\"),\n                \"g\",\n              ),\n              ESCAPE: new RegExp(n(\"[^]\", a, i), \"g\"),\n              UNRESERVED: new RegExp(a, \"g\"),\n              OTHER_CHARS: new RegExp(n(\"[^\\\\%]\", a, u), \"g\"),\n              PCT_ENCODED: new RegExp(o, \"g\"),\n              IPV4ADDRESS: new RegExp(\"^(\" + p + \")$\"),\n              IPV6ADDRESS: new RegExp(\n                \"^\\\\[?(\" +\n                  E +\n                  \")\" +\n                  r(r(\"\\\\%25|\\\\%(?!\" + e + \"{2})\") + \"(\" + S + \")\") +\n                  \"?\\\\]?$\",\n              ),\n            }\n          );\n        }\n        var u = i(!1),\n          c = i(!0),\n          a = function (t, n) {\n            if (Array.isArray(t)) return t;\n            if (Symbol.iterator in Object(t))\n              return (function (t, n) {\n                var r = [],\n                  e = !0,\n                  o = !1,\n                  i = void 0;\n                try {\n                  for (\n                    var u, c = t[Symbol.iterator]();\n                    !(e = (u = c.next()).done) &&\n                    (r.push(u.value), !n || r.length !== n);\n                    e = !0\n                  );\n                } catch (t) {\n                  (o = !0), (i = t);\n                } finally {\n                  try {\n                    !e && c.return && c.return();\n                  } finally {\n                    if (o) throw i;\n                  }\n                }\n                return r;\n              })(t, n);\n            throw new TypeError(\n              \"Invalid attempt to destructure non-iterable instance\",\n            );\n          },\n          s = 2147483647,\n          f = /^xn--/,\n          l = /[^\\0-\\x7E]/,\n          p = /[\\x2E\\u3002\\uFF0E\\uFF61]/g,\n          h = {\n            overflow: \"Overflow: input needs wider integers to process\",\n            \"not-basic\": \"Illegal input >= 0x80 (not a basic code point)\",\n            \"invalid-input\": \"Invalid input\",\n          },\n          v = Math.floor,\n          d = String.fromCharCode;\n        function y(t) {\n          throw new RangeError(h[t]);\n        }\n        function _(t, n) {\n          var r = t.split(\"@\"),\n            e = \"\";\n          r.length > 1 && ((e = r[0] + \"@\"), (t = r[1]));\n          var o = (function (t, n) {\n            for (var r = [], e = t.length; e--; ) r[e] = n(t[e]);\n            return r;\n          })((t = t.replace(p, \".\")).split(\".\"), n).join(\".\");\n          return e + o;\n        }\n        function g(t) {\n          for (var n = [], r = 0, e = t.length; r < e; ) {\n            var o = t.charCodeAt(r++);\n            if (o >= 55296 && o <= 56319 && r < e) {\n              var i = t.charCodeAt(r++);\n              56320 == (64512 & i)\n                ? n.push(((1023 & o) << 10) + (1023 & i) + 65536)\n                : (n.push(o), r--);\n            } else n.push(o);\n          }\n          return n;\n        }\n        var b = function (t, n) {\n            return t + 22 + 75 * (t < 26) - ((0 != n) << 5);\n          },\n          m = function (t, n, r) {\n            var e = 0;\n            for (t = r ? v(t / 700) : t >> 1, t += v(t / n); t > 455; e += 36)\n              t = v(t / 35);\n            return v(e + (36 * t) / (t + 38));\n          },\n          w = function (t) {\n            var n,\n              r = [],\n              e = t.length,\n              o = 0,\n              i = 128,\n              u = 72,\n              c = t.lastIndexOf(\"-\");\n            c < 0 && (c = 0);\n            for (var a = 0; a < c; ++a)\n              t.charCodeAt(a) >= 128 && y(\"not-basic\"), r.push(t.charCodeAt(a));\n            for (var f = c > 0 ? c + 1 : 0; f < e; ) {\n              for (var l = o, p = 1, h = 36; ; h += 36) {\n                f >= e && y(\"invalid-input\");\n                var d =\n                  (n = t.charCodeAt(f++)) - 48 < 10\n                    ? n - 22\n                    : n - 65 < 26\n                      ? n - 65\n                      : n - 97 < 26\n                        ? n - 97\n                        : 36;\n                (d >= 36 || d > v((s - o) / p)) && y(\"overflow\"), (o += d * p);\n                var _ = h <= u ? 1 : h >= u + 26 ? 26 : h - u;\n                if (d < _) break;\n                var g = 36 - _;\n                p > v(s / g) && y(\"overflow\"), (p *= g);\n              }\n              var b = r.length + 1;\n              (u = m(o - l, b, 0 == l)),\n                v(o / b) > s - i && y(\"overflow\"),\n                (i += v(o / b)),\n                (o %= b),\n                r.splice(o++, 0, i);\n            }\n            return String.fromCodePoint.apply(String, r);\n          },\n          x = function (t) {\n            var n = [],\n              r = (t = g(t)).length,\n              e = 128,\n              o = 0,\n              i = 72,\n              u = !0,\n              c = !1,\n              a = void 0;\n            try {\n              for (\n                var f, l = t[Symbol.iterator]();\n                !(u = (f = l.next()).done);\n                u = !0\n              ) {\n                var p = f.value;\n                p < 128 && n.push(d(p));\n              }\n            } catch (t) {\n              (c = !0), (a = t);\n            } finally {\n              try {\n                !u && l.return && l.return();\n              } finally {\n                if (c) throw a;\n              }\n            }\n            var h = n.length,\n              _ = h;\n            for (h && n.push(\"-\"); _ < r; ) {\n              var w = s,\n                x = !0,\n                j = !1,\n                E = void 0;\n              try {\n                for (\n                  var S, O = t[Symbol.iterator]();\n                  !(x = (S = O.next()).done);\n                  x = !0\n                ) {\n                  var A = S.value;\n                  A >= e && A < w && (w = A);\n                }\n              } catch (t) {\n                (j = !0), (E = t);\n              } finally {\n                try {\n                  !x && O.return && O.return();\n                } finally {\n                  if (j) throw E;\n                }\n              }\n              var T = _ + 1;\n              w - e > v((s - o) / T) && y(\"overflow\"),\n                (o += (w - e) * T),\n                (e = w);\n              var C = !0,\n                I = !1,\n                P = void 0;\n              try {\n                for (\n                  var k, R = t[Symbol.iterator]();\n                  !(C = (k = R.next()).done);\n                  C = !0\n                ) {\n                  var D = k.value;\n                  if ((D < e && ++o > s && y(\"overflow\"), D == e)) {\n                    for (var U = o, N = 36; ; N += 36) {\n                      var z = N <= i ? 1 : N >= i + 26 ? 26 : N - i;\n                      if (U < z) break;\n                      var F = U - z,\n                        L = 36 - z;\n                      n.push(d(b(z + (F % L), 0))), (U = v(F / L));\n                    }\n                    n.push(d(b(U, 0))), (i = m(o, T, _ == h)), (o = 0), ++_;\n                  }\n                }\n              } catch (t) {\n                (I = !0), (P = t);\n              } finally {\n                try {\n                  !C && R.return && R.return();\n                } finally {\n                  if (I) throw P;\n                }\n              }\n              ++o, ++e;\n            }\n            return n.join(\"\");\n          },\n          j = function (t) {\n            return _(t, function (t) {\n              return l.test(t) ? \"xn--\" + x(t) : t;\n            });\n          },\n          E = function (t) {\n            return _(t, function (t) {\n              return f.test(t) ? w(t.slice(4).toLowerCase()) : t;\n            });\n          },\n          S = {};\n        function O(t) {\n          var n = t.charCodeAt(0);\n          return n < 16\n            ? \"%0\" + n.toString(16).toUpperCase()\n            : n < 128\n              ? \"%\" + n.toString(16).toUpperCase()\n              : n < 2048\n                ? \"%\" +\n                  ((n >> 6) | 192).toString(16).toUpperCase() +\n                  \"%\" +\n                  ((63 & n) | 128).toString(16).toUpperCase()\n                : \"%\" +\n                  ((n >> 12) | 224).toString(16).toUpperCase() +\n                  \"%\" +\n                  (((n >> 6) & 63) | 128).toString(16).toUpperCase() +\n                  \"%\" +\n                  ((63 & n) | 128).toString(16).toUpperCase();\n        }\n        function A(t) {\n          for (var n = \"\", r = 0, e = t.length; r < e; ) {\n            var o = parseInt(t.substr(r + 1, 2), 16);\n            if (o < 128) (n += String.fromCharCode(o)), (r += 3);\n            else if (o >= 194 && o < 224) {\n              if (e - r >= 6) {\n                var i = parseInt(t.substr(r + 4, 2), 16);\n                n += String.fromCharCode(((31 & o) << 6) | (63 & i));\n              } else n += t.substr(r, 6);\n              r += 6;\n            } else if (o >= 224) {\n              if (e - r >= 9) {\n                var u = parseInt(t.substr(r + 4, 2), 16),\n                  c = parseInt(t.substr(r + 7, 2), 16);\n                n += String.fromCharCode(\n                  ((15 & o) << 12) | ((63 & u) << 6) | (63 & c),\n                );\n              } else n += t.substr(r, 9);\n              r += 9;\n            } else (n += t.substr(r, 3)), (r += 3);\n          }\n          return n;\n        }\n        function T(t, n) {\n          function r(t) {\n            var r = A(t);\n            return r.match(n.UNRESERVED) ? r : t;\n          }\n          return (\n            t.scheme &&\n              (t.scheme = String(t.scheme)\n                .replace(n.PCT_ENCODED, r)\n                .toLowerCase()\n                .replace(n.NOT_SCHEME, \"\")),\n            void 0 !== t.userinfo &&\n              (t.userinfo = String(t.userinfo)\n                .replace(n.PCT_ENCODED, r)\n                .replace(n.NOT_USERINFO, O)\n                .replace(n.PCT_ENCODED, o)),\n            void 0 !== t.host &&\n              (t.host = String(t.host)\n                .replace(n.PCT_ENCODED, r)\n                .toLowerCase()\n                .replace(n.NOT_HOST, O)\n                .replace(n.PCT_ENCODED, o)),\n            void 0 !== t.path &&\n              (t.path = String(t.path)\n                .replace(n.PCT_ENCODED, r)\n                .replace(t.scheme ? n.NOT_PATH : n.NOT_PATH_NOSCHEME, O)\n                .replace(n.PCT_ENCODED, o)),\n            void 0 !== t.query &&\n              (t.query = String(t.query)\n                .replace(n.PCT_ENCODED, r)\n                .replace(n.NOT_QUERY, O)\n                .replace(n.PCT_ENCODED, o)),\n            void 0 !== t.fragment &&\n              (t.fragment = String(t.fragment)\n                .replace(n.PCT_ENCODED, r)\n                .replace(n.NOT_FRAGMENT, O)\n                .replace(n.PCT_ENCODED, o)),\n            t\n          );\n        }\n        function C(t) {\n          return t.replace(/^0*(.*)/, \"$1\") || \"0\";\n        }\n        function I(t, n) {\n          var r = t.match(n.IPV4ADDRESS) || [],\n            e = a(r, 2)[1];\n          return e ? e.split(\".\").map(C).join(\".\") : t;\n        }\n        function P(t, n) {\n          var r = t.match(n.IPV6ADDRESS) || [],\n            e = a(r, 3),\n            o = e[1],\n            i = e[2];\n          if (o) {\n            for (\n              var u = o.toLowerCase().split(\"::\").reverse(),\n                c = a(u, 2),\n                s = c[0],\n                f = c[1],\n                l = f ? f.split(\":\").map(C) : [],\n                p = s.split(\":\").map(C),\n                h = n.IPV4ADDRESS.test(p[p.length - 1]),\n                v = h ? 7 : 8,\n                d = p.length - v,\n                y = Array(v),\n                _ = 0;\n              _ < v;\n              ++_\n            )\n              y[_] = l[_] || p[d + _] || \"\";\n            h && (y[v - 1] = I(y[v - 1], n));\n            var g = y\n                .reduce(function (t, n, r) {\n                  if (!n || \"0\" === n) {\n                    var e = t[t.length - 1];\n                    e && e.index + e.length === r\n                      ? e.length++\n                      : t.push({ index: r, length: 1 });\n                  }\n                  return t;\n                }, [])\n                .sort(function (t, n) {\n                  return n.length - t.length;\n                })[0],\n              b = void 0;\n            if (g && g.length > 1) {\n              var m = y.slice(0, g.index),\n                w = y.slice(g.index + g.length);\n              b = m.join(\":\") + \"::\" + w.join(\":\");\n            } else b = y.join(\":\");\n            return i && (b += \"%\" + i), b;\n          }\n          return t;\n        }\n        var k =\n            /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i,\n          R = void 0 === \"\".match(/(){0}/)[1];\n        function D(t) {\n          var n =\n              arguments.length > 1 && void 0 !== arguments[1]\n                ? arguments[1]\n                : {},\n            r = {},\n            e = !1 !== n.iri ? c : u;\n          \"suffix\" === n.reference &&\n            (t = (n.scheme ? n.scheme + \":\" : \"\") + \"//\" + t);\n          var o = t.match(k);\n          if (o) {\n            R\n              ? ((r.scheme = o[1]),\n                (r.userinfo = o[3]),\n                (r.host = o[4]),\n                (r.port = parseInt(o[5], 10)),\n                (r.path = o[6] || \"\"),\n                (r.query = o[7]),\n                (r.fragment = o[8]),\n                isNaN(r.port) && (r.port = o[5]))\n              : ((r.scheme = o[1] || void 0),\n                (r.userinfo = -1 !== t.indexOf(\"@\") ? o[3] : void 0),\n                (r.host = -1 !== t.indexOf(\"//\") ? o[4] : void 0),\n                (r.port = parseInt(o[5], 10)),\n                (r.path = o[6] || \"\"),\n                (r.query = -1 !== t.indexOf(\"?\") ? o[7] : void 0),\n                (r.fragment = -1 !== t.indexOf(\"#\") ? o[8] : void 0),\n                isNaN(r.port) &&\n                  (r.port = t.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/)\n                    ? o[4]\n                    : void 0)),\n              r.host && (r.host = P(I(r.host, e), e)),\n              void 0 !== r.scheme ||\n              void 0 !== r.userinfo ||\n              void 0 !== r.host ||\n              void 0 !== r.port ||\n              r.path ||\n              void 0 !== r.query\n                ? void 0 === r.scheme\n                  ? (r.reference = \"relative\")\n                  : void 0 === r.fragment\n                    ? (r.reference = \"absolute\")\n                    : (r.reference = \"uri\")\n                : (r.reference = \"same-document\"),\n              n.reference &&\n                \"suffix\" !== n.reference &&\n                n.reference !== r.reference &&\n                (r.error =\n                  r.error || \"URI is not a \" + n.reference + \" reference.\");\n            var i = S[(n.scheme || r.scheme || \"\").toLowerCase()];\n            if (n.unicodeSupport || (i && i.unicodeSupport)) T(r, e);\n            else {\n              if (r.host && (n.domainHost || (i && i.domainHost)))\n                try {\n                  r.host = j(r.host.replace(e.PCT_ENCODED, A).toLowerCase());\n                } catch (t) {\n                  r.error =\n                    r.error ||\n                    \"Host's domain name can not be converted to ASCII via punycode: \" +\n                      t;\n                }\n              T(r, u);\n            }\n            i && i.parse && i.parse(r, n);\n          } else r.error = r.error || \"URI can not be parsed.\";\n          return r;\n        }\n        function U(t, n) {\n          var r = !1 !== n.iri ? c : u,\n            e = [];\n          return (\n            void 0 !== t.userinfo && (e.push(t.userinfo), e.push(\"@\")),\n            void 0 !== t.host &&\n              e.push(\n                P(I(String(t.host), r), r).replace(\n                  r.IPV6ADDRESS,\n                  function (t, n, r) {\n                    return \"[\" + n + (r ? \"%25\" + r : \"\") + \"]\";\n                  },\n                ),\n              ),\n            \"number\" == typeof t.port &&\n              (e.push(\":\"), e.push(t.port.toString(10))),\n            e.length ? e.join(\"\") : void 0\n          );\n        }\n        var N = /^\\.\\.?\\//,\n          z = /^\\/\\.(\\/|$)/,\n          F = /^\\/\\.\\.(\\/|$)/,\n          L = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n        function q(t) {\n          for (var n = []; t.length; )\n            if (t.match(N)) t = t.replace(N, \"\");\n            else if (t.match(z)) t = t.replace(z, \"/\");\n            else if (t.match(F)) (t = t.replace(F, \"/\")), n.pop();\n            else if (\".\" === t || \"..\" === t) t = \"\";\n            else {\n              var r = t.match(L);\n              if (!r) throw new Error(\"Unexpected dot segment condition\");\n              var e = r[0];\n              (t = t.slice(e.length)), n.push(e);\n            }\n          return n.join(\"\");\n        }\n        function M(t) {\n          var n =\n              arguments.length > 1 && void 0 !== arguments[1]\n                ? arguments[1]\n                : {},\n            r = n.iri ? c : u,\n            e = [],\n            o = S[(n.scheme || t.scheme || \"\").toLowerCase()];\n          if ((o && o.serialize && o.serialize(t, n), t.host))\n            if (r.IPV6ADDRESS.test(t.host));\n            else if (n.domainHost || (o && o.domainHost))\n              try {\n                t.host = n.iri\n                  ? E(t.host)\n                  : j(t.host.replace(r.PCT_ENCODED, A).toLowerCase());\n              } catch (r) {\n                t.error =\n                  t.error ||\n                  \"Host's domain name can not be converted to \" +\n                    (n.iri ? \"Unicode\" : \"ASCII\") +\n                    \" via punycode: \" +\n                    r;\n              }\n          T(t, r),\n            \"suffix\" !== n.reference &&\n              t.scheme &&\n              (e.push(t.scheme), e.push(\":\"));\n          var i = U(t, n);\n          if (\n            (void 0 !== i &&\n              (\"suffix\" !== n.reference && e.push(\"//\"),\n              e.push(i),\n              t.path && \"/\" !== t.path.charAt(0) && e.push(\"/\")),\n            void 0 !== t.path)\n          ) {\n            var a = t.path;\n            n.absolutePath || (o && o.absolutePath) || (a = q(a)),\n              void 0 === i && (a = a.replace(/^\\/\\//, \"/%2F\")),\n              e.push(a);\n          }\n          return (\n            void 0 !== t.query && (e.push(\"?\"), e.push(t.query)),\n            void 0 !== t.fragment && (e.push(\"#\"), e.push(t.fragment)),\n            e.join(\"\")\n          );\n        }\n        function $(t, n) {\n          var r =\n              arguments.length > 2 && void 0 !== arguments[2]\n                ? arguments[2]\n                : {},\n            e = arguments[3],\n            o = {};\n          return (\n            e || ((t = D(M(t, r), r)), (n = D(M(n, r), r))),\n            !(r = r || {}).tolerant && n.scheme\n              ? ((o.scheme = n.scheme),\n                (o.userinfo = n.userinfo),\n                (o.host = n.host),\n                (o.port = n.port),\n                (o.path = q(n.path || \"\")),\n                (o.query = n.query))\n              : (void 0 !== n.userinfo || void 0 !== n.host || void 0 !== n.port\n                  ? ((o.userinfo = n.userinfo),\n                    (o.host = n.host),\n                    (o.port = n.port),\n                    (o.path = q(n.path || \"\")),\n                    (o.query = n.query))\n                  : (n.path\n                      ? (\"/\" === n.path.charAt(0)\n                          ? (o.path = q(n.path))\n                          : ((void 0 === t.userinfo &&\n                              void 0 === t.host &&\n                              void 0 === t.port) ||\n                            t.path\n                              ? t.path\n                                ? (o.path =\n                                    t.path.slice(\n                                      0,\n                                      t.path.lastIndexOf(\"/\") + 1,\n                                    ) + n.path)\n                                : (o.path = n.path)\n                              : (o.path = \"/\" + n.path),\n                            (o.path = q(o.path))),\n                        (o.query = n.query))\n                      : ((o.path = t.path),\n                        void 0 !== n.query\n                          ? (o.query = n.query)\n                          : (o.query = t.query)),\n                    (o.userinfo = t.userinfo),\n                    (o.host = t.host),\n                    (o.port = t.port)),\n                (o.scheme = t.scheme)),\n            (o.fragment = n.fragment),\n            o\n          );\n        }\n        function B(t, n) {\n          return (\n            t &&\n            t.toString().replace(n && n.iri ? c.PCT_ENCODED : u.PCT_ENCODED, A)\n          );\n        }\n        var H = {\n            scheme: \"http\",\n            domainHost: !0,\n            parse: function (t, n) {\n              return (\n                t.host || (t.error = t.error || \"HTTP URIs must have a host.\"),\n                t\n              );\n            },\n            serialize: function (t, n) {\n              return (\n                (t.port !==\n                  (\"https\" !== String(t.scheme).toLowerCase() ? 80 : 443) &&\n                  \"\" !== t.port) ||\n                  (t.port = void 0),\n                t.path || (t.path = \"/\"),\n                t\n              );\n            },\n          },\n          W = {\n            scheme: \"https\",\n            domainHost: H.domainHost,\n            parse: H.parse,\n            serialize: H.serialize,\n          },\n          V = {},\n          G =\n            \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\",\n          Z = \"[0-9A-Fa-f]\",\n          J = r(\n            r(\"%[EFef][0-9A-Fa-f]%\" + Z + Z + \"%\" + Z + Z) +\n              \"|\" +\n              r(\"%[89A-Fa-f][0-9A-Fa-f]%\" + Z + Z) +\n              \"|\" +\n              r(\"%\" + Z + Z),\n          ),\n          X = n(\n            \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\",\n            '[\\\\\"\\\\\\\\]',\n          ),\n          K = new RegExp(G, \"g\"),\n          Y = new RegExp(J, \"g\"),\n          Q = new RegExp(\n            n(\n              \"[^]\",\n              \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\",\n              \"[\\\\.]\",\n              '[\\\\\"]',\n              X,\n            ),\n            \"g\",\n          ),\n          tt = new RegExp(\n            n(\"[^]\", G, \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\"),\n            \"g\",\n          ),\n          nt = tt;\n        function rt(t) {\n          var n = A(t);\n          return n.match(K) ? n : t;\n        }\n        var et = {\n            scheme: \"mailto\",\n            parse: function (t, n) {\n              var r = t,\n                e = (r.to = r.path ? r.path.split(\",\") : []);\n              if (((r.path = void 0), r.query)) {\n                for (\n                  var o = !1,\n                    i = {},\n                    u = r.query.split(\"&\"),\n                    c = 0,\n                    a = u.length;\n                  c < a;\n                  ++c\n                ) {\n                  var s = u[c].split(\"=\");\n                  switch (s[0]) {\n                    case \"to\":\n                      for (\n                        var f = s[1].split(\",\"), l = 0, p = f.length;\n                        l < p;\n                        ++l\n                      )\n                        e.push(f[l]);\n                      break;\n                    case \"subject\":\n                      r.subject = B(s[1], n);\n                      break;\n                    case \"body\":\n                      r.body = B(s[1], n);\n                      break;\n                    default:\n                      (o = !0), (i[B(s[0], n)] = B(s[1], n));\n                  }\n                }\n                o && (r.headers = i);\n              }\n              r.query = void 0;\n              for (var h = 0, v = e.length; h < v; ++h) {\n                var d = e[h].split(\"@\");\n                if (((d[0] = B(d[0])), n.unicodeSupport))\n                  d[1] = B(d[1], n).toLowerCase();\n                else\n                  try {\n                    d[1] = j(B(d[1], n).toLowerCase());\n                  } catch (t) {\n                    r.error =\n                      r.error ||\n                      \"Email address's domain name can not be converted to ASCII via punycode: \" +\n                        t;\n                  }\n                e[h] = d.join(\"@\");\n              }\n              return r;\n            },\n            serialize: function (t, n) {\n              var r,\n                e = t,\n                i =\n                  null != (r = t.to)\n                    ? r instanceof Array\n                      ? r\n                      : \"number\" != typeof r.length ||\n                          r.split ||\n                          r.setInterval ||\n                          r.call\n                        ? [r]\n                        : Array.prototype.slice.call(r)\n                    : [];\n              if (i) {\n                for (var u = 0, c = i.length; u < c; ++u) {\n                  var a = String(i[u]),\n                    s = a.lastIndexOf(\"@\"),\n                    f = a\n                      .slice(0, s)\n                      .replace(Y, rt)\n                      .replace(Y, o)\n                      .replace(Q, O),\n                    l = a.slice(s + 1);\n                  try {\n                    l = n.iri ? E(l) : j(B(l, n).toLowerCase());\n                  } catch (t) {\n                    e.error =\n                      e.error ||\n                      \"Email address's domain name can not be converted to \" +\n                        (n.iri ? \"Unicode\" : \"ASCII\") +\n                        \" via punycode: \" +\n                        t;\n                  }\n                  i[u] = f + \"@\" + l;\n                }\n                e.path = i.join(\",\");\n              }\n              var p = (t.headers = t.headers || {});\n              t.subject && (p.subject = t.subject), t.body && (p.body = t.body);\n              var h = [];\n              for (var v in p)\n                p[v] !== V[v] &&\n                  h.push(\n                    v.replace(Y, rt).replace(Y, o).replace(tt, O) +\n                      \"=\" +\n                      p[v].replace(Y, rt).replace(Y, o).replace(nt, O),\n                  );\n              return h.length && (e.query = h.join(\"&\")), e;\n            },\n          },\n          ot = /^([^\\:]+)\\:(.*)/,\n          it = {\n            scheme: \"urn\",\n            parse: function (t, n) {\n              var r = t.path && t.path.match(ot),\n                e = t;\n              if (r) {\n                var o = n.scheme || e.scheme || \"urn\",\n                  i = r[1].toLowerCase(),\n                  u = r[2],\n                  c = o + \":\" + (n.nid || i),\n                  a = S[c];\n                (e.nid = i),\n                  (e.nss = u),\n                  (e.path = void 0),\n                  a && (e = a.parse(e, n));\n              } else e.error = e.error || \"URN can not be parsed.\";\n              return e;\n            },\n            serialize: function (t, n) {\n              var r = n.scheme || t.scheme || \"urn\",\n                e = t.nid,\n                o = r + \":\" + (n.nid || e),\n                i = S[o];\n              i && (t = i.serialize(t, n));\n              var u = t,\n                c = t.nss;\n              return (u.path = (e || n.nid) + \":\" + c), u;\n            },\n          },\n          ut = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/,\n          ct = {\n            scheme: \"urn:uuid\",\n            parse: function (t, n) {\n              var r = t;\n              return (\n                (r.uuid = r.nss),\n                (r.nss = void 0),\n                n.tolerant ||\n                  (r.uuid && r.uuid.match(ut)) ||\n                  (r.error = r.error || \"UUID is not valid.\"),\n                r\n              );\n            },\n            serialize: function (t, n) {\n              var r = t;\n              return (r.nss = (t.uuid || \"\").toLowerCase()), r;\n            },\n          };\n        (S[H.scheme] = H),\n          (S[W.scheme] = W),\n          (S[et.scheme] = et),\n          (S[it.scheme] = it),\n          (S[ct.scheme] = ct),\n          (t.SCHEMES = S),\n          (t.pctEncChar = O),\n          (t.pctDecChars = A),\n          (t.parse = D),\n          (t.removeDotSegments = q),\n          (t.serialize = M),\n          (t.resolveComponents = $),\n          (t.resolve = function (t, n, r) {\n            var e = (function (t, n) {\n              var r = t;\n              if (n) for (var e in n) r[e] = n[e];\n              return r;\n            })({ scheme: \"null\" }, r);\n            return M($(D(t, e), D(n, e), e, !0), e);\n          }),\n          (t.normalize = function (t, n) {\n            return (\n              \"string\" == typeof t\n                ? (t = M(D(t, n), n))\n                : \"object\" === e(t) && (t = D(M(t, n), n)),\n              t\n            );\n          }),\n          (t.equal = function (t, n, r) {\n            return (\n              \"string\" == typeof t\n                ? (t = M(D(t, r), r))\n                : \"object\" === e(t) && (t = M(t, r)),\n              \"string\" == typeof n\n                ? (n = M(D(n, r), r))\n                : \"object\" === e(n) && (n = M(n, r)),\n              t === n\n            );\n          }),\n          (t.escapeComponent = function (t, n) {\n            return (\n              t && t.toString().replace(n && n.iri ? c.ESCAPE : u.ESCAPE, O)\n            );\n          }),\n          (t.unescapeComponent = B),\n          Object.defineProperty(t, \"__esModule\", { value: !0 });\n      }),\n      \"object\" === c(n) && void 0 !== t\n        ? u(n)\n        : ((o = [n]),\n          void 0 === (i = \"function\" == typeof (e = u) ? e.apply(n, o) : e) ||\n            (t.exports = i));\n  },\n]);\n"
  },
  {
    "path": "frontend/src/utils/simplifySchema.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { JsonRefs } from \"./json-refs\";\n\n// jsonforms doesn't support schemas with root $ref\n// so we resolve root $ref and replace it with the actual schema\nexport function simplifySchema(schema: any) {\n  return JsonRefs.resolveRefs(schema)\n    .then((r: any) => r.resolved)\n    .then((r) => {\n      const configurable = r.properties.configurable.properties;\n      if (configurable) {\n        for (const key in configurable) {\n          if (configurable[key].allOf && configurable[key].allOf.length === 1) {\n            configurable[key] = {\n              ...configurable[key].allOf[0],\n              title: configurable[key].title,\n              description: configurable[key].description,\n              default: configurable[key].default,\n            };\n          }\n        }\n      }\n      return r;\n    });\n}\n"
  },
  {
    "path": "frontend/src/utils/str.ts",
    "content": "export function str(o: unknown): React.ReactNode {\n  return typeof o === \"object\"\n    ? JSON.stringify(o, null, 2)\n    : (o as React.ReactNode);\n}\n"
  },
  {
    "path": "frontend/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "frontend/tailwind.config.js",
    "content": "/* eslint-disable no-undef */\n/** @type {import('tailwindcss').Config} */\nimport defaultTheme from \"tailwindcss/defaultTheme\";\n\nexport default {\n  content: [\"./index.html\", \"./src/**/*.{js,ts,jsx,tsx}\"],\n  theme: {\n    extend: {\n      fontFamily: {\n        sans: [\"Inter var\", ...defaultTheme.fontFamily.sans],\n      },\n    },\n  },\n  plugins: [require(\"@tailwindcss/forms\"), require(\"@tailwindcss/typography\")],\n};\n"
  },
  {
    "path": "frontend/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"module\": \"ESNext\",\n    \"skipLibCheck\": true,\n\n    /* Bundler mode */\n    \"moduleResolution\": \"bundler\",\n    \"allowImportingTsExtensions\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n\n    /* Linting */\n    \"strict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noFallthroughCasesInSwitch\": true\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "frontend/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"skipLibCheck\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "frontend/vite.config.ts",
    "content": "import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n  server: {\n    watch: {\n      usePolling: true\n    },\n    proxy: {\n      \"^/(assistants|threads|ingest|runs)\": {\n        target: process.env.VITE_BACKEND_URL || \"http://127.0.0.1:8100\",\n        changeOrigin: true,\n        rewrite: (path) => path.replace(\"/____LANGSERVE_BASE_URL\", \"\"),\n      },\n    },\n  },\n});\n"
  },
  {
    "path": "tools/redis_to_postgres/Dockerfile",
    "content": "FROM langchain/open-gpts:latest\n\nRUN poetry add redis==5.0.1\n\nCOPY migrate_data.py .\n\n# Run database schema migrations and then migrate data\nENTRYPOINT sh -c \"make migrate && python migrate_data.py\""
  },
  {
    "path": "tools/redis_to_postgres/README.md",
    "content": "OpenGPTs previously used Redis for data persistence, but has since switched to Postgres. If you have data in Redis that you would like to migrate to Postgres, follow the instructions below.\n\nNavigate to the `tools/redis_to_postgres` directory and ensure that the environment variables in the docker-compose file are set correctly for your Redis and Postgres instances. Then, run the following command to perform the migration:\n\n```shell\ndocker compose up --build --abort-on-container-exit\n```\n\nThis will run database schema migrations for Postgres and then copy data from Redis to Postgres. Eventually all containers will be stopped.\n\nNote: if you were not using Redis locally and instead were using a remote Redis instance (for example on AWS), you can simply set the `REDIS_URL` environment variable to the remote instance's address, remove the `redis` service from the docker-compose file, and run the same command as above."
  },
  {
    "path": "tools/redis_to_postgres/docker-compose.yml",
    "content": "version: \"3\"\n\nservices:\n  redis:\n    image: redis/redis-stack-server:latest\n    ports:\n      - \"6380:6379\"\n    volumes:\n      - ./../../redis-volume:/data\n  data-migrator:\n    build:\n      context: .\n    depends_on:\n      - redis\n    network_mode: \"host\"\n    environment:\n      REDIS_URL: \"redis://localhost:6380\"\n      POSTGRES_HOST: \"localhost\"\n      POSTGRES_PORT: 5433\n      POSTGRES_DB: postgres\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      OPENAI_API_KEY: ...\n"
  },
  {
    "path": "tools/redis_to_postgres/migrate_data.py",
    "content": "import asyncio\nimport json\nimport logging\nimport os\nimport pickle\nimport struct\nimport uuid\nfrom collections import defaultdict\nfrom datetime import datetime\nfrom typing import Any, Iterator, Optional\n\nimport asyncpg\nimport orjson\nfrom langchain.utilities.redis import get_client\nfrom langchain_core.runnables import ConfigurableFieldSpec, RunnableConfig\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.checkpoint.base import (\n    Checkpoint,\n    empty_checkpoint,\n)\nfrom redis.client import Redis as RedisType\n\nfrom app.checkpoint import PostgresCheckpoint\nfrom app.lifespan import get_pg_pool, lifespan\nfrom app.server import app\nfrom pydantic import ConfigDict\n\n\nlogging.basicConfig(\n    level=logging.INFO, format=\"%(asctime)s - %(levelname)s - %(message)s\"\n)\nlogger = logging.getLogger(__name__)\n\nredis_client: RedisType = get_client(os.environ[\"REDIS_URL\"], socket_keepalive=True)\n\nthread_hash_keys = [\"assistant_id\", \"name\", \"updated_at\"]\nassistant_hash_keys = [\"name\", \"config\", \"updated_at\", \"public\"]\nembedding_hash_keys = [\"namespace\", \"source\", \"content_vector\", \"title\", \"content\"]\npublic_user_id = \"eef39817-c173-4eb6-8be4-f77cf37054fb\"\n\n\ndef keys(match: str) -> Iterator[str]:\n    cursor = 0\n    while True:\n        cursor, keys = redis_client.scan(cursor=cursor, match=match, count=100)\n        for key in keys:\n            yield key.decode(\"utf-8\")\n        if cursor == 0:\n            break\n\n\ndef load(keys: list[str], values: list[bytes]) -> dict:\n    return {k: orjson.loads(v) if v is not None else None for k, v in zip(keys, values)}\n\n\nclass RedisCheckpoint(BaseCheckpointSaver):\n    model_config = ConfigDict(arbitrary_types_allowed=True,)\n\n    @property\n    def config_specs(self) -> list[ConfigurableFieldSpec]:\n        return [\n            ConfigurableFieldSpec(\n                id=\"user_id\",\n                annotation=Optional[str],\n                name=\"User ID\",\n                description=None,\n                default=None,\n                is_shared=True,\n            ),\n            ConfigurableFieldSpec(\n                id=\"thread_id\",\n                annotation=Optional[str],\n                name=\"Thread ID\",\n                description=None,\n                default=None,\n                is_shared=True,\n            ),\n        ]\n\n    def _dump(self, mapping: dict[str, Any]) -> dict:\n        return {\n            k: pickle.dumps(v) if v is not None else None for k, v in mapping.items()\n        }\n\n    def _load(self, mapping: dict[bytes, bytes]) -> dict:\n        return {\n            k.decode(): pickle.loads(v) if v is not None else None\n            for k, v in mapping.items()\n        }\n\n    def _hash_key(self, config: RunnableConfig) -> str:\n        user_id = config[\"configurable\"][\"user_id\"]\n        thread_id = config[\"configurable\"][\"thread_id\"]\n        return f\"opengpts:{user_id}:thread:{thread_id}:checkpoint\"\n\n    def get(self, config: RunnableConfig) -> Checkpoint | None:\n        value = self._load(redis_client.hgetall(self._hash_key(config)))\n        if value.get(\"v\") == 1:\n            # langgraph version 1\n            return value\n        elif value.get(\"__pregel_version\") == 1:\n            # permchain version 1\n            value.pop(\"__pregel_version\")\n            value.pop(\"__pregel_ts\")\n            checkpoint = empty_checkpoint()\n            if value.get(\"messages\"):\n                checkpoint[\"channel_values\"] = {\"__root__\": value[\"messages\"][1]}\n            else:\n                checkpoint[\"channel_values\"] = {}\n            for key in checkpoint[\"channel_values\"]:\n                checkpoint[\"channel_versions\"][key] = 1\n            return checkpoint\n        else:\n            # unknown version\n            return None\n\n    def put(self, config: RunnableConfig, checkpoint: Checkpoint) -> None:\n        return redis_client.hmset(self._hash_key(config), self._dump(checkpoint))\n\n\nasync def migrate_assistants(conn: asyncpg.Connection) -> None:\n    logger.info(\"Migrating assistants.\")\n\n    for key in keys(\"opengpts:*:assistant:*\"):\n        parts = key.split(\":\")\n        user_id, assistant_id = parts[1], parts[3]\n        if user_id == public_user_id:\n            continue\n\n        values = redis_client.hmget(key, *assistant_hash_keys)\n        assistant = load(assistant_hash_keys, values) if any(values) else None\n        if assistant is not None:\n            await conn.execute(\n                (\n                    \"INSERT INTO assistant (assistant_id, user_id, name, config, updated_at, public) \"\n                    \"VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (assistant_id) DO UPDATE SET \"\n                    \"user_id = EXCLUDED.user_id, name = EXCLUDED.name, config = EXCLUDED.config, \"\n                    \"updated_at = EXCLUDED.updated_at, public = EXCLUDED.public;\"\n                ),\n                assistant_id,\n                user_id,\n                assistant[\"name\"],\n                assistant[\"config\"],\n                datetime.fromisoformat(assistant[\"updated_at\"]),\n                assistant[\"public\"],\n            )\n            logger.info(f\"Migrated assistant {assistant_id} for user {user_id}.\")\n\n\nasync def migrate_threads(conn: asyncpg.Connection) -> None:\n    logger.info(\"Migrating threads.\")\n\n    for key in keys(\"opengpts:*:thread:*\"):\n        if key.endswith(\":checkpoint\"):\n            continue\n\n        parts = key.split(\":\")\n        user_id, thread_id = parts[1], parts[3]\n\n        values = redis_client.hmget(key, *thread_hash_keys)\n        thread = load(thread_hash_keys, values) if any(values) else None\n        if thread is not None:\n            await conn.execute(\n                (\n                    \"INSERT INTO thread (thread_id, assistant_id, user_id, name, updated_at) \"\n                    \"VALUES ($1, $2, $3, $4, $5) ON CONFLICT (thread_id) DO UPDATE SET \"\n                    \"assistant_id = EXCLUDED.assistant_id, user_id = EXCLUDED.user_id, \"\n                    \"name = EXCLUDED.name, updated_at = EXCLUDED.updated_at;\"\n                ),\n                thread_id,\n                thread[\"assistant_id\"],\n                user_id,\n                thread[\"name\"],\n                datetime.fromisoformat(thread[\"updated_at\"]),\n            )\n            logger.info(f\"Migrated thread {thread_id} for user {user_id}.\")\n\n\nasync def migrate_checkpoints() -> None:\n    logger.info(\"Migrating checkpoints.\")\n\n    redis_checkpoint = RedisCheckpoint()\n    postgres_checkpoint = PostgresCheckpoint()\n\n    for key in keys(\"opengpts:*:thread:*:checkpoint\"):\n        parts = key.split(\":\")\n        user_id, thread_id = parts[1], parts[3]\n        config = {\"configurable\": {\"user_id\": user_id, \"thread_id\": thread_id}}\n        checkpoint = redis_checkpoint.get(config)\n        if checkpoint:\n            if checkpoint.get(\"channel_values\", {}).get(\"__root__\"):\n                checkpoint[\"channel_values\"][\"__root__\"] = [\n                    msg.__class__(**msg.__dict__)\n                    for msg in checkpoint[\"channel_values\"][\"__root__\"]\n                ]\n            await postgres_checkpoint.aput(config, checkpoint)\n            logger.info(\n                f\"Migrated checkpoint for thread {thread_id} for user {user_id}.\"\n            )\n\n\nasync def migrate_embeddings(conn: asyncpg.Connection) -> None:\n    logger.info(\"Migrating embeddings.\")\n\n    custom_ids = defaultdict(lambda: str(uuid.uuid4()))\n\n    def _get_custom_id(doc: dict) -> str:\n        \"\"\"custom_id is unique for each namespace.\"\"\"\n        return custom_ids[doc[\"namespace\"]]\n\n    def _redis_to_postgres_vector(binary_data: bytes) -> list[float]:\n        \"\"\"Deserialize binary data to a list of floats.\"\"\"\n        assert len(binary_data) == 4 * 1536, \"Invalid binary data length.\"\n        format_str = \"<\" + \"1536f\"\n        return list(struct.unpack(format_str, binary_data))\n\n    def _load_doc(values: list) -> Optional[str]:\n        doc = {}\n        for k, v in zip(embedding_hash_keys, values):\n            if k == \"content_vector\":\n                doc[k] = _redis_to_postgres_vector(v)\n            else:\n                doc[k] = v.decode() if v is not None else None\n        return doc\n\n    def _get_cmetadata(doc: dict) -> str:\n        return json.dumps(\n            {\n                \"source\": doc[\"source\"] if doc[\"source\"] else None,\n                \"namespace\": doc[\"namespace\"],\n                \"title\": doc[\"title\"],\n            }\n        )\n\n    def _get_document(doc: dict) -> str:\n        \"\"\"Sanitize the content by replacing null bytes.\"\"\"\n        return doc[\"content\"].replace(\"\\x00\", \"x\")\n\n    def _get_embedding(doc: dict) -> str:\n        return str(doc[\"content_vector\"])\n\n    default_collection = await conn.fetchrow(\n        \"SELECT uuid FROM langchain_pg_collection WHERE name = $1;\", \"langchain\"\n    )\n    assert (\n        default_collection is not None\n    ), \"Default collection not found in the database.\"\n\n    for key in keys(\"doc:*\"):\n        values = redis_client.hmget(key, *embedding_hash_keys)\n        doc = _load_doc(values)\n        await conn.execute(\n            (\n                \"INSERT INTO langchain_pg_embedding (document, collection_id, cmetadata, custom_id, embedding, uuid) \"\n                \"VALUES ($1, $2, $3, $4, $5, $6);\"\n            ),\n            _get_document(doc),\n            default_collection[\"uuid\"],\n            _get_cmetadata(doc),\n            _get_custom_id(doc),\n            _get_embedding(doc),\n            str(uuid.uuid4()),\n        )\n        logger.info(f\"Migrated embedding for namespace {doc['namespace']}.\")\n\n\nasync def migrate_data():\n    logger.info(\"Starting to migrate data from Redis to Postgres.\")\n    async with get_pg_pool().acquire() as conn, conn.transaction():\n        await migrate_assistants(conn)\n        await migrate_threads(conn)\n        await migrate_checkpoints()\n        await migrate_embeddings(conn)\n    logger.info(\"Data was migrated successfully.\")\n\n\nasync def main():\n    async with lifespan(app):\n        await migrate_data()\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n"
  }
]