Full Code of tsl0922/ttyd for AI

main 647d55ad865f cached
55 files
1.3 MB
1.0M tokens
151 symbols
1 requests
Download .txt
Showing preview only (1,364K chars total). Download the full file or copy to clipboard to get everything.
Repository: tsl0922/ttyd
Branch: main
Commit: 647d55ad865f
Files: 55
Total size: 1.3 MB

Directory structure:
gitextract_90qmtrh_/

├── .clang-format
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── support-request.md
│   └── workflows/
│       ├── backend.yml
│       ├── docker.yml
│       ├── frontend.yml
│       └── release.yml
├── .gitignore
├── CMakeLists.txt
├── Dockerfile
├── Dockerfile.alpine
├── LICENSE
├── README.md
├── app.rc.in
├── cmake/
│   └── GetGitVersion.cmake
├── html/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.json
│   ├── .gitignore
│   ├── .prettierrc.js
│   ├── .yarn/
│   │   └── patches/
│   │       └── zmodem.js-npm-0.1.10-e5537fa2ed.patch
│   ├── .yarnrc.yml
│   ├── README.md
│   ├── gulpfile.js
│   ├── package.json
│   ├── src/
│   │   ├── components/
│   │   │   ├── app.tsx
│   │   │   ├── modal/
│   │   │   │   ├── index.tsx
│   │   │   │   └── modal.scss
│   │   │   └── terminal/
│   │   │       ├── index.tsx
│   │   │       └── xterm/
│   │   │           ├── addons/
│   │   │           │   ├── overlay.ts
│   │   │           │   └── zmodem.ts
│   │   │           └── index.ts
│   │   ├── index.tsx
│   │   ├── style/
│   │   │   └── index.scss
│   │   └── template.html
│   ├── tsconfig.json
│   └── webpack.config.js
├── man/
│   ├── README.md
│   ├── ttyd.1
│   └── ttyd.man.md
├── scripts/
│   └── cross-build.sh
├── snap/
│   └── snapcraft.yaml
└── src/
    ├── compat.h
    ├── html.h
    ├── http.c
    ├── protocol.c
    ├── pty.c
    ├── pty.h
    ├── server.c
    ├── server.h
    ├── utils.c
    └── utils.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
BasedOnStyle: Google
Language: Cpp
ColumnLimit: 120
IndentWidth: 2
TabWidth: 2
UseTab: Never

================================================
FILE: .gitattributes
================================================
src/html.h linguist-generated


================================================
FILE: .github/FUNDING.yml
================================================
github: tsl0922
patreon: tsl0922


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environment:**
 - OS: [e.g. macOS 10.15.2]
 - Browser: [e.g. Chrome 79.0.3945.130]

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/support-request.md
================================================
---
name: Support Request
about: Support request or question
title: ''
labels: question
assignees: ''

---

Describe your problem or question here.


================================================
FILE: .github/workflows/backend.yml
================================================
name: backend

on:
  push:
    paths:
    - ".github/workflows/backend.yml"
    - "CMakeLists.txt"
    - "src/*"
    - "scripts/*"
  pull_request:
    paths:
    - ".github/workflows/backend.yml"
    - "CMakeLists.txt"
    - "src/*"
    - "scripts/*"
  workflow_call:

jobs:
  msvc:
    runs-on: windows-latest
    env:
      VCPKG_ROOT: ${{ github.workspace }}/vcpkg
      VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg.exe
      VCPKG_TRIPLET: x64-windows-static
      TOOLCHAIN_FILE: ${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake
    steps:
      - uses: actions/checkout@v6
      - name: Checkout vcpkg
        uses: actions/checkout@v6
        with:
          repository: microsoft/vcpkg
          path: vcpkg
      - name: Bootstrap vcpkg
        shell: pwsh
        run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.bat
      - name: Install dependencies
        shell: pwsh
        run: |
          $env:VCPKG_ROOT = "${{ env.VCPKG_ROOT }}"
          ${{ env.VCPKG_EXE }} install --triplet ${{ env.VCPKG_TRIPLET }} libwebsockets libuv json-c zlib openssl getopt-win32
      - name: Build with MSVC
        shell: pwsh
        run: |
          $env:VCPKG_ROOT = "${{ env.VCPKG_ROOT }}"
          cmake -S . -B build -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="${{ env.TOOLCHAIN_FILE }}" -DVCPKG_TARGET_TRIPLET=${{ env.VCPKG_TRIPLET }}
          cmake --build build --config Release
      - uses: actions/upload-artifact@v7
        with:
          name: ttyd.msvc
          path: build/Release/ttyd.exe
  cross:
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        target: [i686, x86_64, arm, armhf, aarch64, mips, mipsel, mips64, mips64el, ppc64, ppc64le, s390x, win32]
    steps:
      - uses: actions/checkout@v6
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y autoconf automake build-essential cmake curl file libtool
      - name: Cross build (${{ matrix.target }})
        env:
          BUILD_TARGET: ${{ matrix.target }}
        run: ./scripts/cross-build.sh
      - uses: actions/upload-artifact@v7
        with:
          name: ttyd.${{ matrix.target }}
          path: build/ttyd*



================================================
FILE: .github/workflows/docker.yml
================================================
name: docker

on:
  push:
    branches: main
    tags: ["*"]

jobs:
  build:
    runs-on: ubuntu-24.04
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v6
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y autoconf automake build-essential cmake curl file libtool
      - name: Cross build multi-arch binary
        run: |
          mkdir dist
          for arch in amd64 armv7 arm64 s390x; do
            env BUILD_TARGET=$arch ./scripts/cross-build.sh
            [ "$arch" = "armv7" ] && arch="arm" 
            mkdir -p dist/$arch && cp build/ttyd dist/$arch/ttyd
          done
      - uses: docker/setup-qemu-action@v4
      - uses: docker/setup-buildx-action@v4
      - uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKER_HUB_USER }}
          password: ${{ secrets.DOCKER_HUB_TOKEN }}
      - uses: docker/login-action@v4
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Determine docker tags
        id: docker_tag
        run: |
          case $GITHUB_REF in
            refs/tags/*)
              TAG_NAME=${GITHUB_REF#refs/tags/}
              echo "DOCKER_TAG=tsl0922/ttyd:${TAG_NAME}" >> $GITHUB_ENV
              echo "ALPINE_TAG=tsl0922/ttyd:${TAG_NAME}-alpine" >> $GITHUB_ENV
              ;;
            *)
              echo "DOCKER_TAG=tsl0922/ttyd:latest" >> $GITHUB_ENV
              echo "ALPINE_TAG=tsl0922/ttyd:alpine" >> $GITHUB_ENV
          esac
      - name: build/push docker image
        uses: docker/build-push-action@v7
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/s390x
          push: true
          tags: |
            ${{ env.DOCKER_TAG }}
            ghcr.io/${{ env.DOCKER_TAG }}
      - name: build/push docker image (alpine)
        uses: docker/build-push-action@v7
        with:
          context: .
          file: ./Dockerfile.alpine
          platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/s390x
          push: true
          tags: |
            ${{ env.ALPINE_TAG }}
            ghcr.io/${{ env.ALPINE_TAG }}


================================================
FILE: .github/workflows/frontend.yml
================================================
name: frontend

on:
  push:
    paths:
    - ".github/workflows/frontend.yml"
    - "html/*"
  pull_request:
    paths:
    - ".github/workflows/frontend.yml"
    - "html/*"

jobs:
  build:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
        with:
          node-version: 18
      - name: Run yarn install, check and build
        run: |
          corepack enable
          corepack prepare yarn@stable --activate
          yarn install
          yarn run check
          yarn run build
        working-directory: html


================================================
FILE: .github/workflows/release.yml
================================================
name: release

on:
  push:
    tags: ["*"]

jobs:
  build:
    uses: ./.github/workflows/backend.yml
  publish:
    needs: [build]
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - name: Check version bump
        run: |
          TAG=$(git describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8)
          VERSION=$(grep project CMakeLists.txt| awk '{print $3}')
          if [ "$TAG" != "$VERSION" ]; then
            echo "=== Version in CMakeLists.txt and git tag does not match!"
            echo "=== Git Tag: $TAG, Version: $VERSION"
            exit 1
          fi
      - uses: actions/download-artifact@v8
        
      - run: |
          mkdir build
          for file in ttyd.*/*; do
            target=$(echo $file | awk -F/ '{print $1}')
            [[ $file == *.exe ]] && target="$target.exe"
            mv $file build/$target
          done
          pushd build; sha256sum ttyd.* > SHA256SUMS; popd
      - uses: ncipollo/release-action@v1
        with:
          artifacts: build/*
          allowUpdates: true
          draft: true


================================================
FILE: .gitignore
================================================
# Prerequisites
*.d

# Object files
*.o
*.ko
*.obj
*.elf

# Precompiled Headers
*.gch
*.pch

# Libraries
*.lib
*.a
*.la
*.lo

# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib

# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex

# Debug files
*.dSYM/
*.su

# Cmake files
CMakeCache.txt
CMakeFiles
CMakeScripts
cmake_install.cmake
install_manifest.txt
CTestTestfile.cmake
build

# Clion files
.idea/

# VSCode files
.vscode/

# Project files
!init.d


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.12.0)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

project(ttyd VERSION 1.7.7 LANGUAGES C)

set(TTYD_VERSION "${PROJECT_VERSION}")

include(GetGitVersion)
get_git_version(GIT_VERSION SEM_VER)
get_git_head(GIT_COMMIT)
if("${SEM_VER}" VERSION_GREATER "${TTYD_VERSION}")
    set(TTYD_VERSION "${SEM_VER}")
endif()
if(NOT "${GIT_COMMIT}" STREQUAL "")
    set(TTYD_VERSION "${TTYD_VERSION}-${GIT_COMMIT}")
endif()

if(NOT MSVC)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE")
    if(CMAKE_VERSION VERSION_LESS "3.1")
        if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
        else()
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
        endif()
    else()
        set(CMAKE_C_STANDARD 99)
    endif()
else()
    # MSVC: suppress common warnings for C99 code
    add_compile_options(/W3 /wd4996 /wd4267 /wd4244)
    add_compile_definitions(_CRT_SECURE_NO_WARNINGS _GNU_SOURCE)
endif()

set(SOURCE_FILES src/utils.c src/pty.c src/protocol.c src/http.c src/server.c)

include(FindPackageHandleStandardArgs)

find_path(LIBUV_INCLUDE_DIR NAMES uv.h)
find_library(LIBUV_LIBRARY NAMES uv libuv)
find_package_handle_standard_args(LIBUV REQUIRED_VARS LIBUV_LIBRARY LIBUV_INCLUDE_DIR)
mark_as_advanced(LIBUV_INCLUDE_DIR LIBUV_LIBRARY)
if(LIBUV_FOUND)
    SET(LIBUV_INCLUDE_DIRS "${LIBUV_INCLUDE_DIR}")
    SET(LIBUV_LIBRARIES "${LIBUV_LIBRARY}")
endif()

find_path(JSON-C_INCLUDE_DIR NAMES json.h PATH_SUFFIXES json-c)
find_library(JSON-C_LIBRARY NAMES json-c)
find_package_handle_standard_args(JSON-C REQUIRED_VARS JSON-C_LIBRARY JSON-C_INCLUDE_DIR)
mark_as_advanced(JSON-C_INCLUDE_DIR JSON-C_LIBRARY)
if(JSON-C_FOUND)
    SET(JSON-C_INCLUDE_DIRS "${JSON-C_INCLUDE_DIR}")
    SET(JSON-C_LIBRARIES "${JSON-C_LIBRARY}")
endif()

find_package(ZLIB REQUIRED)
find_package(Libwebsockets 3.2.0 REQUIRED)

set(INCLUDE_DIRS ${ZLIB_INCLUDE_DIR} ${LIBWEBSOCKETS_INCLUDE_DIRS} ${JSON-C_INCLUDE_DIRS} ${LIBUV_INCLUDE_DIRS})
if(MSVC)
    # vcpkg's LIBWEBSOCKETS_LIBRARIES lists both 'websockets' and 'websockets_shared'
    # but only one target exists per triplet, so resolve the correct one.
    if(TARGET websockets_shared)
        set(LINK_LIBS ${ZLIB_LIBRARIES} websockets_shared ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
    elseif(TARGET websockets)
        set(LINK_LIBS ${ZLIB_LIBRARIES} websockets ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
    endif()
else()
    set(LINK_LIBS ${ZLIB_LIBRARIES} ${LIBWEBSOCKETS_LIBRARIES} ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
endif()

set (CMAKE_REQUIRED_INCLUDES ${INCLUDE_DIRS})
include(CheckSymbolExists)
check_symbol_exists(LWS_WITH_LIBUV "lws_config.h" LWS_WITH_LIBUV)
check_symbol_exists(LWS_OPENSSL_SUPPORT "lws_config.h" LWS_OPENSSL_ENABLED)
check_symbol_exists(LWS_WITH_MBEDTLS "lws_config.h" LWS_MBEDTLS_ENABLED)
if(NOT LWS_WITH_LIBUV)
    message(FATAL_ERROR "libwebsockets was not build with libuv support (-DLWS_WITH_LIBUV=ON)")
endif()
if(LWS_OPENSSL_ENABLED AND NOT LWS_MBEDTLS_ENABLED)
    find_package(OpenSSL REQUIRED)
    list(APPEND INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
    list(APPEND LINK_LIBS ${OPENSSL_LIBRARIES})
endif()

if(WIN32)
    # libuv static requires dbghelp for MiniDumpWriteDump/Sym* APIs
    list(APPEND LINK_LIBS shell32 ws2_32 dbghelp)
    if(MSVC)
        find_package(getopt CONFIG)
        if(getopt_FOUND)
            if(TARGET getopt::getopt_shared)
                list(APPEND LINK_LIBS getopt::getopt_shared)
            elseif(TARGET getopt::getopt_static)
                list(APPEND LINK_LIBS getopt::getopt_static)
            endif()
        endif()
    endif()
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/app.rc.in ${CMAKE_CURRENT_BINARY_DIR}/app.rc @ONLY)
    list(APPEND SOURCE_FILES ${CMAKE_CURRENT_BINARY_DIR}/app.rc)
else()
    find_library(LIBUTIL NAMES util)
    if(LIBUTIL)
        list(APPEND LINK_LIBS util)
    endif()
endif()

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${LINK_LIBS})
target_compile_definitions(${PROJECT_NAME} PUBLIC
    TTYD_VERSION="${TTYD_VERSION}"
    $<$<PLATFORM_ID:Windows>:_WIN32_WINNT=0xa00 WINVER=0xa00>
)

include(GNUInstallDirs)

install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT prog)
install(FILES man/ttyd.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" COMPONENT doc)


================================================
FILE: Dockerfile
================================================
FROM ubuntu:24.04

ARG TARGETARCH

# Dependencies
RUN apt-get update && apt-get install -y --no-install-recommends tini && rm -rf /var/lib/apt/lists/*

# Application
COPY ./dist/${TARGETARCH}/ttyd /usr/bin/ttyd

EXPOSE 7681
WORKDIR /root

ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["ttyd", "-W", "bash"]


================================================
FILE: Dockerfile.alpine
================================================
FROM alpine

ARG TARGETARCH

# Dependencies
RUN apk add --no-cache bash tini

# Application
COPY ./dist/${TARGETARCH}/ttyd /usr/bin/ttyd

EXPOSE 7681
WORKDIR /root

ENTRYPOINT ["/sbin/tini", "--"]
CMD ["ttyd", "-W", "bash"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2016-2026 Shuanglei Tao <tsl0922@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: README.md
================================================
![backend](https://github.com/tsl0922/ttyd/workflows/backend/badge.svg)
![frontend](https://github.com/tsl0922/ttyd/workflows/frontend/badge.svg)
[![GitHub Releases](https://img.shields.io/github/downloads/tsl0922/ttyd/total)](https://github.com/tsl0922/ttyd/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/tsl0922/ttyd)](https://hub.docker.com/r/tsl0922/ttyd)
[![Packaging status](https://repology.org/badge/tiny-repos/ttyd.svg)](https://repology.org/project/ttyd/versions)
![GitHub](https://img.shields.io/github/license/tsl0922/ttyd)

# ttyd - Share your terminal over the web

ttyd is a simple command-line tool for sharing terminal over the web.

![screenshot](https://github.com/tsl0922/ttyd/raw/main/screenshot.gif)

# Features

- Built on top of [libuv](https://libuv.org) and [WebGL2](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) for speed
- Fully-featured terminal with [CJK](https://en.wikipedia.org/wiki/CJK_characters) and IME support
- [ZMODEM](https://en.wikipedia.org/wiki/ZMODEM) ([lrzsz](https://ohse.de/uwe/software/lrzsz.html)) / [trzsz](https://trzsz.github.io) file transfer support
- [Sixel](https://en.wikipedia.org/wiki/Sixel) image output support ([img2sixel](https://saitoha.github.io/libsixel) / [lsix](https://github.com/hackerb9/lsix))
- SSL support based on [OpenSSL](https://www.openssl.org) / [Mbed TLS](https://github.com/Mbed-TLS/mbedtls)
- Run any custom command with options
- Basic authentication support and many other custom options
- Cross platform: macOS, Linux, FreeBSD/OpenBSD, [OpenWrt](https://openwrt.org), Windows

# Installation

## Install on macOS

- Install with [Homebrew](http://brew.sh): `brew install ttyd`
- Install with [MacPorts](https://www.macports.org): `sudo port install ttyd`

## Install on Linux

- Install on Debian/Ubuntu: `sudo apt install ttyd`
- Install the snap: `sudo snap install ttyd --classic`
- Install on OpenWrt: `opkg install ttyd`
- Install on Gentoo: clone the [repo](https://bitbucket.org/mgpagano/ttyd/src/master) and follow the directions [here](https://wiki.gentoo.org/wiki/Custom_repository#Creating_a_local_repository).
- Install with [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) : `brew install ttyd`
- Precompiled static binaries: download from the [releases](https://github.com/tsl0922/ttyd/releases) page

## Install on Windows

- Binary version (recommended): download from the [releases](https://github.com/tsl0922/ttyd/releases) page
- Install with [WinGet](https://github.com/microsoft/winget-cli): `winget install tsl0922.ttyd`
- Install with [Scoop](https://scoop.sh/#/apps?q=ttyd&s=2&d=1&o=true): `scoop install ttyd`
- [Compile on Windows](https://github.com/tsl0922/ttyd/wiki/Compile-on-Windows)

# Usage

## Command-line Options

```
USAGE:
    ttyd [options] <command> [<arguments...>]

OPTIONS:
    -p, --port              Port to listen (default: 7681, use `0` for random port)
    -i, --interface         Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
    -U, --socket-owner      User owner of the UNIX domain socket file, when enabled (eg: user:group)
    -c, --credential        Credential for basic authentication (format: username:password)
    -H, --auth-header       HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication
    -u, --uid               User id to run with
    -g, --gid               Group id to run with
    -s, --signal            Signal to send to the command when exit it (default: 1, SIGHUP)
    -w, --cwd               Working directory to be set for the child program
    -a, --url-arg           Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
    -W, --writable          Allow clients to write to the TTY (readonly by default)
    -t, --client-option     Send option to client (format: key=value), repeat to add more options
    -T, --terminal-type     Terminal type to report, default: xterm-256color
    -O, --check-origin      Do not allow websocket connection from different origin
    -m, --max-clients       Maximum clients to support (default: 0, no limit)
    -o, --once              Accept only one client and exit on disconnection
    -q, --exit-no-conn      Exit on all clients disconnection
    -B, --browser           Open terminal with the default system browser
    -I, --index             Custom index.html path
    -b, --base-path         Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)
    -P, --ping-interval     Websocket ping interval(sec) (default: 5)
    -6, --ipv6              Enable IPv6 support
    -S, --ssl               Enable SSL
    -C, --ssl-cert          SSL certificate file path
    -K, --ssl-key           SSL key file path
    -A, --ssl-ca            SSL CA file path for client certificate verification
    -d, --debug             Set log level (default: 7)
    -v, --version           Print the version and exit
    -h, --help              Print this text and exit
```

Read the example usage on the [wiki](https://github.com/tsl0922/ttyd/wiki/Example-Usage).

## Browser Support

Modern browsers, See [Browser Support](https://github.com/xtermjs/xterm.js#browser-support).

## Alternatives

* [Wetty](https://github.com/krishnasrinivas/wetty): [Node](https://nodejs.org) based web terminal (SSH/login)
* [GoTTY](https://github.com/yudai/gotty): [Go](https://golang.org) based web terminal


================================================
FILE: app.rc.in
================================================
#include <winver.h>

#define VERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
#define VERSION_STR "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.0\0"

VS_VERSION_INFO VERSIONINFO
 FILEVERSION VERSION
 PRODUCTVERSION VERSION
 FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK
 FILEFLAGS      0
 FILEOS         VOS__WINDOWS32
 FILETYPE       VFT_DLL
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription", "ttyd\0"
            VALUE "ProductName", "ttyd\0"
            VALUE "ProductVersion", VERSION_STR
            VALUE "FileVersion", VERSION_STR
            VALUE "InternalName", "ttyd\0"
            VALUE "OriginalFilename", "ttyd.exe\0"
            VALUE "LegalCopyright", "Copyright (C) 2016-2026 Shuanglei Tao\0"
        VALUE "Comment", "\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END


================================================
FILE: cmake/GetGitVersion.cmake
================================================
find_package(Git)

function(get_git_version var1 var2)
  if(GIT_EXECUTABLE)
    execute_process(
      COMMAND ${GIT_EXECUTABLE} describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8
      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
      RESULT_VARIABLE status
      OUTPUT_VARIABLE GIT_VERSION
    )
    if (${status})
      set(GIT_VERSION "0.0.0")
    else()
      string(STRIP ${GIT_VERSION} GIT_VERSION)
      string(REGEX REPLACE "-[0-9]+-g" "-" GIT_VERSION ${GIT_VERSION})
    endif()
  else()
    set(GIT_VERSION "0.0.0")
  endif()

  string(REGEX MATCH "^[0-9]+.[0-9]+.[0-9]+" SEM_VER "${GIT_VERSION}")

  message("-- Git Tag: ${GIT_VERSION}, Sem Ver: ${SEM_VER}")

  set(${var1} ${GIT_VERSION} PARENT_SCOPE)
  set(${var2} ${SEM_VER} PARENT_SCOPE)
endfunction()

function(get_git_head var1)
  if(GIT_EXECUTABLE)
    execute_process(
      COMMAND ${GIT_EXECUTABLE} --git-dir ${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse --short HEAD
      RESULT_VARIABLE status
      OUTPUT_VARIABLE GIT_COMMIT
      OUTPUT_STRIP_TRAILING_WHITESPACE
      ERROR_QUIET
    )

    if(${status})
      set(GIT_COMMIT "unknown")
    endif()

    message("-- Git Commit: ${GIT_COMMIT}")

    set(${var1} ${GIT_COMMIT} PARENT_SCOPE)
  endif()
endfunction()


================================================
FILE: html/.editorconfig
================================================
root = true

[*]
charset = utf-8
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[{*.json, *.scss}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false


================================================
FILE: html/.eslintignore
================================================
dist/


================================================
FILE: html/.eslintrc.json
================================================
{
  "extends": "./node_modules/gts/",
  "overrides": [
    {
      "files": ["**/*.ts", "**/*.tsx"],
      "parserOptions": {
        "jsxPragma": "h"
      },
      "rules": {
        "@typescript-eslint/no-duplicate-enum-values": "off"
      }
    },
    {
      "files": ["gulpfile.js", "webpack.config.js"],
      "rules": {
        "node/no-unpublished-require": "off"
      }
    }
  ]
}


================================================
FILE: html/.gitignore
================================================
node_modules
dist
*.log

.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

================================================
FILE: html/.prettierrc.js
================================================
module.exports = {
  ...require('gts/.prettierrc.json'),
  "bracketSpacing": true,
  "tabWidth": 4,
  "printWidth": 120,
}


================================================
FILE: html/.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch
================================================
diff --git a/src/zsession.js b/src/zsession.js
index 5f0b8f9d8afa6fba0acd6dd0477afa186f7aad9a..c7ea98e0f08c97d63d321f784a5dd8bf66888743 100644
--- a/src/zsession.js
+++ b/src/zsession.js
@@ -548,20 +548,17 @@ Zmodem.Session.Receive = class ZmodemReceiveSession extends Zmodem.Session {
         if (this._got_ZFIN) {
             if (this._input_buffer.length < 2) return;
 
-            //if it’s OO, then set this._bytes_after_OO
-            if (Zmodem.ZMLIB.find_subarray(this._input_buffer, OVER_AND_OUT) === 0) {
+            if (Zmodem.ZMLIB.find_subarray(this._input_buffer, OVER_AND_OUT) !== 0) {
+                console.warn( "PROTOCOL: Only thing after ZFIN should be “OO” (79,79), not: " + this._input_buffer.join() );
+            }
 
-                //This doubles as an indication that the session has ended.
-                //We need to set this right away so that handlers like
-                //"session_end" will have access to it.
-                this._bytes_after_OO = _trim_OO(this._bytes_being_consumed.slice(0));
-                this._on_session_end();
+            //This doubles as an indication that the session has ended.
+            //We need to set this right away so that handlers like
+            //"session_end" will have access to it.
+            this._bytes_after_OO = _trim_OO(this._bytes_being_consumed.slice(0));
+            this._on_session_end();
 
-                return;
-            }
-            else {
-                throw( "PROTOCOL: Only thing after ZFIN should be “OO” (79,79), not: " + this._input_buffer.join() );
-            }
+            return;
         }
 
         var parsed;


================================================
FILE: html/.yarnrc.yml
================================================
nodeLinker: node-modules


================================================
FILE: html/README.md
================================================
## Prerequisites

> **NOTE:** yarn v2 is required.

Install [Yarn](https://yarnpkg.com/getting-started/install), and run: `yarn install`.

## Development

1. Start ttyd: `ttyd bash`
2. Start the dev server: `yarn run start`

## Publish

Run `yarn run build`, this will compile the inlined html to `../src/html.h`.


================================================
FILE: html/gulpfile.js
================================================
const { src, dest, task, series } = require('gulp');
const clean = require('gulp-clean');
const gzip = require('gulp-gzip');
const inlineSource = require('gulp-inline-source');
const rename = require('gulp-rename');
const through2 = require('through2');

const genHeader = (size, buf, len) => {
    let idx = 0;
    let data = 'unsigned char index_html[] = {\n  ';

    for (const value of buf) {
        idx++;

        const current = value < 0 ? value + 256 : value;

        data += '0x';
        data += (current >>> 4).toString(16);
        data += (current & 0xf).toString(16);

        if (idx === len) {
            data += '\n';
        } else {
            data += idx % 12 === 0 ? ',\n  ' : ', ';
        }
    }

    data += '};\n';
    data += `unsigned int index_html_len = ${len};\n`;
    data += `unsigned int index_html_size = ${size};\n`;
    return data;
};
let fileSize = 0;

task('clean', () => {
    return src('dist', { read: false, allowEmpty: true }).pipe(clean());
});

task('inline', () => {
    const options = {
        compress: false,
    };

    return src('dist/index.html').pipe(inlineSource(options)).pipe(rename('inline.html')).pipe(dest('dist/'));
});

task(
    'default',
    series('inline', () => {
        return src('dist/inline.html')
            .pipe(
                through2.obj((file, enc, cb) => {
                    fileSize = file.contents.length;
                    return cb(null, file);
                })
            )
            .pipe(gzip())
            .pipe(
                through2.obj((file, enc, cb) => {
                    const buf = file.contents;
                    file.contents = Buffer.from(genHeader(fileSize, buf, buf.length));
                    return cb(null, file);
                })
            )
            .pipe(rename('html.h'))
            .pipe(dest('../src/'));
    })
);


================================================
FILE: html/package.json
================================================
{
  "private": true,
  "name": "ttyd",
  "version": "1.0.0",
  "description": "Share your terminal over the web",
  "repository": {
    "url": "git@github.com:tsl0922/ttyd.git",
    "type": "git"
  },
  "author": "Shuanglei Tao <tsl0922@gmail.com>",
  "license": "MIT",
  "scripts": {
    "prestart": "gulp clean",
    "start": "NODE_ENV=development && webpack serve",
    "build": "NODE_ENV=production webpack && gulp",
    "inline": "NODE_ENV=production webpack && gulp inline",
    "check": "gts check",
    "fix": "gts fix"
  },
  "engines": {
    "node": ">=12"
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^7.1.1",
    "copy-webpack-plugin": "^12.0.2",
    "css-loader": "^6.10.0",
    "css-minimizer-webpack-plugin": "^6.0.0",
    "eslint": "^8.57.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-prettier": "^5.1.3",
    "eslint-webpack-plugin": "^4.0.1",
    "gts": "^5.2.0",
    "gulp": "^4.0.2",
    "gulp-clean": "^0.4.0",
    "gulp-gzip": "^1.4.2",
    "gulp-inline-source": "^4.0.0",
    "gulp-rename": "^2.0.0",
    "html-webpack-plugin": "^5.6.0",
    "mini-css-extract-plugin": "^2.8.1",
    "sass": "^1.71.1",
    "sass-loader": "^14.1.1",
    "scssfmt": "^1.0.7",
    "style-loader": "^3.3.4",
    "terser-webpack-plugin": "^5.3.10",
    "through2": "^4.0.2",
    "ts-loader": "^9.5.1",
    "typescript": "^5.3.3",
    "util": "^0.12.5",
    "webpack": "^5.90.3",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.0.2",
    "webpack-merge": "^5.10.0"
  },
  "dependencies": {
    "@xterm/addon-canvas": "^0.7.0",
    "@xterm/addon-clipboard": "^0.1.0",
    "@xterm/addon-fit": "^0.10.0",
    "@xterm/addon-image": "^0.8.0",
    "@xterm/addon-unicode11": "^0.8.0",
    "@xterm/addon-web-links": "^0.11.0",
    "@xterm/addon-webgl": "^0.18.0",
    "@xterm/xterm": "^5.5.0",
    "decko": "^1.2.0",
    "file-saver": "^2.0.5",
    "preact": "^10.19.6",
    "trzsz": "^1.1.5",
    "whatwg-fetch": "^3.6.20",
    "zmodem.js": "^0.1.10"
  },
  "resolutions": {
    "zmodem.js@^0.1.10": "patch:zmodem.js@npm%3A0.1.10#./.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch"
  },
  "packageManager": "yarn@3.6.3"
}


================================================
FILE: html/src/components/app.tsx
================================================
import { h, Component } from 'preact';

import { Terminal } from './terminal';

import type { ITerminalOptions, ITheme } from '@xterm/xterm';
import type { ClientOptions, FlowControl } from './terminal/xterm';

const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const path = window.location.pathname.replace(/[/]+$/, '');
const wsUrl = [protocol, '//', window.location.host, path, '/ws', window.location.search].join('');
const tokenUrl = [window.location.protocol, '//', window.location.host, path, '/token'].join('');
const clientOptions = {
    rendererType: 'webgl',
    disableLeaveAlert: false,
    disableResizeOverlay: false,
    enableZmodem: false,
    enableTrzsz: false,
    enableSixel: false,
    closeOnDisconnect: false,
    isWindows: false,
    unicodeVersion: '11',
} as ClientOptions;
const termOptions = {
    fontSize: 13,
    fontFamily: 'Consolas,Liberation Mono,Menlo,Courier,monospace',
    theme: {
        foreground: '#d2d2d2',
        background: '#2b2b2b',
        cursor: '#adadad',
        black: '#000000',
        red: '#d81e00',
        green: '#5ea702',
        yellow: '#cfae00',
        blue: '#427ab3',
        magenta: '#89658e',
        cyan: '#00a7aa',
        white: '#dbded8',
        brightBlack: '#686a66',
        brightRed: '#f54235',
        brightGreen: '#99e343',
        brightYellow: '#fdeb61',
        brightBlue: '#84b0d8',
        brightMagenta: '#bc94b7',
        brightCyan: '#37e6e8',
        brightWhite: '#f1f1f0',
    } as ITheme,
    allowProposedApi: true,
} as ITerminalOptions;
const flowControl = {
    limit: 100000,
    highWater: 10,
    lowWater: 4,
} as FlowControl;

export class App extends Component {
    render() {
        return (
            <Terminal
                id="terminal-container"
                wsUrl={wsUrl}
                tokenUrl={tokenUrl}
                clientOptions={clientOptions}
                termOptions={termOptions}
                flowControl={flowControl}
            />
        );
    }
}


================================================
FILE: html/src/components/modal/index.tsx
================================================
import { h, Component, ComponentChildren } from 'preact';

import './modal.scss';

interface Props {
    show: boolean;
    children: ComponentChildren;
}

export class Modal extends Component<Props> {
    constructor(props: Props) {
        super(props);
    }

    render({ show, children }: Props) {
        return (
            show && (
                <div className="modal">
                    <div className="modal-background" />
                    <div className="modal-content">
                        <div className="box">{children}</div>
                    </div>
                </div>
            )
        );
    }
}


================================================
FILE: html/src/components/modal/modal.scss
================================================
.modal {
  bottom: 0;
  left: 0;
  right: 0;
  top: 0;
  align-items: center;
  display: flex;
  overflow: hidden;
  position: fixed;
  z-index: 40;
}

.modal-background {
  bottom: 0;
  left: 0;
  position: absolute;
  right: 0;
  top: 0;
  background-color: #4a4a4acc;
}

.modal-content {
  margin: 0 20px;
  max-height: calc(100vh - 160px);
  overflow: auto;
  position: relative;
  width: 100%;

  .box {
    background-color: #fff;
    color: #4a4a4a;
    display: block;
    padding: 1.25rem;
  }

  header {
    font-weight: bold;
    text-align: center;
    padding-bottom: 10px;
    margin-bottom: 10px;
    border-bottom: 1px solid #ddd;
  }

  .file-input {
    height: .01em;
    left: 0;
    outline: none;
    position: absolute;
    top: 0;
    width: .01em;
  }

  .file-cta {
    cursor: pointer;
    background-color: #f5f5f5;
    color: #6200ee;
    outline: none;
    align-items: center;
    box-shadow: none;
    display: inline-flex;
    height: 2.25em;
    justify-content: flex-start;
    line-height: 1.5;
    position: relative;
    vertical-align: top;
    border-color: #dbdbdb;
    border-radius: 3px;
    font-size: 1em;
    font-weight: 500;
    padding: calc(.375em - 1px) 1em;
    white-space: nowrap;
  }
}

@media print, screen and (min-width: 769px) {
  .modal-content {
    margin: 0 auto;
    max-height: calc(100vh - 40px);
    width: 640px;
  }
}


================================================
FILE: html/src/components/terminal/index.tsx
================================================
import { bind } from 'decko';
import { Component, h } from 'preact';
import { Xterm, XtermOptions } from './xterm';

import '@xterm/xterm/css/xterm.css';
import { Modal } from '../modal';

interface Props extends XtermOptions {
    id: string;
}

interface State {
    modal: boolean;
}

export class Terminal extends Component<Props, State> {
    private container: HTMLElement;
    private xterm: Xterm;

    constructor(props: Props) {
        super();
        this.xterm = new Xterm(props, this.showModal);
    }

    async componentDidMount() {
        await this.xterm.refreshToken();
        this.xterm.open(this.container);
        this.xterm.connect();
    }

    componentWillUnmount() {
        this.xterm.dispose();
    }

    render({ id }: Props, { modal }: State) {
        return (
            <div id={id} ref={c => (this.container = c as HTMLElement)}>
                <Modal show={modal}>
                    <label class="file-label">
                        <input onChange={this.sendFile} class="file-input" type="file" multiple />
                        <span class="file-cta">Choose files…</span>
                    </label>
                </Modal>
            </div>
        );
    }

    @bind
    showModal() {
        this.setState({ modal: true });
    }

    @bind
    sendFile(event: Event) {
        this.setState({ modal: false });
        const files = (event.target as HTMLInputElement).files;
        if (files) this.xterm.sendFile(files);
    }
}


================================================
FILE: html/src/components/terminal/xterm/addons/overlay.ts
================================================
// ported from hterm.Terminal.prototype.showOverlay
// https://chromium.googlesource.com/apps/libapps/+/master/hterm/js/hterm_terminal.js
import { bind } from 'decko';
import { ITerminalAddon, Terminal } from '@xterm/xterm';

export class OverlayAddon implements ITerminalAddon {
    private terminal: Terminal;
    private overlayNode: HTMLElement;
    private overlayTimeout?: number;

    constructor() {
        this.overlayNode = document.createElement('div');
        this.overlayNode.style.cssText = `border-radius: 15px;
font-size: xx-large;
opacity: 0.75;
padding: 0.2em 0.5em 0.2em 0.5em;
position: absolute;
-webkit-user-select: none;
-webkit-transition: opacity 180ms ease-in;
-moz-user-select: none;
-moz-transition: opacity 180ms ease-in;`;

        this.overlayNode.addEventListener(
            'mousedown',
            e => {
                e.preventDefault();
                e.stopPropagation();
            },
            true
        );
    }

    activate(terminal: Terminal): void {
        this.terminal = terminal;
    }

    dispose(): void {}

    @bind
    showOverlay(msg: string, timeout?: number): void {
        const { terminal, overlayNode } = this;
        if (!terminal.element) return;

        overlayNode.style.color = '#101010';
        overlayNode.style.backgroundColor = '#f0f0f0';
        overlayNode.textContent = msg;
        overlayNode.style.opacity = '0.75';

        if (!overlayNode.parentNode) {
            terminal.element.appendChild(overlayNode);
        }

        const divSize = terminal.element.getBoundingClientRect();
        const overlaySize = overlayNode.getBoundingClientRect();

        overlayNode.style.top = (divSize.height - overlaySize.height) / 2 + 'px';
        overlayNode.style.left = (divSize.width - overlaySize.width) / 2 + 'px';

        if (this.overlayTimeout) clearTimeout(this.overlayTimeout);
        if (!timeout) return;

        this.overlayTimeout = window.setTimeout(() => {
            overlayNode.style.opacity = '0';
            this.overlayTimeout = window.setTimeout(() => {
                if (overlayNode.parentNode) {
                    overlayNode.parentNode.removeChild(overlayNode);
                }
                this.overlayTimeout = undefined;
                overlayNode.style.opacity = '0.75';
            }, 200);
        }, timeout || 1500);
    }
}


================================================
FILE: html/src/components/terminal/xterm/addons/zmodem.ts
================================================
import { bind } from 'decko';
import { saveAs } from 'file-saver';
import { IDisposable, ITerminalAddon, Terminal } from '@xterm/xterm';
import * as Zmodem from 'zmodem.js/src/zmodem_browser';
import { TrzszFilter } from 'trzsz';

export interface ZmodeOptions {
    zmodem: boolean;
    trzsz: boolean;
    windows: boolean;
    trzszDragInitTimeout: number;
    onSend: () => void;
    sender: (data: string | Uint8Array) => void;
    writer: (data: string | Uint8Array) => void;
}

export class ZmodemAddon implements ITerminalAddon {
    private disposables: IDisposable[] = [];
    private terminal: Terminal;
    private sentry: Zmodem.Sentry;
    private session: Zmodem.Session;
    private denier: () => void;
    private trzszFilter: TrzszFilter;

    constructor(private options: ZmodeOptions) {}

    activate(terminal: Terminal) {
        this.terminal = terminal;
        if (this.options.zmodem) this.zmodemInit();
        if (this.options.trzsz) this.trzszInit();
    }

    dispose() {
        for (const d of this.disposables) {
            d.dispose();
        }
        this.disposables.length = 0;
    }

    consume(data: ArrayBuffer) {
        try {
            if (this.options.trzsz) {
                this.trzszFilter.processServerOutput(data);
            } else {
                this.sentry.consume(data);
            }
        } catch (e) {
            console.error('[ttyd] zmodem consume: ', e);
            this.reset();
        }
    }

    @bind
    private reset() {
        this.terminal.options.disableStdin = false;
        this.terminal.focus();
    }

    private addDisposableListener(target: EventTarget, type: string, listener: EventListener) {
        target.addEventListener(type, listener);
        this.disposables.push({ dispose: () => target.removeEventListener(type, listener) });
    }

    @bind
    private trzszInit() {
        const { terminal } = this;
        const { sender, writer, zmodem } = this.options;
        this.trzszFilter = new TrzszFilter({
            writeToTerminal: data => {
                if (!this.trzszFilter.isTransferringFiles() && zmodem) {
                    this.sentry.consume(data);
                } else {
                    writer(typeof data === 'string' ? data : new Uint8Array(data as ArrayBuffer));
                }
            },
            sendToServer: data => sender(data),
            terminalColumns: terminal.cols,
            isWindowsShell: this.options.windows,
            dragInitTimeout: this.options.trzszDragInitTimeout,
        });
        const element = terminal.element as EventTarget;
        this.addDisposableListener(element, 'dragover', event => event.preventDefault());
        this.addDisposableListener(element, 'drop', event => {
            event.preventDefault();
            this.trzszFilter
                .uploadFiles((event as DragEvent).dataTransfer?.items as DataTransferItemList)
                .then(() => console.log('[ttyd] upload success'))
                .catch(err => console.log('[ttyd] upload failed: ' + err));
        });
        this.disposables.push(terminal.onResize(size => this.trzszFilter.setTerminalColumns(size.cols)));
    }

    @bind
    private zmodemInit() {
        const { sender, writer } = this.options;
        const { terminal, reset, zmodemDetect } = this;
        this.session = null;
        this.sentry = new Zmodem.Sentry({
            to_terminal: octets => writer(new Uint8Array(octets)),
            sender: octets => sender(new Uint8Array(octets)),
            on_retract: () => reset(),
            on_detect: detection => zmodemDetect(detection),
        });
        this.disposables.push(
            terminal.onKey(e => {
                const event = e.domEvent;
                if (event.ctrlKey && event.key === 'c') {
                    if (this.denier) this.denier();
                }
            })
        );
    }

    @bind
    private zmodemDetect(detection: Zmodem.Detection): void {
        const { terminal, receiveFile } = this;
        terminal.options.disableStdin = true;

        this.denier = () => detection.deny();
        this.session = detection.confirm();
        this.session.on('session_end', () => this.reset());

        if (this.session.type === 'send') {
            this.options.onSend();
        } else {
            receiveFile();
        }
    }

    @bind
    public sendFile(files: FileList) {
        const { session, writeProgress } = this;
        Zmodem.Browser.send_files(session, files, {
            on_progress: (_, offer) => writeProgress(offer),
        })
            .then(() => session.close())
            .catch(() => this.reset());
    }

    @bind
    private receiveFile() {
        const { session, writeProgress } = this;

        session.on('offer', offer => {
            offer.on('input', () => writeProgress(offer));
            offer
                .accept()
                .then(payloads => {
                    const blob = new Blob(payloads, { type: 'application/octet-stream' });
                    saveAs(blob, offer.get_details().name);
                })
                .catch(() => this.reset());
        });

        session.start();
    }

    @bind
    private writeProgress(offer: Zmodem.Offer) {
        const { bytesHuman } = this;
        const file = offer.get_details();
        const name = file.name;
        const size = file.size;
        const offset = offer.get_offset();
        const percent = ((100 * offset) / size).toFixed(2);

        this.options.writer(`${name} ${percent}% ${bytesHuman(offset, 2)}/${bytesHuman(size, 2)}\r`);
    }

    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    private bytesHuman(bytes: any, precision: number): string {
        if (!/^([-+])?|(\.\d+)(\d+(\.\d+)?|(\d+\.)|Infinity)$/.test(bytes)) {
            return '-';
        }
        if (bytes === 0) return '0';
        if (typeof precision === 'undefined') precision = 1;
        const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
        const num = Math.floor(Math.log(bytes) / Math.log(1024));
        const value = (bytes / Math.pow(1024, Math.floor(num))).toFixed(precision);
        return `${value} ${units[num]}`;
    }
}


================================================
FILE: html/src/components/terminal/xterm/index.ts
================================================
import { bind } from 'decko';
import type { IDisposable, ITerminalOptions } from '@xterm/xterm';
import { Terminal } from '@xterm/xterm';
import { CanvasAddon } from '@xterm/addon-canvas';
import { ClipboardAddon } from '@xterm/addon-clipboard';
import { WebglAddon } from '@xterm/addon-webgl';
import { FitAddon } from '@xterm/addon-fit';
import { WebLinksAddon } from '@xterm/addon-web-links';
import { ImageAddon } from '@xterm/addon-image';
import { Unicode11Addon } from '@xterm/addon-unicode11';
import { OverlayAddon } from './addons/overlay';
import { ZmodemAddon } from './addons/zmodem';

import '@xterm/xterm/css/xterm.css';

interface TtydTerminal extends Terminal {
    fit(): void;
}

declare global {
    interface Window {
        term: TtydTerminal;
    }
}

enum Command {
    // server side
    OUTPUT = '0',
    SET_WINDOW_TITLE = '1',
    SET_PREFERENCES = '2',

    // client side
    INPUT = '0',
    RESIZE_TERMINAL = '1',
    PAUSE = '2',
    RESUME = '3',
}
type Preferences = ITerminalOptions & ClientOptions;

export type RendererType = 'dom' | 'canvas' | 'webgl';

export interface ClientOptions {
    rendererType: RendererType;
    disableLeaveAlert: boolean;
    disableResizeOverlay: boolean;
    enableZmodem: boolean;
    enableTrzsz: boolean;
    enableSixel: boolean;
    titleFixed?: string;
    isWindows: boolean;
    trzszDragInitTimeout: number;
    unicodeVersion: string;
    closeOnDisconnect: boolean;
}

export interface FlowControl {
    limit: number;
    highWater: number;
    lowWater: number;
}

export interface XtermOptions {
    wsUrl: string;
    tokenUrl: string;
    flowControl: FlowControl;
    clientOptions: ClientOptions;
    termOptions: ITerminalOptions;
}

function toDisposable(f: () => void): IDisposable {
    return { dispose: f };
}

function addEventListener(target: EventTarget, type: string, listener: EventListener): IDisposable {
    target.addEventListener(type, listener);
    return toDisposable(() => target.removeEventListener(type, listener));
}

export class Xterm {
    private disposables: IDisposable[] = [];
    private textEncoder = new TextEncoder();
    private textDecoder = new TextDecoder();
    private written = 0;
    private pending = 0;

    private terminal: Terminal;
    private fitAddon = new FitAddon();
    private overlayAddon = new OverlayAddon();
    private clipboardAddon = new ClipboardAddon();
    private webLinksAddon = new WebLinksAddon();
    private webglAddon?: WebglAddon;
    private canvasAddon?: CanvasAddon;
    private zmodemAddon?: ZmodemAddon;

    private socket?: WebSocket;
    private token: string;
    private opened = false;
    private title?: string;
    private titleFixed?: string;
    private resizeOverlay = true;
    private reconnect = true;
    private doReconnect = true;
    private closeOnDisconnect = false;

    private writeFunc = (data: ArrayBuffer) => this.writeData(new Uint8Array(data));

    constructor(
        private options: XtermOptions,
        private sendCb: () => void
    ) {}

    dispose() {
        for (const d of this.disposables) {
            d.dispose();
        }
        this.disposables.length = 0;
    }

    @bind
    private register<T extends IDisposable>(d: T): T {
        this.disposables.push(d);
        return d;
    }

    @bind
    public sendFile(files: FileList) {
        this.zmodemAddon?.sendFile(files);
    }

    @bind
    public async refreshToken() {
        try {
            const resp = await fetch(this.options.tokenUrl);
            if (resp.ok) {
                const json = await resp.json();
                this.token = json.token;
            }
        } catch (e) {
            console.error(`[ttyd] fetch ${this.options.tokenUrl}: `, e);
        }
    }

    @bind
    private onWindowUnload(event: BeforeUnloadEvent) {
        event.preventDefault();
        if (this.socket?.readyState === WebSocket.OPEN) {
            const message = 'Close terminal? this will also terminate the command.';
            event.returnValue = message;
            return message;
        }
        return undefined;
    }

    @bind
    public open(parent: HTMLElement) {
        this.terminal = new Terminal(this.options.termOptions);
        const { terminal, fitAddon, overlayAddon, clipboardAddon, webLinksAddon } = this;
        window.term = terminal as TtydTerminal;
        window.term.fit = () => {
            this.fitAddon.fit();
        };

        terminal.loadAddon(fitAddon);
        terminal.loadAddon(overlayAddon);
        terminal.loadAddon(clipboardAddon);
        terminal.loadAddon(webLinksAddon);

        terminal.open(parent);
        fitAddon.fit();
    }

    @bind
    private initListeners() {
        const { terminal, fitAddon, overlayAddon, register, sendData } = this;
        register(
            terminal.onTitleChange(data => {
                if (data && data !== '' && !this.titleFixed) {
                    document.title = data + ' | ' + this.title;
                }
            })
        );
        register(terminal.onData(data => sendData(data)));
        register(terminal.onBinary(data => sendData(Uint8Array.from(data, v => v.charCodeAt(0)))));
        register(
            terminal.onResize(({ cols, rows }) => {
                const msg = JSON.stringify({ columns: cols, rows: rows });
                this.socket?.send(this.textEncoder.encode(Command.RESIZE_TERMINAL + msg));
                if (this.resizeOverlay) overlayAddon.showOverlay(`${cols}x${rows}`, 300);
            })
        );
        register(
            terminal.onSelectionChange(() => {
                if (this.terminal.getSelection() === '') return;
                try {
                    document.execCommand('copy');
                } catch (e) {
                    return;
                }
                this.overlayAddon?.showOverlay('\u2702', 200);
            })
        );
        register(addEventListener(window, 'resize', () => fitAddon.fit()));
        register(addEventListener(window, 'beforeunload', this.onWindowUnload));
    }

    @bind
    public writeData(data: string | Uint8Array) {
        const { terminal, textEncoder } = this;
        const { limit, highWater, lowWater } = this.options.flowControl;

        this.written += data.length;
        if (this.written > limit) {
            terminal.write(data, () => {
                this.pending = Math.max(this.pending - 1, 0);
                if (this.pending < lowWater) {
                    this.socket?.send(textEncoder.encode(Command.RESUME));
                }
            });
            this.pending++;
            this.written = 0;
            if (this.pending > highWater) {
                this.socket?.send(textEncoder.encode(Command.PAUSE));
            }
        } else {
            terminal.write(data);
        }
    }

    @bind
    public sendData(data: string | Uint8Array) {
        const { socket, textEncoder } = this;
        if (socket?.readyState !== WebSocket.OPEN) return;

        if (typeof data === 'string') {
            const payload = new Uint8Array(data.length * 3 + 1);
            payload[0] = Command.INPUT.charCodeAt(0);
            const stats = textEncoder.encodeInto(data, payload.subarray(1));
            socket.send(payload.subarray(0, (stats.written as number) + 1));
        } else {
            const payload = new Uint8Array(data.length + 1);
            payload[0] = Command.INPUT.charCodeAt(0);
            payload.set(data, 1);
            socket.send(payload);
        }
    }

    @bind
    public connect() {
        this.socket = new WebSocket(this.options.wsUrl, ['tty']);
        const { socket, register } = this;

        socket.binaryType = 'arraybuffer';
        register(addEventListener(socket, 'open', this.onSocketOpen));
        register(addEventListener(socket, 'message', this.onSocketData as EventListener));
        register(addEventListener(socket, 'close', this.onSocketClose as EventListener));
        register(addEventListener(socket, 'error', () => (this.doReconnect = false)));
    }

    @bind
    private onSocketOpen() {
        console.log('[ttyd] websocket connection opened');

        const { textEncoder, terminal, overlayAddon } = this;
        const msg = JSON.stringify({ AuthToken: this.token, columns: terminal.cols, rows: terminal.rows });
        this.socket?.send(textEncoder.encode(msg));

        if (this.opened) {
            terminal.reset();
            terminal.options.disableStdin = false;
            overlayAddon.showOverlay('Reconnected', 300);
        } else {
            this.opened = true;
        }

        this.doReconnect = this.reconnect;
        this.initListeners();
        terminal.focus();
    }

    @bind
    private onSocketClose(event: CloseEvent) {
        console.log(`[ttyd] websocket connection closed with code: ${event.code}`);

        const { refreshToken, connect, doReconnect, overlayAddon } = this;
        overlayAddon.showOverlay('Connection Closed');
        this.dispose();

        // 1000: CLOSE_NORMAL
        if (event.code !== 1000 && doReconnect) {
            overlayAddon.showOverlay('Reconnecting...');
            refreshToken().then(connect);
        } else if (this.closeOnDisconnect) {
            window.close();
        } else {
            const { terminal } = this;
            const keyDispose = terminal.onKey(e => {
                const event = e.domEvent;
                if (event.key === 'Enter') {
                    keyDispose.dispose();
                    overlayAddon.showOverlay('Reconnecting...');
                    refreshToken().then(connect);
                }
            });
            overlayAddon.showOverlay('Press ⏎ to Reconnect');
        }
    }

    @bind
    private parseOptsFromUrlQuery(query: string): Preferences {
        const { terminal } = this;
        const { clientOptions } = this.options;
        const prefs = {} as Preferences;
        const queryObj = Array.from(new URLSearchParams(query) as unknown as Iterable<[string, string]>);

        for (const [k, queryVal] of queryObj) {
            let v = clientOptions[k];
            if (v === undefined) v = terminal.options[k];
            switch (typeof v) {
                case 'boolean':
                    prefs[k] = queryVal === 'true' || queryVal === '1';
                    break;
                case 'number':
                case 'bigint':
                    prefs[k] = Number.parseInt(queryVal, 10);
                    break;
                case 'string':
                    prefs[k] = queryVal;
                    break;
                case 'object':
                    prefs[k] = JSON.parse(queryVal);
                    break;
                default:
                    console.warn(`[ttyd] maybe unknown option: ${k}=${queryVal}, treating as string`);
                    prefs[k] = queryVal;
                    break;
            }
        }

        return prefs;
    }

    @bind
    private onSocketData(event: MessageEvent) {
        const { textDecoder } = this;
        const rawData = event.data as ArrayBuffer;
        const cmd = String.fromCharCode(new Uint8Array(rawData)[0]);
        const data = rawData.slice(1);

        switch (cmd) {
            case Command.OUTPUT:
                this.writeFunc(data);
                break;
            case Command.SET_WINDOW_TITLE:
                this.title = textDecoder.decode(data);
                document.title = this.title;
                break;
            case Command.SET_PREFERENCES:
                this.applyPreferences({
                    ...this.options.clientOptions,
                    ...JSON.parse(textDecoder.decode(data)),
                    ...this.parseOptsFromUrlQuery(window.location.search),
                } as Preferences);
                break;
            default:
                console.warn(`[ttyd] unknown command: ${cmd}`);
                break;
        }
    }

    @bind
    private applyPreferences(prefs: Preferences) {
        const { terminal, fitAddon, register } = this;
        if (prefs.enableZmodem || prefs.enableTrzsz) {
            this.zmodemAddon = new ZmodemAddon({
                zmodem: prefs.enableZmodem,
                trzsz: prefs.enableTrzsz,
                windows: prefs.isWindows,
                trzszDragInitTimeout: prefs.trzszDragInitTimeout,
                onSend: this.sendCb,
                sender: this.sendData,
                writer: this.writeData,
            });
            this.writeFunc = data => this.zmodemAddon?.consume(data);
            terminal.loadAddon(register(this.zmodemAddon));
        }

        for (const [key, value] of Object.entries(prefs)) {
            switch (key) {
                case 'rendererType':
                    this.setRendererType(value);
                    break;
                case 'disableLeaveAlert':
                    if (value) {
                        window.removeEventListener('beforeunload', this.onWindowUnload);
                        console.log('[ttyd] Leave site alert disabled');
                    }
                    break;
                case 'disableResizeOverlay':
                    if (value) {
                        console.log('[ttyd] Resize overlay disabled');
                        this.resizeOverlay = false;
                    }
                    break;
                case 'disableReconnect':
                    if (value) {
                        console.log('[ttyd] Reconnect disabled');
                        this.reconnect = false;
                        this.doReconnect = false;
                    }
                    break;
                case 'enableZmodem':
                    if (value) console.log('[ttyd] Zmodem enabled');
                    break;
                case 'enableTrzsz':
                    if (value) console.log('[ttyd] trzsz enabled');
                    break;
                case 'trzszDragInitTimeout':
                    if (value) console.log(`[ttyd] trzsz drag init timeout: ${value}`);
                    break;
                case 'enableSixel':
                    if (value) {
                        terminal.loadAddon(register(new ImageAddon()));
                        console.log('[ttyd] Sixel enabled');
                    }
                    break;
                case 'closeOnDisconnect':
                    if (value) {
                        console.log('[ttyd] close on disconnect enabled (Reconnect disabled)');
                        this.closeOnDisconnect = true;
                        this.reconnect = false;
                        this.doReconnect = false;
                    }
                    break;
                case 'titleFixed':
                    if (!value || value === '') return;
                    console.log(`[ttyd] setting fixed title: ${value}`);
                    this.titleFixed = value;
                    document.title = value;
                    break;
                case 'isWindows':
                    if (value) console.log('[ttyd] is windows');
                    break;
                case 'unicodeVersion':
                    switch (value) {
                        case 6:
                        case '6':
                            console.log('[ttyd] setting Unicode version: 6');
                            break;
                        case 11:
                        case '11':
                        default:
                            console.log('[ttyd] setting Unicode version: 11');
                            terminal.loadAddon(new Unicode11Addon());
                            terminal.unicode.activeVersion = '11';
                            break;
                    }
                    break;
                default:
                    console.log(`[ttyd] option: ${key}=${JSON.stringify(value)}`);
                    if (terminal.options[key] instanceof Object) {
                        terminal.options[key] = Object.assign({}, terminal.options[key], value);
                    } else {
                        terminal.options[key] = value;
                    }
                    if (key.indexOf('font') === 0) fitAddon.fit();
                    break;
            }
        }
    }

    @bind
    private setRendererType(value: RendererType) {
        const { terminal } = this;
        const disposeCanvasRenderer = () => {
            try {
                this.canvasAddon?.dispose();
            } catch {
                // ignore
            }
            this.canvasAddon = undefined;
        };
        const disposeWebglRenderer = () => {
            try {
                this.webglAddon?.dispose();
            } catch {
                // ignore
            }
            this.webglAddon = undefined;
        };
        const enableCanvasRenderer = () => {
            if (this.canvasAddon) return;
            this.canvasAddon = new CanvasAddon();
            disposeWebglRenderer();
            try {
                this.terminal.loadAddon(this.canvasAddon);
                console.log('[ttyd] canvas renderer loaded');
            } catch (e) {
                console.log('[ttyd] canvas renderer could not be loaded, falling back to dom renderer', e);
                disposeCanvasRenderer();
            }
        };
        const enableWebglRenderer = () => {
            if (this.webglAddon) return;
            this.webglAddon = new WebglAddon();
            disposeCanvasRenderer();
            try {
                this.webglAddon.onContextLoss(() => {
                    this.webglAddon?.dispose();
                });
                terminal.loadAddon(this.webglAddon);
                console.log('[ttyd] WebGL renderer loaded');
            } catch (e) {
                console.log('[ttyd] WebGL renderer could not be loaded, falling back to canvas renderer', e);
                disposeWebglRenderer();
                enableCanvasRenderer();
            }
        };

        switch (value) {
            case 'canvas':
                enableCanvasRenderer();
                break;
            case 'webgl':
                enableWebglRenderer();
                break;
            case 'dom':
                disposeWebglRenderer();
                disposeCanvasRenderer();
                console.log('[ttyd] dom renderer loaded');
                break;
            default:
                break;
        }
    }
}


================================================
FILE: html/src/index.tsx
================================================
if (process.env.NODE_ENV === 'development') {
    require('preact/debug');
}
import 'whatwg-fetch';
import { h, render } from 'preact';
import { App } from './components/app';
import './style/index.scss';

render(<App />, document.body);


================================================
FILE: html/src/style/index.scss
================================================
html,
body {
  height: 100%;
  min-height: 100%;
  margin: 0;
  overflow: hidden;
}

#terminal-container {
  width: auto;
  height: 100%;
  margin: 0 auto;
  padding: 0;
  .terminal {
    padding: 5px;
    height: calc(100% - 10px);
  }
}


================================================
FILE: html/src/template.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="mobile-web-app-capable" content="yes">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <link inline rel="icon" type="image/png" href="favicon.png">
    <% for (const css in htmlWebpackPlugin.files.css) { %>
    <link inline rel="stylesheet" type="text/css" href="<%= htmlWebpackPlugin.files.css[css] %>">
    <% } %>
</head>
<body>
<% for (const js in htmlWebpackPlugin.files.js) { %>
<script inline type="text/javascript" src="<%= htmlWebpackPlugin.files.js[js] %>"></script>
<% } %>
</body>
</html>


================================================
FILE: html/tsconfig.json
================================================
{
  "extends": "./node_modules/gts/tsconfig-google.json",
  "compilerOptions": {
    "moduleResolution": "node",
    "esModuleInterop": true,
    "jsx": "react",
    "jsxFactory": "h",
    "allowJs": true,
    "noImplicitAny": false,
    "declaration": false,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false,
    "lib": ["es2019", "dom"],
  },
  "include": [
    "src/**/*.tsx",
    "src/**/*.ts"
  ]
}


================================================
FILE: html/webpack.config.js
================================================
const path = require('path');
const { merge } = require('webpack-merge');
const ESLintPlugin = require('eslint-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');

const devMode = process.env.NODE_ENV !== 'production';

const baseConfig = {
    context: path.resolve(__dirname, 'src'),
    entry: {
        app: './index.tsx',
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: devMode ? '[name].js' : '[name].[contenthash].js',
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/,
            },
            {
                test: /\.s?[ac]ss$/,
                use: [devMode ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
            },
        ],
    },
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
    },
    plugins: [
        new ESLintPlugin({
            context: path.resolve(__dirname, '.'),
            extensions: ['js', 'jsx', 'ts', 'tsx'],
        }),
        new CopyWebpackPlugin({
            patterns: [{ from: './favicon.png', to: '.' }],
        }),
        new MiniCssExtractPlugin({
            filename: devMode ? '[name].css' : '[name].[contenthash].css',
            chunkFilename: devMode ? '[id].css' : '[id].[contenthash].css',
        }),
        new HtmlWebpackPlugin({
            inject: false,
            minify: {
                removeComments: true,
                collapseWhitespace: true,
            },
            title: 'ttyd - Terminal',
            template: './template.html',
        }),
    ],
    performance: {
        hints: false,
    },
};

const devConfig = {
    mode: 'development',
    devServer: {
        static: path.join(__dirname, 'dist'),
        compress: true,
        port: 9000,
        client: {
            overlay: {
                errors: true,
                warnings: false,
            },
        },
        proxy: [
            {
                context: ['/token', '/ws'],
                target: 'http://localhost:7681',
                ws: true,
            },
        ],
        webSocketServer: {
            type: 'sockjs',
            options: {
                path: '/sockjs-node',
            },
        },
    },
    devtool: 'inline-source-map',
};

const prodConfig = {
    mode: 'production',
    optimization: {
        minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
    },
    devtool: 'source-map',
};

module.exports = merge(baseConfig, devMode ? devConfig : prodConfig);


================================================
FILE: man/README.md
================================================
# Building the man page

```bash
go get github.com/cpuguy83/go-md2man
go-md2man < ttyd.man.md  > ttyd.1
```

================================================
FILE: man/ttyd.1
================================================
.nh
.TH ttyd 1 "September 2016" ttyd "User Manual"

.SH NAME
.PP
ttyd - Share your terminal over the web


.SH SYNOPSIS
.PP
\fBttyd\fP [options] <command> [<arguments...>]


.SH DESCRIPTION
.PP
ttyd is a command-line tool for sharing terminal over the web that runs in *nix and windows systems, with the following features:

.RS
.IP \(bu 2
Built on top of Libwebsockets with libuv for speed
.IP \(bu 2
Fully-featured terminal based on Xterm.js with CJK (Chinese, Japanese, Korean) and IME support
.IP \(bu 2
Graphical ZMODEM integration with lrzsz support
.IP \(bu 2
Sixel image output support
.IP \(bu 2
SSL support based on OpenSSL
.IP \(bu 2
Run any custom command with options
.IP \(bu 2
Basic authentication support and many other custom options
.IP \(bu 2
Cross platform: macOS, Linux, FreeBSD/OpenBSD, OpenWrt/LEDE, Windows

.RE


.SH OPTIONS
.PP
-p, --port 
      Port to listen (default: 7681, use \fB\fC0\fR for random port)

.PP
-i, --interface 
      Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)

.PP
-U, --socket-owner
      User owner of the UNIX domain socket file, when enabled (eg: user:group)

.PP
-c, --credential USER[:PASSWORD]
      Credential for Basic Authentication (format: username:password)

.PP
-H, --auth-header 
      HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication

.PP
-u, --uid 
      User id to run with

.PP
-g, --gid 
      Group id to run with

.PP
-s, --signal 
      Signal to send to the command when exit it (default: 1, SIGHUP)

.PP
-w, --cwd 
      Working directory to be set for the child program

.PP
-a, --url-arg
      Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)

.PP
-W, --writable
      Allow clients to write to the TTY (readonly by default)

.PP
-t, --client-option 
      Send option to client (format: key=value), repeat to add more options, see \fBCLIENT OPTIONS\fP for details

.PP
-T, --terminal-type
      Terminal type to report, default: xterm-256color

.PP
-O, --check-origin
      Do not allow websocket connection from different origin

.PP
-m, --max-clients
      Maximum clients to support (default: 0, no limit)

.PP
-o, --once
      Accept only one client and exit on disconnection

.PP
-q, --exit-no-conn
      Exit on all clients disconnection

.PP
-B, --browser
      Open terminal with the default system browser

.PP
-I, --index 
      Custom index.html path

.PP
-b, --base-path
      Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)

.PP
-P, --ping-interval
      Websocket ping interval(sec) (default: 5)

.PP
-f, --srv-buf-size
      Maximum chunk of file (in bytes) that can be sent at once, a larger value may improve throughput (default: 4096)

.PP
-6, --ipv6
      Enable IPv6 support

.PP
-S, --ssl
      Enable SSL

.PP
-C, --ssl-cert 
      SSL certificate file path

.PP
-K, --ssl-key 
      SSL key file path

.PP
-A, --ssl-ca 
      SSL CA file path for client certificate verification

.PP
-d, --debug 
      Set log level (default: 7)

.PP
-v, --version
      Print the version and exit

.PP
-h, --help
      Print this text and exit


.SH CLIENT OPTIONS
.PP
ttyd has a mechanism to pass server side command-line arguments to the browser page which is called \fBclient options\fP:

.PP
.RS

.nf
-t, --client-option     Send option to client (format: key=value), repeat to add more options

.fi
.RE

.SH Basic usage
.RS
.IP \(bu 2
\fB\fC-t rendererType=canvas\fR: use the \fB\fCcanvas\fR renderer for xterm.js (default: \fB\fCwebgl\fR)
.IP \(bu 2
\fB\fC-t disableLeaveAlert=true\fR: disable the leave page alert
.IP \(bu 2
\fB\fC-t disableResizeOverlay=true\fR: disable the terminal resize overlay
.IP \(bu 2
\fB\fC-t disableReconnect=true\fR: prevent the terminal from reconnecting on connection error/close
.IP \(bu 2
\fB\fC-t enableZmodem=true\fR: enable ZMODEM
\[la]https://en.wikipedia.org/wiki/ZMODEM\[ra] / lrzsz
\[la]https://ohse.de/uwe/software/lrzsz.html\[ra] file transfer support
.IP \(bu 2
\fB\fC-t enableTrzsz=true\fR: enable trzsz
\[la]https://trzsz.github.io\[ra] file transfer support
.IP \(bu 2
\fB\fC-t enableSixel=true\fR: enable Sixel
\[la]https://en.wikipedia.org/wiki/Sixel\[ra] image output support (Usage
\[la]https://saitoha.github.io/libsixel/\[ra])
.IP \(bu 2
\fB\fC-t closeOnDisconnect=true\fR: close the terminal on disconnection, this will disable reconnect
.IP \(bu 2
\fB\fC-t titleFixed=hello\fR: set a fixed title for the browser window
.IP \(bu 2
\fB\fC-t fontSize=20\fR: change the font size of the terminal
.IP \(bu 2
\fB\fC-t unicodeVersion=11\fR: set xterm unicode support level (default: 11, use 6 to disable unicode addon)
.IP \(bu 2
\fB\fC-t trzszDragInitTimeout=3000\fR: set the timeout in milliseconds for initializing drag and drop files to upload. (default: 3000)

.RE

.SH Advanced usage
.PP
You can use the client option to change all the settings of xterm defined in ITerminalOptions
\[la]https://xtermjs.org/docs/api/terminal/interfaces/iterminaloptions/\[ra], examples:

.RS
.IP \(bu 2
\fB\fC-t cursorStyle=bar\fR: set cursor style to \fB\fCbar\fR
.IP \(bu 2
\fB\fC-t lineHeight=1.5\fR: set line-height to \fB\fC1.5\fR
.IP \(bu 2
\fB\fC-t 'theme={"background": "green"}'\fR: set background color to \fB\fCgreen\fR

.RE

.PP
to try the example options above, run:

.PP
.RS

.nf
ttyd -t cursorStyle=bar -t lineHeight=1.5 -t 'theme={"background": "green"}' bash

.fi
.RE


.SH EXAMPLES
.PP
ttyd starts web server at port 7681 by default, you can use the -p option to change it, the command will be started with arguments as options. For example, run:

.PP
.RS

.nf
ttyd -p 8080 bash -x

.fi
.RE

.PP
Then open http://localhost:8080 with a browser, you will get a bash shell with debug mode enabled. More examples:

.RS
.IP \(bu 2
If you want to login with your system accounts on the web browser, run \fB\fCttyd login\fR\&.
.IP \(bu 2
You can even run a non-shell command like vim, try: \fB\fCttyd vim\fR, the web browser will show you a vim editor.
.IP \(bu 2
Sharing single process with multiple clients: \fB\fCttyd tmux new -A -s ttyd vim\fR, run \fB\fCtmux new -A -s ttyd\fR to connect to the tmux session from terminal.

.RE


.SH SSL how-to
.PP
Generate SSL CA and self signed server/client certificates:

.PP
.RS

.nf
# CA certificate (FQDN must be different from server/client)
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt

# server certificate (for multiple domains, change subjectAltName to: DNS:example.com,DNS:www.example.com)
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=localhost" -out server.csr
openssl x509 -sha256 -req -extfile <(printf "subjectAltName=DNS:localhost") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

# client certificate (the p12/pem format may be useful for some clients)
openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=client" -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out client.pem -clcerts

.fi
.RE

.PP
Then start ttyd:

.PP
.RS

.nf
ttyd --ssl --ssl-cert server.crt --ssl-key server.key --ssl-ca ca.crt bash

.fi
.RE

.PP
You may want to test the client certificate verification with \fIcurl\fP(1):

.PP
.RS

.nf
curl --insecure --cert client.p12[:password] -v https://localhost:7681

.fi
.RE

.PP
If you don't want to enable client certificate verification, remove the \fB\fC--ssl-ca\fR option.


.SH Docker and ttyd
.PP
Docker containers are jailed environments which are more secure, this is useful for protecting the host system, you may use ttyd with docker like this:

.RS
.IP \(bu 2
Sharing single docker container with multiple clients: docker run -it --rm -p 7681:7681 tsl0922/ttyd.
.IP \(bu 2
Creating new docker container for each client: ttyd docker run -it --rm ubuntu.

.RE


.SH Nginx reverse proxy
.PP
Sample config to proxy ttyd under the \fB\fC/ttyd\fR path:

.PP
.RS

.nf
location ~ ^/ttyd(.*)$ {
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://127.0.0.1:7681/$1;
}

.fi
.RE


.SH AUTHOR
.PP
Shuanglei Tao <tsl0922@gmail.com> Visit https://github.com/tsl0922/ttyd to get more information and report bugs.


================================================
FILE: man/ttyd.man.md
================================================
ttyd 1 "September 2016" ttyd "User Manual"
==================================================

# NAME
  ttyd - Share your terminal over the web

# SYNOPSIS
  **ttyd** [options] \<command\> [\<arguments...\>]

# DESCRIPTION
  ttyd is a command-line tool for sharing terminal over the web that runs in *nix and windows systems, with the following features:

  - Built on top of Libwebsockets with libuv for speed
  - Fully-featured terminal based on Xterm.js with CJK (Chinese, Japanese, Korean) and IME support
  - Graphical ZMODEM integration with lrzsz support
  - Sixel image output support
  - SSL support based on OpenSSL
  - Run any custom command with options
  - Basic authentication support and many other custom options
  - Cross platform: macOS, Linux, FreeBSD/OpenBSD, OpenWrt/LEDE, Windows

# OPTIONS
  -p, --port <port>
      Port to listen (default: 7681, use `0` for random port)

  -i, --interface <interface>
      Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)

  -U, --socket-owner
      User owner of the UNIX domain socket file, when enabled (eg: user:group)

  -c, --credential USER[:PASSWORD]
      Credential for Basic Authentication (format: username:password)

  -H, --auth-header <name>
      HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication

  -u, --uid <uid>
      User id to run with

  -g, --gid <gid>
      Group id to run with

  -s, --signal <signal string>
      Signal to send to the command when exit it (default: 1, SIGHUP)

  -w, --cwd <path>
      Working directory to be set for the child program

  -a, --url-arg
      Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)

  -W, --writable
      Allow clients to write to the TTY (readonly by default)

  -t, --client-option <key=value>
      Send option to client (format: key=value), repeat to add more options, see **CLIENT OPTIONS** for details

  -T, --terminal-type
      Terminal type to report, default: xterm-256color

  -O, --check-origin
      Do not allow websocket connection from different origin

  -m, --max-clients
      Maximum clients to support (default: 0, no limit)

  -o, --once
      Accept only one client and exit on disconnection

  -q, --exit-no-conn
      Exit on all clients disconnection

  -B, --browser
      Open terminal with the default system browser

  -I, --index <index file>
      Custom index.html path
  
  -b, --base-path
      Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)

  -P, --ping-interval
      Websocket ping interval(sec) (default: 5)

  -f, --srv-buf-size
      Maximum chunk of file (in bytes) that can be sent at once, a larger value may improve throughput (default: 4096)

  -6, --ipv6
      Enable IPv6 support

  -S, --ssl
      Enable SSL

  -C, --ssl-cert <cert path>
      SSL certificate file path

  -K, --ssl-key <key path>
      SSL key file path

  -A, --ssl-ca <ca path>
      SSL CA file path for client certificate verification

  -d, --debug <level>
      Set log level (default: 7)

  -v, --version
      Print the version and exit

  -h, --help
      Print this text and exit

# CLIENT OPTIONS
ttyd has a mechanism to pass server side command-line arguments to the browser page which is called **client options**:

```bash
-t, --client-option     Send option to client (format: key=value), repeat to add more options
```

## Basic usage

- `-t rendererType=canvas`: use the `canvas` renderer for xterm.js (default: `webgl`)
- `-t disableLeaveAlert=true`: disable the leave page alert
- `-t disableResizeOverlay=true`: disable the terminal resize overlay
- `-t disableReconnect=true`: prevent the terminal from reconnecting on connection error/close
- `-t enableZmodem=true`: enable [ZMODEM](https://en.wikipedia.org/wiki/ZMODEM) / [lrzsz](https://ohse.de/uwe/software/lrzsz.html) file transfer support
- `-t enableTrzsz=true`: enable [trzsz](https://trzsz.github.io) file transfer support
- `-t enableSixel=true`: enable [Sixel](https://en.wikipedia.org/wiki/Sixel) image output support ([Usage](https://saitoha.github.io/libsixel/))
- `-t closeOnDisconnect=true`: close the terminal on disconnection, this will disable reconnect
- `-t titleFixed=hello`: set a fixed title for the browser window
- `-t fontSize=20`: change the font size of the terminal
- `-t unicodeVersion=11`: set xterm unicode support level (default: 11, use 6 to disable unicode addon)
- `-t trzszDragInitTimeout=3000`: set the timeout in milliseconds for initializing drag and drop files to upload. (default: 3000) 

## Advanced usage

You can use the client option to change all the settings of xterm defined in [ITerminalOptions](https://xtermjs.org/docs/api/terminal/interfaces/iterminaloptions/), examples:

- `-t cursorStyle=bar`: set cursor style to `bar`
- `-t lineHeight=1.5`: set line-height to `1.5`
- `-t 'theme={"background": "green"}'`: set background color to `green`

to try the example options above, run:

```bash
ttyd -t cursorStyle=bar -t lineHeight=1.5 -t 'theme={"background": "green"}' bash
```

# EXAMPLES
  ttyd starts web server at port 7681 by default, you can use the -p option to change it, the command will be started with arguments as options. For example, run:
  
```  
ttyd -p 8080 bash -x
```

  Then open http://localhost:8080 with a browser, you will get a bash shell with debug mode enabled. More examples:

  - If you want to login with your system accounts on the web browser, run `ttyd login`.
  - You can even run a non-shell command like vim, try: `ttyd vim`, the web browser will show you a vim editor.
  - Sharing single process with multiple clients: `ttyd tmux new -A -s ttyd vim`, run `tmux new -A -s ttyd` to connect to the tmux session from terminal.

# SSL how-to
  Generate SSL CA and self signed server/client certificates:

```
# CA certificate (FQDN must be different from server/client)
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt

# server certificate (for multiple domains, change subjectAltName to: DNS:example.com,DNS:www.example.com)
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=localhost" -out server.csr
openssl x509 -sha256 -req -extfile <(printf "subjectAltName=DNS:localhost") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

# client certificate (the p12/pem format may be useful for some clients)
openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=client" -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out client.pem -clcerts
```

  Then start ttyd:

```
ttyd --ssl --ssl-cert server.crt --ssl-key server.key --ssl-ca ca.crt bash
```

  You may want to test the client certificate verification with *curl*(1):

```
curl --insecure --cert client.p12[:password] -v https://localhost:7681
```

  If you don't want to enable client certificate verification, remove the `--ssl-ca` option.

# Docker and ttyd
  Docker containers are jailed environments which are more secure, this is useful for protecting the host system, you may use ttyd with docker like this:

  - Sharing single docker container with multiple clients: docker run -it --rm -p 7681:7681 tsl0922/ttyd.
  - Creating new docker container for each client: ttyd docker run -it --rm ubuntu.

# Nginx reverse proxy

Sample config to proxy ttyd under the `/ttyd` path:

```nginx
location ~ ^/ttyd(.*)$ {
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://127.0.0.1:7681/$1;
}
```

# AUTHOR
  Shuanglei Tao \<tsl0922@gmail.com\> Visit https://github.com/tsl0922/ttyd to get more information and report bugs.


================================================
FILE: scripts/cross-build.sh
================================================
#!/bin/bash
#
# Example:
#         env BUILD_TARGET=mips ./scripts/cross-build.sh
#
set -eo pipefail

CROSS_ROOT="${CROSS_ROOT:-/opt/cross}"
STAGE_ROOT="${STAGE_ROOT:-/opt/stage}"
BUILD_ROOT="${BUILD_ROOT:-/opt/build}"
BUILD_TARGET="${BUILD_TARGET:-x86_64}"

ZLIB_VERSION="${ZLIB_VERSION:-1.3.2}"
JSON_C_VERSION="${JSON_C_VERSION:-0.18}"
OPENSSL_VERSION="${OPENSSL_VERSION:-3.6.1}"
LIBUV_VERSION="${LIBUV_VERSION:-1.52.1}"
LIBWEBSOCKETS_VERSION="${LIBWEBSOCKETS_VERSION:-4.5.7}"

build_zlib() {
    echo "=== Building zlib-${ZLIB_VERSION} (${TARGET})..."
    curl -fSsLo- "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
    pushd "${BUILD_DIR}"/zlib-"${ZLIB_VERSION}"
        env CHOST="${TARGET}" ./configure --static --archs="-fPIC" --prefix="${STAGE_DIR}" --disable-crcvx
        make -j"$(nproc)" install
    popd
}

build_json-c() {
    echo "=== Building json-c-${JSON_C_VERSION} (${TARGET})..."
    curl -fSsLo- "https://s3.amazonaws.com/json-c_releases/releases/json-c-${JSON_C_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
    pushd "${BUILD_DIR}/json-c-${JSON_C_VERSION}"
        rm -rf build && mkdir -p build && cd build
        cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
            -DCMAKE_BUILD_TYPE=RELEASE \
            -DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
            -DBUILD_SHARED_LIBS=OFF \
            -DBUILD_TESTING=OFF \
            -DDISABLE_THREAD_LOCAL_STORAGE=ON \
            ..
        make -j"$(nproc)" install
    popd
}

map_openssl_target() {
    case $1 in
        i686) echo linux-generic32 ;;
        x86_64) echo linux-x86_64 ;;
        arm|armhf|armv7l) echo linux-armv4 ;;
        aarch64) echo linux-aarch64 ;;
        mips|mipsel) echo linux-mips32 ;;
        mips64|mips64el) echo linux64-mips64 ;;
        powerpc64) echo linux-ppc64 ;;
        powerpc64le) echo linux-ppc64le ;;
        s390x) echo linux64-s390x ;;
        win32) echo mingw64 ;;
        *) echo "unknown openssl target: $1" && exit 1
    esac
}

build_openssl() {
    openssl_target=$(map_openssl_target "${BUILD_TARGET}")
    echo "=== Building openssl-${OPENSSL_VERSION} (${openssl_target})..."
    curl -sLo- "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
    pushd "${BUILD_DIR}/openssl-${OPENSSL_VERSION}"
        openssl_cflags="-fPIC -latomic"
        case ${BUILD_TARGET} in
            s390x) openssl_cflags="${openssl_cflags} -march=z10" ;;
            win32)
                curl -sLo- https://github.com/openssl/openssl/pull/29826.patch | patch -p1
                ;;
        esac
        env CC=gcc CROSS_COMPILE="${TARGET}-" CFLAGS="${openssl_cflags}" \
            ./Configure "${openssl_target}" no-ssl3 no-err -DOPENSSL_SMALL_FOOTPRINT --prefix="${STAGE_DIR}" \
        && make -j"$(nproc)" all > /dev/null && make install_sw
    popd
}

build_libuv() {
    echo "=== Building libuv-${LIBUV_VERSION} (${TARGET})..."
    curl -fSsLo- "https://dist.libuv.org/dist/v${LIBUV_VERSION}/libuv-v${LIBUV_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
    pushd "${BUILD_DIR}/libuv-v${LIBUV_VERSION}"
        ./autogen.sh
        env CFLAGS=-fPIC ./configure --disable-shared --enable-static --prefix="${STAGE_DIR}" --host="${TARGET}"
        make -j"$(nproc)" install
    popd
}

install_cmake_cross_file() {
    cat << EOF > "${BUILD_DIR}/cross-${TARGET}.cmake"
SET(CMAKE_SYSTEM_NAME $1)

set(CMAKE_C_COMPILER "${TARGET}-gcc")
set(CMAKE_CXX_COMPILER "${TARGET}-g++")

set(CMAKE_FIND_ROOT_PATH "${STAGE_DIR}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(OPENSSL_USE_STATIC_LIBS TRUE)
EOF
}

build_libwebsockets() {
    echo "=== Building libwebsockets-${LIBWEBSOCKETS_VERSION} (${TARGET})..."
    curl -fSsLo- "https://github.com/warmcat/libwebsockets/archive/v${LIBWEBSOCKETS_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
    pushd "${BUILD_DIR}/libwebsockets-${LIBWEBSOCKETS_VERSION}"
        sed -i 's/ websockets_shared//g' cmake/libwebsockets-config.cmake.in
        rm -rf build && mkdir -p build && cd build
        cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
            -DCMAKE_BUILD_TYPE=RELEASE \
            -DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
            -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \
            -DCMAKE_EXE_LINKER_FLAGS="-static" \
            -DLWS_WITHOUT_TESTAPPS=ON \
            -DLWS_WITH_SSL=ON \
            -DLWS_WITH_LIBUV=ON \
            -DLWS_STATIC_PIC=ON \
            -DLWS_WITH_SHARED=OFF \
            -DLWS_UNIX_SOCK=ON \
            -DLWS_IPV6=ON \
            -DLWS_ROLE_RAW_FILE=OFF \
            -DLWS_WITH_HTTP2=ON \
            -DLWS_WITH_HTTP_BASIC_AUTH=OFF \
            -DLWS_WITH_HTTP_STREAM_COMPRESSION=ON \
            -DLWS_WITH_UDP=OFF \
            -DLWS_WITHOUT_CLIENT=ON \
            -DLWS_WITHOUT_EXTENSIONS=OFF \
            -DLWS_WITH_LEJP=OFF \
            -DLWS_WITH_LEJP_CONF=OFF \
            -DLWS_WITH_LWSAC=OFF \
            -DLWS_WITH_SEQUENCER=OFF \
            -DLWS_WITH_UPNG=OFF \
            -DLWS_WITH_JPEG=OFF \
            -DLWS_WITH_DLO=OFF \
            -DLWS_WITH_SYS_STATE=OFF \
            -DLWS_WITH_SYS_SMD=OFF \
            -DLWS_WITH_SECURE_STREAMS=OFF \
            -DLWS_CTEST_INTERNET_AVAILABLE=OFF \
            ..
        make -j"$(nproc)" install
    popd
}

build_ttyd() {
    echo "=== Building ttyd (${TARGET})..."
    rm -rf build && mkdir -p build && cd build
    cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
        -DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
        -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \
        -DCMAKE_C_FLAGS="-Os -ffunction-sections -fdata-sections -fno-unwind-tables -fno-asynchronous-unwind-tables -flto" \
        -DCMAKE_EXE_LINKER_FLAGS="-static -no-pie -Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" \
        -DCMAKE_BUILD_TYPE=RELEASE \
        ..
    make install
}

build() {
    TARGET="$1"
    ALIAS="$2"
    STAGE_DIR="${STAGE_ROOT}/${TARGET}"
    BUILD_DIR="${BUILD_ROOT}/${TARGET}"
    MUSL_CC_URL="https://github.com/tsl0922/musl-toolchains/releases/download/2021-11-23"
    COMPONENTS="1"
    SYSTEM="Linux"

    if [ "$ALIAS" = "win32" ]; then
        COMPONENTS=2
        SYSTEM="Windows"
    fi

    echo "=== Installing toolchain ${ALIAS} (${TARGET})..."

    mkdir -p "${CROSS_ROOT}" && export PATH="${PATH}:${CROSS_ROOT}/bin"
    curl -fSsLo- "${MUSL_CC_URL}/${TARGET}-cross.tgz" | tar xz -C "${CROSS_ROOT}" --strip-components=${COMPONENTS}

    echo "=== Building target ${ALIAS} (${TARGET})..."

    rm -rf "${STAGE_DIR}" "${BUILD_DIR}"
    mkdir -p "${STAGE_DIR}" "${BUILD_DIR}"
    export PKG_CONFIG_PATH="${STAGE_DIR}/lib/pkgconfig"

    install_cmake_cross_file ${SYSTEM}

    build_zlib
    build_json-c
    build_libuv
    build_openssl
    build_libwebsockets
    build_ttyd
}

case ${BUILD_TARGET} in
    amd64) BUILD_TARGET="x86_64" ;;
    arm64) BUILD_TARGET="aarch64" ;;
    armv7) BUILD_TARGET="armv7l" ;;
    ppc64) BUILD_TARGET="powerpc64" ;;
    ppc64le) BUILD_TARGET="powerpc64le" ;;
esac

case ${BUILD_TARGET} in
    i686|x86_64|aarch64|mips|mipsel|mips64|mips64el|powerpc64|powerpc64le|s390x)
        build "${BUILD_TARGET}-linux-musl" "${BUILD_TARGET}"
        ;;
    arm)
        build "${BUILD_TARGET}-linux-musleabi" "${BUILD_TARGET}"
        ;;
    armhf)
        build arm-linux-musleabihf "${BUILD_TARGET}"
        ;;
    armv7l)
        build armv7l-linux-musleabihf "${BUILD_TARGET}"
        ;;
    win32)
        build x86_64-w64-mingw32 "${BUILD_TARGET}"
        ;;
    *)
        echo "unknown cross target: ${BUILD_TARGET}" && exit 1
esac


================================================
FILE: snap/snapcraft.yaml
================================================
name: ttyd
adopt-info: ttyd
summary: Share your terminal over the web
description: |
 ttyd is a simple command-line tool for sharing terminal over the web

grade: stable
confinement: classic
base: core20
compression: lzo

license: MIT

assumes:
  - command-chain

apps:
  ttyd:
    command: usr/bin/ttyd
    command-chain: 
      - bin/homeishome-launch       

parts:
  ttyd:
    source: https://github.com/tsl0922/ttyd
    source-type: git
    plugin: cmake
    cmake-parameters:
      - -DCMAKE_INSTALL_PREFIX=/usr
    build-environment:
      - LDFLAGS: "-pthread"
      
    override-pull: |
      snapcraftctl pull
      snapcraftctl set-version "$(git describe --tags | sed 's/^v//' | cut -d "-" -f1)"
      
    build-packages:
      - build-essential 
      - libjson-c-dev 
      - libwebsockets-dev
      
    stage-packages:
      - libjson-c4
      - libwebsockets15
      
  homeishome-launch:
    plugin: nil
    stage-snaps:
      - homeishome-launch  


================================================
FILE: src/compat.h
================================================
/* compat.h -- MSVC compatibility shims for POSIX functions */
#ifndef TTYD_COMPAT_H
#define TTYD_COMPAT_H

#ifdef _MSC_VER
#include <string.h>
#include <sys/stat.h>
#define strcasecmp _stricmp
#define strncasecmp _strnicmp

#ifndef S_ISDIR
#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
#endif
#ifndef S_ISREG
#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)
#endif
#endif

#endif /* TTYD_COMPAT_H */


================================================
FILE: src/html.h
================================================
unsigned char index_html[] = {
  0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xec, 0xbd,
  0x69, 0x77, 0xe3, 0xb8, 0x92, 0x20, 0xfa, 0xfd, 0xfd, 0x0a, 0x5b, 0xb7,
  0xae, 0x8f, 0x68, 0x51, 0xb2, 0x76, 0xdb, 0x92, 0x69, 0x3f, 0xef, 0xe9,
  0x2c, 0x2f, 0x99, 0x4e, 0x3b, 0x37, 0x5f, 0x8f, 0x8b, 0x92, 0x28, 0x89,
  0x99, 0x32, 0xa9, 0x22, 0x29, 0x2f, 0x69, 0xeb, 0x9d, 0xd7, 0xfb, 0x36,
  0x3d, 0x33, 0xdd, 0x7d, 0xab, 0xf7, 0x9e, 0x9e, 0x7d, 0xef, 0x9e, 0xde,
  0xf7, 0xe5, 0xbf, 0xbc, 0x1f, 0x30, 0xe7, 0xfd, 0x84, 0x17, 0x81, 0x85,
  0x04, 0x48, 0x50, 0x52, 0x66, 0x56, 0xdd, 0xbe, 0x73, 0xce, 0xeb, 0xdb,
  0x95, 0x16, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x40, 0x20, 0xb0,
  0x36, 0xbf, 0x73, 0xb2, 0x7d, 0xf6, 0xe6, 0xd9, 0xee, 0x5c, 0x3f, 0xb8,
  0x1e, 0xac, 0xaf, 0xe1, 0xbf, 0x73, 0x03, 0xd3, 0xe9, 0x19, 0x19, 0xcb,
  0xc9, 0xc0, 0xb7, 0x65, 0x76, 0xd6, 0xd7, 0xae, 0xad, 0xc0, 0x9c, 0x6b,
  0xf7, 0x4d, 0xcf, 0xb7, 0x02, 0x23, 0x73, 0x7e, 0xb6, 0x97, 0x5f, 0xc9,
  0xb0, 0xd4, 0x7e, 0x10, 0x0c, 0xf3, 0xd6, 0xd7, 0x23, 0xfb, 0xc6, 0xc8,
  0xbc, 0xce, 0x9f, 0x6f, 0xe6, 0xb7, 0xdd, 0xeb, 0xa1, 0x19, 0xd8, 0xad,
  0x81, 0x95, 0x99, 0x6b, 0xbb, 0x4e, 0x60, 0x39, 0x50, 0xe4, 0x60, 0xd7,
  0xb0, 0x3a, 0x3d, 0x4b, 0x6f, 0xf7, 0x3d, 0xf7, 0xda, 0x32, 0x4a, 0xbc,
  0xb4, 0x63, 0xc2, 0x57, 0xe6, 0xda, 0x6d, 0xd9, 0x03, 0x2b, 0x7f, 0x6b,
  0xb5, 0xf2, 0xe6, 0x70, 0x98, 0x6f, 0x9b, 0x43, 0x53, 0x2e, 0x7e, 0x6f,
  0xf9, 0x50, 0x22, 0xb0, 0x83, 0x81, 0xb5, 0x1e, 0x04, 0xf7, 0x9d, 0xb9,
  0xfc, 0xdc, 0x99, 0xe5, 0x5d, 0xdb, 0x8e, 0x39, 0x58, 0x5b, 0xa2, 0xc9,
  0x6b, 0x03, 0xdb, 0x79, 0x3f, 0xe7, 0x59, 0x03, 0x23, 0x63, 0x43, 0xb9,
  0xcc, 0x5c, 0x70, 0x3f, 0x04, 0xd4, 0xf6, 0xb5, 0xd9, 0xb3, 0x96, 0x86,
  0x4e, 0x2f, 0x33, 0xd7, 0xf7, 0xac, 0xae, 0x91, 0xe9, 0x98, 0x81, 0xd9,
  0x08, 0x53, 0x9b, 0x2d, 0xd3, 0xb7, 0xea, 0x55, 0xdd, 0x7e, 0xb9, 0x75,
  0x72, 0x7a, 0x5b, 0xfc, 0x72, 0xbf, 0xe7, 0x6e, 0xc2, 0xff, 0x1d, 0xbf,
  0x38, 0xef, 0xef, 0x9e, 0xf7, 0xe0, 0xd7, 0x36, 0x7e, 0x6e, 0xb6, 0xb7,
  0x37, 0xdf, 0x90, 0x1f, 0xb7, 0x5e, 0xd1, 0xc6, 0xbf, 0xfb, 0xaf, 0x4f,
  0xf7, 0x5e, 0x3d, 0x39, 0x3d, 0x6b, 0x95, 0xdf, 0x16, 0x3b, 0xe5, 0xbd,
  0xfb, 0xb7, 0xcf, 0xb7, 0xb6, 0xde, 0xee, 0xaf, 0xda, 0x6f, 0x5f, 0x6c,
  0x3d, 0x6d, 0xbd, 0xda, 0x73, 0xde, 0xbe, 0x7c, 0x3a, 0x78, 0xf3, 0xea,
  0xb4, 0xd6, 0x6e, 0x0f, 0x06, 0xcf, 0xb0, 0x40, 0xf1, 0x6e, 0xf8, 0x72,
  0xaf, 0x5f, 0x7c, 0xb5, 0x5b, 0x3a, 0x3a, 0xb9, 0x3e, 0xbe, 0x69, 0xbd,
  0xa8, 0xf5, 0x29, 0x7c, 0xad, 0xda, 0x7a, 0xbd, 0x49, 0xff, 0x6f, 0xe7,
  0x76, 0xc9, 0x7a, 0xb2, 0xd5, 0x7f, 0x53, 0x0e, 0x06, 0x9d, 0xed, 0x2d,
  0xfb, 0xed, 0xab, 0xce, 0xb0, 0xf5, 0xae, 0x68, 0x2f, 0x2f, 0x8f, 0x96,
  0x0e, 0xec, 0xad, 0xe1, 0xdb, 0x9d, 0xa2, 0xfd, 0xf2, 0xc3, 0xcb, 0xe3,
  0xa3, 0xdd, 0xd2, 0xed, 0xf3, 0xf2, 0x4b, 0xd7, 0x3c, 0xef, 0xd7, 0xdb,
  0xd7, 0x2f, 0xcf, 0xac, 0xf7, 0xb5, 0xf3, 0x37, 0x95, 0xa1, 0xf7, 0xe6,
  0xc3, 0xe0, 0xfd, 0xc1, 0xbb, 0x95, 0xdc, 0xc1, 0xce, 0x5d, 0xf5, 0xc4,
  0xe9, 0x07, 0xed, 0xfd, 0xd2, 0xa0, 0xb3, 0xbf, 0xdb, 0xb3, 0xf6, 0x4b,
  0x7e, 0xcb, 0x39, 0xaa, 0x5b, 0x50, 0x1e, 0x68, 0xba, 0x79, 0x73, 0x7d,
  0x5e, 0xc7, 0xef, 0xd6, 0xab, 0x97, 0xc5, 0x37, 0x2f, 0x56, 0xec, 0x83,
  0x27, 0xbd, 0x3a, 0xc0, 0xdc, 0x76, 0xf6, 0xfd, 0xd5, 0x83, 0xf7, 0x7b,
  0xef, 0x5b, 0xe5, 0xa7, 0x83, 0x83, 0xbd, 0xfe, 0xf1, 0xf9, 0xf6, 0xd6,
  0x4e, 0xab, 0x02, 0xbf, 0x77, 0xce, 0x47, 0xc7, 0x76, 0xe9, 0xdd, 0xd1,
  0xce, 0x9b, 0xca, 0xc1, 0x4e, 0xbb, 0x76, 0xf8, 0x6e, 0xb7, 0x74, 0xfc,
  0xa1, 0x5d, 0x3c, 0xbe, 0xbf, 0xed, 0x1d, 0xbd, 0xdb, 0xbc, 0x3b, 0x7e,
  0xb1, 0x72, 0x7b, 0x74, 0xbf, 0xf2, 0xe1, 0x68, 0xbb, 0x78, 0x7f, 0xf4,
  0xc1, 0x2d, 0x1e, 0xed, 0xc0, 0x7f, 0xf6, 0x66, 0xef, 0x60, 0x9b, 0xfd,
  0xf7, 0xae, 0xda, 0x7b, 0xf6, 0xe4, 0xe9, 0xfb, 0xb7, 0xef, 0x86, 0x2f,
  0x4e, 0x77, 0xdf, 0x84, 0xf4, 0xb4, 0xaf, 0x4f, 0xaf, 0x9f, 0xbd, 0x78,
  0xea, 0x76, 0x9e, 0x9c, 0xde, 0x9e, 0xd8, 0x2b, 0x37, 0x9d, 0x4a, 0xa7,
  0x72, 0xe8, 0xb4, 0x3f, 0x1c, 0x5e, 0xaf, 0xde, 0xbf, 0xbd, 0x5f, 0xb9,
  0x3b, 0x39, 0x7b, 0x5f, 0x3b, 0xfc, 0xb0, 0x79, 0x7f, 0xf8, 0xe1, 0xe0,
  0xfe, 0xf0, 0x35, 0x94, 0xb7, 0x4b, 0x1f, 0xac, 0x57, 0xb5, 0xe2, 0x9b,
  0xd7, 0xbd, 0x00, 0xca, 0xbf, 0x13, 0xf0, 0xee, 0xbe, 0x7d, 0x7d, 0xfc,
  0xae, 0x7d, 0x3d, 0x80, 0x36, 0x0c, 0x6e, 0x5a, 0xf6, 0xd6, 0xfd, 0xdb,
  0xfd, 0x37, 0xf5, 0x37, 0xaf, 0x9e, 0xde, 0x74, 0x5e, 0x3f, 0x5f, 0x3d,
  0xb0, 0x0f, 0x22, 0x1e, 0x40, 0x3b, 0xcf, 0xce, 0x8b, 0xab, 0x07, 0xd7,
  0xfd, 0x62, 0xe7, 0xc9, 0x66, 0xfd, 0xf0, 0x7e, 0x75, 0xd4, 0xbe, 0x0f,
  0xfb, 0xe2, 0x5d, 0xab, 0x5c, 0xbc, 0xb1, 0xf6, 0xf7, 0x6e, 0x0f, 0x3f,
  0xec, 0x8e, 0x8e, 0xb6, 0x57, 0x83, 0x16, 0xe1, 0x4f, 0x3f, 0x68, 0xed,
  0xd7, 0x3e, 0x9c, 0x38, 0xc7, 0xc5, 0xf3, 0xeb, 0x97, 0x12, 0xcd, 0x80,
  0x73, 0xc4, 0x78, 0x3a, 0x7a, 0x53, 0x5e, 0x0d, 0x0e, 0x2b, 0xfd, 0x7e,
  0x7b, 0x7b, 0xe5, 0xee, 0xf0, 0xdd, 0xe6, 0x4d, 0xbb, 0x04, 0xfd, 0xbf,
  0x7f, 0x7e, 0x03, 0x65, 0x3e, 0xb4, 0x2a, 0x2f, 0xef, 0xdf, 0x94, 0x5f,
  0xbe, 0x78, 0xfb, 0xea, 0xcd, 0x3b, 0xe8, 0xcb, 0x6a, 0xeb, 0xd5, 0xdd,
  0xa8, 0xfd, 0x61, 0x88, 0x7d, 0x3f, 0x23, 0x2d, 0x94, 0x8e, 0x36, 0xb0,
  0xfe, 0xe4, 0x3d, 0xd4, 0x57, 0x79, 0x19, 0xbc, 0x05, 0x5e, 0xbc, 0x38,
  0x87, 0xf6, 0x61, 0x5f, 0x6f, 0xd7, 0xde, 0x9b, 0xaf, 0x9e, 0xd7, 0x4f,
  0xce, 0x7a, 0xf7, 0xa7, 0xef, 0xa0, 0xe6, 0x77, 0x9b, 0x95, 0xa3, 0xb3,
  0xb7, 0xbb, 0x47, 0x67, 0x7b, 0x7b, 0xc7, 0xef, 0x7a, 0xe5, 0xa3, 0xe2,
  0xf1, 0xf6, 0xc9, 0xee, 0x9b, 0xca, 0xe9, 0xbb, 0xa7, 0x5b, 0x47, 0xf0,
  0xf7, 0xb8, 0xb8, 0x2b, 0xe0, 0x1b, 0x8c, 0xda, 0x95, 0xd3, 0x7e, 0xeb,
  0xfa, 0x78, 0x20, 0xe0, 0x1b, 0x4a, 0xf8, 0x40, 0xc2, 0x66, 0xc2, 0xb7,
  0x33, 0xdc, 0x01, 0x99, 0xec, 0x77, 0xf6, 0x57, 0xef, 0x5f, 0xee, 0xaf,
  0xde, 0xb4, 0x40, 0xe6, 0x9e, 0x53, 0xfe, 0xf4, 0xce, 0xf7, 0xfb, 0x37,
  0x90, 0xfe, 0xc1, 0xdc, 0x5f, 0xbd, 0x3d, 0xd8, 0x3d, 0xde, 0x39, 0xd8,
  0x39, 0xb8, 0x3d, 0x3a, 0x3b, 0xef, 0x7d, 0xb9, 0x5b, 0x02, 0x99, 0x1f,
  0x8c, 0x48, 0xde, 0xf6, 0x7b, 0xfb, 0x99, 0xbd, 0xb9, 0xc2, 0xfa, 0xa9,
  0x7e, 0xba, 0xff, 0xf2, 0xde, 0x7c, 0xfd, 0x76, 0xf0, 0x76, 0xf7, 0xed,
  0x3d, 0xf0, 0xa3, 0x07, 0x74, 0x22, 0x0f, 0xeb, 0xe6, 0xab, 0xda, 0x87,
  0xce, 0xfe, 0x1e, 0xf0, 0xfc, 0xe5, 0xd3, 0x53, 0x41, 0xae, 0x81, 0x77,
  0xef, 0x90, 0xee, 0xb6, 0x50, 0xd7, 0xc9, 0xbb, 0xf3, 0xca, 0x9b, 0xeb,
  0xe7, 0x77, 0xc7, 0xef, 0xfa, 0xef, 0x0e, 0x5f, 0x1d, 0xd4, 0xde, 0xee,
  0xb4, 0x83, 0xa3, 0xb3, 0xdd, 0xca, 0xc9, 0x8b, 0x52, 0xff, 0xa8, 0x7c,
  0x3a, 0x38, 0x7c, 0xf5, 0xf6, 0xfa, 0xf8, 0xdd, 0xf3, 0xfb, 0x37, 0x67,
  0x47, 0xd5, 0xe3, 0xb3, 0xa7, 0xd7, 0x47, 0xdb, 0x07, 0x61, 0x3d, 0x88,
  0xaf, 0xf3, 0xaa, 0x34, 0x68, 0x39, 0xa7, 0xdf, 0x45, 0x3d, 0x37, 0xd8,
  0xd6, 0xc3, 0x8a, 0x42, 0x86, 0x51, 0xb6, 0xb7, 0x57, 0x89, 0x1c, 0x9f,
  0xbf, 0x3f, 0xdd, 0xa7, 0x70, 0x74, 0x9c, 0x92, 0x71, 0x7b, 0x06, 0xf9,
  0x3b, 0xab, 0xd5, 0xf6, 0xfe, 0xde, 0x3b, 0xb3, 0xfc, 0xb2, 0x78, 0xb0,
  0xff, 0x72, 0x84, 0xfa, 0xa1, 0x6d, 0x1f, 0x2c, 0x3d, 0xeb, 0xfb, 0xbe,
  0x7f, 0x84, 0xfa, 0xea, 0x70, 0xe7, 0xc5, 0xf9, 0xe9, 0xd6, 0xcb, 0x27,
  0xef, 0xcc, 0xbb, 0x3d, 0x73, 0xf5, 0xdd, 0xdd, 0xd3, 0xad, 0xbd, 0x27,
  0x2b, 0x1f, 0x76, 0x8e, 0x3a, 0xdb, 0x6f, 0xbc, 0xfe, 0xc1, 0xe6, 0x70,
  0x08, 0x63, 0xd3, 0xdc, 0xaf, 0x6d, 0xd7, 0x4e, 0x9f, 0xe7, 0x3e, 0x9c,
  0x94, 0xf7, 0x83, 0xfb, 0x5a, 0x6f, 0xd8, 0x7a, 0x53, 0xfe, 0xd2, 0x6f,
  0x9d, 0xdc, 0x8f, 0x4a, 0x47, 0xde, 0xfe, 0xfe, 0x6e, 0xf0, 0x6e, 0x69,
  0x73, 0xd5, 0x0f, 0x0e, 0x9f, 0xbd, 0xf6, 0xeb, 0xdb, 0xef, 0x9e, 0xd6,
  0xf6, 0xdf, 0x1c, 0xec, 0xd5, 0x37, 0x77, 0x6b, 0x07, 0x3b, 0x5b, 0x4f,
  0xde, 0x5e, 0x77, 0xf7, 0x57, 0xcb, 0x7b, 0xd5, 0xb7, 0x1f, 0x6e, 0x9e,
  0x6f, 0x3a, 0xf7, 0xf7, 0x27, 0xcb, 0x27, 0x2b, 0x1f, 0x5e, 0xe7, 0x96,
  0x2b, 0xdd, 0x5c, 0xad, 0x77, 0xda, 0xa9, 0xb4, 0x6e, 0x6e, 0x5e, 0xf4,
  0xba, 0xdd, 0xe3, 0xea, 0xd2, 0x60, 0xb5, 0xba, 0xf2, 0xa6, 0xb7, 0xf9,
  0x62, 0xaf, 0xff, 0x7c, 0xd5, 0x7c, 0xd5, 0xff, 0xfa, 0xa8, 0x9e, 0x1b,
  0xbe, 0xe9, 0x7a, 0x2f, 0xdf, 0xed, 0xd4, 0x5e, 0x3d, 0x59, 0x3d, 0xfe,
  0x72, 0xa5, 0xbb, 0x7c, 0xb7, 0x62, 0xb5, 0x8e, 0x9d, 0x97, 0xc1, 0xcd,
  0xab, 0xed, 0x7a, 0x6b, 0xe9, 0xd4, 0x7c, 0x76, 0x07, 0x3a, 0xe5, 0xce,
  0xbf, 0xbb, 0x6e, 0x6d, 0xd5, 0x06, 0x07, 0xdd, 0x63, 0xff, 0x60, 0xe7,
  0xa8, 0xd7, 0xf3, 0x2c, 0xeb, 0xc3, 0xd7, 0xfb, 0x25, 0x77, 0x75, 0xff,
  0x60, 0xff, 0xdd, 0xca, 0x6e, 0xb5, 0xf6, 0x61, 0xef, 0xf8, 0xc3, 0x9b,
  0x9e, 0x73, 0x5e, 0xdd, 0xa9, 0xdd, 0xdd, 0x9f, 0x9f, 0xbf, 0xdf, 0xea,
  0x0d, 0x86, 0x7b, 0x9b, 0x5f, 0x76, 0x7b, 0xaf, 0xcc, 0x5a, 0x6f, 0xef,
  0xcd, 0xca, 0xaa, 0x77, 0xfc, 0xf2, 0xa6, 0xf7, 0xf4, 0xe9, 0x51, 0xef,
  0xc5, 0xd6, 0xfb, 0xe1, 0xbb, 0xf6, 0x4b, 0xfb, 0xe0, 0xe0, 0xc5, 0x66,
  0xf5, 0xf5, 0xe6, 0x41, 0x75, 0x69, 0xf7, 0xcd, 0xfb, 0xad, 0xd7, 0x67,
  0x9d, 0xfb, 0x37, 0xcf, 0x57, 0x0f, 0x4f, 0xce, 0xcf, 0x57, 0xfd, 0xdb,
  0xe5, 0xd6, 0xf5, 0x7e, 0x79, 0xf0, 0x75, 0xef, 0xd9, 0xed, 0xed, 0xe6,
  0x97, 0x2f, 0x5e, 0xae, 0xee, 0x2c, 0x3d, 0xab, 0x2d, 0xed, 0x97, 0xdb,
  0xfe, 0x71, 0xe0, 0x1e, 0x3f, 0x5d, 0x2e, 0xe5, 0x2a, 0xe5, 0x27, 0x7b,
  0xef, 0xbe, 0x3e, 0xf1, 0x3f, 0xdc, 0x3f, 0x7f, 0xbf, 0xf3, 0x66, 0xf5,
  0xee, 0xb0, 0xe5, 0xbd, 0x7b, 0xbf, 0xeb, 0x7a, 0x2f, 0xac, 0xdc, 0xed,
  0x9b, 0xfd, 0x76, 0x7d, 0xd9, 0x5d, 0x2e, 0xbf, 0xfa, 0x50, 0xee, 0xbc,
  0xf8, 0xfa, 0x65, 0x2e, 0x78, 0xe7, 0xad, 0x5a, 0x55, 0xdb, 0xde, 0xec,
  0x76, 0x5a, 0x4e, 0xf7, 0x30, 0xb7, 0x5f, 0xdd, 0x2a, 0x15, 0x6f, 0x83,
  0x9d, 0x97, 0x4b, 0xce, 0xd6, 0x8b, 0x37, 0x9b, 0xc7, 0xb5, 0x93, 0x62,
  0xad, 0x62, 0xd9, 0x37, 0x2f, 0xbf, 0x0e, 0x6e, 0xbe, 0x2e, 0x9d, 0x7f,
  0xe9, 0x2d, 0x9d, 0xee, 0x98, 0x2f, 0xb7, 0xdd, 0xee, 0xf6, 0x3d, 0xfc,
  0xbb, 0xea, 0xf6, 0x5e, 0xef, 0x16, 0xbf, 0x3e, 0x78, 0x01, 0xdd, 0xe4,
  0x3f, 0xad, 0xec, 0x0f, 0xb6, 0x3f, 0x7c, 0xd8, 0x7f, 0xff, 0xfc, 0x49,
  0xfb, 0x64, 0xb7, 0x77, 0xb6, 0xe2, 0x94, 0xef, 0x5e, 0x1d, 0xde, 0x77,
  0xef, 0x73, 0xaf, 0xad, 0x9d, 0x5b, 0x73, 0xe7, 0xcb, 0xe5, 0x97, 0xe6,
  0xf2, 0xeb, 0xeb, 0xe5, 0xca, 0xeb, 0xea, 0x9b, 0xf3, 0x27, 0xa6, 0x79,
  0xda, 0x3d, 0xba, 0x6d, 0xb7, 0x0e, 0x9e, 0x75, 0xce, 0x8e, 0xb7, 0xf6,
  0x5f, 0x6d, 0xbd, 0xb8, 0x7d, 0xff, 0xac, 0xb2, 0x7b, 0xdb, 0xf1, 0x56,
  0x5f, 0x7b, 0xab, 0x7b, 0xed, 0xd6, 0xe6, 0xf9, 0xed, 0xf0, 0x60, 0xfb,
  0xfd, 0xfd, 0x97, 0x9b, 0xaf, 0x47, 0x67, 0xa7, 0x9d, 0xf7, 0x07, 0x9b,
  0x77, 0x4f, 0xaa, 0xcf, 0xcf, 0xfa, 0x27, 0xbb, 0x4e, 0xbd, 0xf4, 0xaa,
  0xfc, 0xe6, 0xc5, 0x97, 0xde, 0x68, 0xf3, 0xe5, 0xd0, 0x7a, 0x6a, 0x9f,
  0x3f, 0xb7, 0xdf, 0x9c, 0x3e, 0x7f, 0xf7, 0xf5, 0x93, 0x83, 0xeb, 0xf7,
  0xab, 0xce, 0xce, 0xbb, 0x1d, 0x18, 0x9e, 0xef, 0x9c, 0x93, 0x5c, 0x67,
  0x79, 0xd8, 0x39, 0xae, 0xf5, 0x5f, 0x9f, 0xdc, 0x9e, 0x8e, 0xf6, 0x5f,
  0x77, 0xde, 0x9c, 0xf6, 0x7a, 0x9b, 0xc7, 0x07, 0x9d, 0xa3, 0x55, 0xff,
  0xbe, 0x1c, 0x9c, 0x59, 0xfb, 0xcf, 0xfc, 0xd1, 0xf1, 0xf0, 0xe6, 0xf8,
  0xe9, 0x6d, 0xef, 0xfd, 0xe9, 0xcb, 0xf3, 0xa3, 0xe1, 0x9b, 0x67, 0x9d,
  0x97, 0xb5, 0xce, 0xd3, 0xf3, 0x53, 0xff, 0xe0, 0xed, 0xdb, 0xd5, 0x57,
  0x5b, 0xbb, 0x5b, 0x75, 0xf3, 0xb4, 0xff, 0xe5, 0x7b, 0xcb, 0x7a, 0xf5,
  0xe2, 0x83, 0x5d, 0x7e, 0xb7, 0xfa, 0xfe, 0xee, 0xfd, 0xca, 0xcd, 0xe1,
  0xde, 0xd7, 0xfe, 0xe6, 0xd6, 0xde, 0xfb, 0x9b, 0xc1, 0xab, 0x17, 0x6f,
  0xfa, 0xee, 0xd7, 0x1d, 0xc7, 0xae, 0x7f, 0x78, 0x53, 0xee, 0x9c, 0x76,
  0x9f, 0x3c, 0xed, 0xbe, 0x71, 0x77, 0xbd, 0x9b, 0xbb, 0xad, 0xbd, 0xc3,
  0x56, 0xcd, 0x82, 0xd9, 0xf4, 0x7c, 0x67, 0x6f, 0xf0, 0x66, 0xfb, 0x76,
  0x67, 0x78, 0xb4, 0xb2, 0x7d, 0x5e, 0x1c, 0xee, 0xee, 0xb8, 0x9b, 0x3b,
  0xe7, 0xfb, 0x4f, 0x56, 0xdf, 0x6c, 0x77, 0x57, 0x3a, 0xbd, 0x2f, 0x47,
  0xcf, 0x5f, 0x9c, 0x9a, 0xbd, 0xd7, 0xae, 0xbb, 0x74, 0xd8, 0x2b, 0xee,
  0x98, 0x95, 0xed, 0xad, 0x97, 0xb7, 0xd7, 0x40, 0xdd, 0xd6, 0x97, 0x5b,
  0x37, 0xd5, 0xfa, 0x5e, 0xf7, 0xc9, 0xf1, 0xc1, 0xa0, 0x9d, 0xdb, 0x7a,
  0xb3, 0xf7, 0xf6, 0xf9, 0x13, 0xab, 0x78, 0xbf, 0xe5, 0x3c, 0x7f, 0xd6,
  0x3b, 0x2e, 0x3e, 0xd9, 0x0b, 0x5e, 0xae, 0x3c, 0x59, 0x79, 0x79, 0xfd,
  0xfa, 0xbd, 0xbb, 0xb2, 0xb9, 0xd5, 0xdb, 0x3d, 0x71, 0x4b, 0xa3, 0x83,
  0x9d, 0xb7, 0x47, 0xad, 0xed, 0x57, 0x9b, 0x87, 0xa7, 0xf6, 0xf3, 0xcd,
  0xd3, 0xa5, 0xde, 0xfb, 0x9b, 0xe1, 0xd7, 0xfe, 0x79, 0xee, 0xb4, 0x3d,
  0xa8, 0xf6, 0x5e, 0xad, 0x7e, 0x38, 0xad, 0x3f, 0x3d, 0xdc, 0x7e, 0xfd,
  0xfa, 0x79, 0xed, 0xf5, 0xd9, 0xcb, 0xcd, 0x2f, 0x4f, 0x97, 0xfc, 0xaf,
  0x0f, 0x6e, 0xf6, 0x4f, 0x76, 0x06, 0x2b, 0xab, 0x5b, 0xce, 0xd3, 0xee,
  0xe1, 0x93, 0xf6, 0xe9, 0xd3, 0xe3, 0xb6, 0xf5, 0xac, 0x1e, 0x3c, 0x5f,
  0xed, 0xee, 0x78, 0xd5, 0xdc, 0xe9, 0xf5, 0xe9, 0x93, 0xeb, 0xcd, 0xf3,
  0xaf, 0x5d, 0xfb, 0x70, 0xf7, 0xfd, 0x89, 0x73, 0x54, 0xba, 0x69, 0x95,
  0x87, 0x1f, 0x56, 0xb6, 0x77, 0x36, 0xb7, 0xcf, 0x8f, 0x7a, 0xed, 0x27,
  0xbb, 0x95, 0x97, 0x47, 0x5f, 0x13, 0x83, 0x60, 0xeb, 0xe9, 0xe9, 0x79,
  0x6d, 0xd7, 0x7b, 0xff, 0xb4, 0xd7, 0xeb, 0x19, 0x46, 0x66, 0x69, 0x7d,
  0xcd, 0x0f, 0xee, 0x07, 0x16, 0x33, 0x6d, 0x02, 0xeb, 0x2e, 0x58, 0x6a,
  0xfb, 0x60, 0x19, 0x15, 0xee, 0x02, 0xb0, 0x86, 0x1e, 0xda, 0x23, 0xcf,
  0x77, 0xbd, 0x06, 0xa6, 0x37, 0x87, 0xae, 0x6f, 0x07, 0xb6, 0xeb, 0x34,
  0xc0, 0x22, 0x02, 0x6b, 0xec, 0xc6, 0x6a, 0x8e, 0x7c, 0xcb, 0xcb, 0xfb,
  0xd6, 0xc0, 0x6a, 0x07, 0x0d, 0xc7, 0x75, 0xac, 0x66, 0xfe, 0xda, 0xcf,
  0x27, 0x13, 0xc1, 0x08, 0x7b, 0x6f, 0x07, 0x89, 0x8c, 0x31, 0xad, 0xa3,
  0xd0, 0x75, 0xdb, 0x23, 0x5f, 0xa7, 0x1f, 0x0d, 0xf2, 0xf1, 0xe0, 0x8e,
  0x02, 0xb0, 0xbd, 0x2c, 0x11, 0x6c, 0x8e, 0xfe, 0xc9, 0xf7, 0xad, 0xc1,
  0xd0, 0xf2, 0xfc, 0x87, 0x90, 0x1a, 0xb3, 0xe5, 0xbb, 0x83, 0x51, 0x60,
  0x35, 0x03, 0x77, 0xd8, 0x28, 0x36, 0x3f, 0xe4, 0x6d, 0xa7, 0x63, 0xdd,
  0x35, 0x6a, 0xca, 0x72, 0x79, 0x6c, 0x89, 0xe9, 0x59, 0xe6, 0x43, 0xcb,
  0xf5, 0x3a, 0x96, 0x07, 0x05, 0xfa, 0x96, 0xdd, 0xeb, 0x07, 0xf0, 0x63,
  0x60, 0x75, 0x83, 0x46, 0x7e, 0x15, 0xfe, 0xcf, 0xba, 0x6e, 0x5e, 0x9b,
  0x5e, 0xcf, 0x76, 0x20, 0xd5, 0x1d, 0x9a, 0x6d, 0x3b, 0xb8, 0xc7, 0x5f,
  0x37, 0x96, 0xd7, 0x1d, 0xb8, 0xb7, 0x8d, 0xbe, 0xdd, 0xe9, 0x58, 0x4e,
  0x73, 0x68, 0x76, 0x3a, 0xb6, 0xd3, 0x83, 0x9c, 0x24, 0x2d, 0x9e, 0xe5,
  0xdb, 0x1f, 0x28, 0xfd, 0x8c, 0xae, 0xdb, 0xbe, 0x1d, 0x58, 0x79, 0x1f,
  0xb0, 0x61, 0xf2, 0xad, 0x67, 0x0e, 0x9b, 0xb7, 0x76, 0x27, 0xe8, 0x0b,
  0x24, 0xe7, 0x23, 0x9a, 0xdb, 0x60, 0xf1, 0x32, 0xa4, 0xf9, 0x1b, 0xdb,
  0xba, 0x7d, 0x68, 0x99, 0xed, 0xf7, 0x3d, 0xcf, 0x1d, 0x39, 0x9d, 0xc6,
  0xf7, 0x8a, 0xc5, 0x62, 0xb3, 0xed, 0x0e, 0xa0, 0x5f, 0xbe, 0xd7, 0xed,
  0x76, 0x9b, 0x1d, 0xdb, 0x1f, 0x0e, 0xcc, 0x7b, 0x5a, 0x59, 0x92, 0x14,
  0x45, 0xc5, 0xbc, 0xc2, 0x52, 0x6a, 0x7d, 0x05, 0xb3, 0x8d, 0x3d, 0xfc,
  0xc0, 0x71, 0xb7, 0x06, 0x6e, 0xfb, 0x7d, 0x8c, 0xa3, 0x08, 0x37, 0x74,
  0xbd, 0x40, 0xa0, 0x2d, 0xcf, 0xc8, 0x42, 0x0a, 0x5b, 0x6e, 0x10, 0xb8,
  0xd7, 0xd0, 0x3c, 0x26, 0x43, 0x1d, 0xab, 0x6b, 0x8e, 0x06, 0x01, 0x65,
  0x73, 0xc4, 0xcd, 0xfc, 0x7d, 0xc3, 0x6f, 0x7b, 0xee, 0x60, 0xa0, 0xe2,
  0x22, 0xeb, 0x19, 0xc2, 0xc1, 0x58, 0xed, 0x50, 0xc8, 0xb2, 0x9c, 0x87,
  0x84, 0x50, 0x2a, 0xc1, 0xe6, 0xda, 0xa6, 0x73, 0x63, 0xfa, 0x0f, 0xac,
  0xee, 0x14, 0xd9, 0x49, 0x16, 0x05, 0xb2, 0xf2, 0x44, 0x5a, 0x6e, 0x6c,
  0xdf, 0x86, 0x05, 0x05, 0x0a, 0x02, 0xed, 0x7d, 0x06, 0x9b, 0xc7, 0x15,
  0x4c, 0xfe, 0xda, 0x32, 0xfd, 0x91, 0x67, 0xe5, 0x41, 0xb6, 0xaf, 0x61,
  0x71, 0x11, 0x72, 0xcd, 0x76, 0x50, 0x8a, 0xf3, 0x84, 0x79, 0xb2, 0x78,
  0x91, 0x74, 0x26, 0x79, 0x8e, 0xeb, 0x5d, 0x9b, 0xaa, 0xe6, 0x53, 0xc1,
  0x49, 0xab, 0xba, 0x60, 0x39, 0xb8, 0xa4, 0xc9, 0x5f, 0xbb, 0x30, 0xb0,
  0xf2, 0xd6, 0x0d, 0x54, 0xec, 0x3f, 0xc8, 0xbc, 0x8e, 0x35, 0x88, 0x66,
  0xe6, 0x87, 0xae, 0x0d, 0x6b, 0x20, 0x8f, 0x8d, 0x38, 0x65, 0x1e, 0xc7,
  0xc3, 0x3e, 0x79, 0x8d, 0xd0, 0xbb, 0xa3, 0x6b, 0x87, 0x8d, 0x61, 0x3a,
  0x6e, 0x39, 0x24, 0xf0, 0xca, 0xf7, 0xfb, 0xa6, 0xed, 0xc5, 0xea, 0x34,
  0xdb, 0x6d, 0xcb, 0x0f, 0x1b, 0xe0, 0xb8, 0x41, 0xb6, 0xd0, 0xb1, 0x5a,
  0xa3, 0x9e, 0xa6, 0xcb, 0x70, 0xd7, 0x00, 0x05, 0x0b, 0xa8, 0x87, 0x48,
  0x6a, 0x88, 0x24, 0x05, 0x9e, 0xe9, 0x80, 0xe8, 0x7a, 0xd0, 0xb8, 0x66,
  0xd8, 0x79, 0x84, 0x26, 0xd6, 0xe2, 0x34, 0xa9, 0x97, 0x44, 0x27, 0x12,
  0xf8, 0x78, 0x1f, 0x4b, 0xe4, 0xe5, 0x03, 0x90, 0x15, 0x91, 0xc6, 0xb9,
  0x46, 0x83, 0xb6, 0x15, 0x50, 0x3f, 0x24, 0x08, 0x9a, 0x8a, 0xea, 0x41,
  0xd4, 0x78, 0x44, 0x85, 0x8a, 0x63, 0x71, 0xe8, 0x45, 0xb2, 0x3a, 0x00,
  0xc1, 0xcd, 0x7b, 0x56, 0x0f, 0xeb, 0x61, 0x52, 0x51, 0x1a, 0xde, 0x09,
  0x22, 0x03, 0x1f, 0x09, 0xf5, 0x93, 0x1c, 0xe9, 0x44, 0x9f, 0x40, 0x41,
  0x2e, 0x9c, 0x1d, 0xfb, 0xfa, 0x81, 0xeb, 0xaf, 0xd2, 0xbc, 0x7d, 0x8d,
  0xa3, 0xd5, 0x0c, 0x09, 0xcf, 0xc3, 0x80, 0xb5, 0x3c, 0x22, 0x89, 0xa5,
  0x07, 0x24, 0x2f, 0xdf, 0xb1, 0xda, 0xae, 0x67, 0x12, 0xa4, 0x61, 0x5e,
  0x12, 0xb8, 0x9c, 0x00, 0xee, 0xb8, 0x23, 0x90, 0xc4, 0xb9, 0x09, 0x65,
  0x2a, 0x89, 0x32, 0xb7, 0xe6, 0xcd, 0xfd, 0xa4, 0x12, 0x55, 0x45, 0x2d,
  0x41, 0x60, 0x75, 0x26, 0x95, 0xa9, 0x25, 0xcb, 0x98, 0x7e, 0x5f, 0x55,
  0x06, 0x99, 0x89, 0xdf, 0x89, 0x02, 0x3c, 0x23, 0x0e, 0x38, 0x03, 0xcb,
  0x38, 0x68, 0x7a, 0x6d, 0x33, 0xb0, 0x32, 0x44, 0x92, 0xc6, 0xd3, 0x54,
  0x5c, 0x49, 0x16, 0x87, 0xb8, 0xd4, 0xbc, 0x4e, 0xc5, 0x94, 0x64, 0xbd,
  0x40, 0x95, 0xba, 0x0f, 0x52, 0x71, 0x25, 0xbb, 0x24, 0xc2, 0x95, 0xd2,
  0x37, 0x7e, 0xe0, 0xd9, 0xef, 0xad, 0xa0, 0x0f, 0x33, 0x4a, 0xaf, 0x9f,
  0x28, 0x4e, 0xb0, 0xb2, 0xcc, 0xb0, 0x04, 0x55, 0xf2, 0x5c, 0xea, 0x43,
  0xe0, 0x3c, 0xee, 0xf6, 0x98, 0x50, 0xc0, 0x4b, 0xe6, 0x29, 0x0c, 0x08,
  0xae, 0x25, 0xea, 0x9f, 0x83, 0x37, 0x09, 0x0c, 0x2a, 0x28, 0x0f, 0xb3,
  0x01, 0x68, 0x55, 0x5e, 0xc1, 0xf2, 0x38, 0x09, 0x85, 0x6c, 0xc1, 0x19,
  0x35, 0xef, 0x8d, 0x06, 0x00, 0xfa, 0x39, 0x5a, 0x6e, 0x45, 0x81, 0x1e,
  0x20, 0x92, 0x73, 0x65, 0x58, 0xa2, 0x3c, 0x2e, 0x5c, 0xbb, 0x1d, 0x73,
  0xf0, 0x60, 0x0e, 0xec, 0x9e, 0x93, 0x07, 0x25, 0x75, 0xed, 0x37, 0xda,
  0x16, 0x52, 0x10, 0x9a, 0x17, 0xdd, 0x81, 0x35, 0x41, 0x09, 0x75, 0xed,
  0x3b, 0xab, 0x13, 0xe2, 0xab, 0x16, 0x19, 0x42, 0x9d, 0xfe, 0xc9, 0x47,
  0x26, 0x42, 0xa4, 0xe1, 0x99, 0x3e, 0x8f, 0x4d, 0xf2, 0x49, 0xf8, 0xb8,
  0x75, 0xe1, 0xf5, 0x5a, 0x66, 0x76, 0xb9, 0xaa, 0xd3, 0xff, 0x2f, 0xac,
  0x68, 0x49, 0xc6, 0x70, 0x34, 0x6c, 0xb7, 0xef, 0x81, 0x5b, 0x73, 0x73,
  0xe5, 0x22, 0x68, 0xd2, 0x6b, 0xf3, 0x8e, 0xcf, 0xbd, 0x6d, 0x73, 0xd0,
  0xce, 0x96, 0x8a, 0xc5, 0x9b, 0xfe, 0x5c, 0x7e, 0xae, 0x54, 0x87, 0x5c,
  0x2d, 0x6a, 0xa3, 0x39, 0x0a, 0x5c, 0x85, 0xd5, 0xcb, 0xd4, 0x6c, 0xb1,
  0xf8, 0xfd, 0x58, 0x35, 0x73, 0x85, 0x96, 0x7b, 0xa7, 0xb0, 0x86, 0xd0,
  0x48, 0x63, 0x3f, 0xab, 0x26, 0xfe, 0xaf, 0x29, 0x99, 0x55, 0xa1, 0x21,
  0x59, 0x2a, 0x94, 0x6b, 0x9e, 0x75, 0x1d, 0xc7, 0x8a, 0xfb, 0xa5, 0x20,
  0x11, 0xd4, 0x60, 0xcd, 0x33, 0xf6, 0x81, 0x96, 0x9f, 0x83, 0xb6, 0xda,
  0x9d, 0xb9, 0xef, 0x75, 0x3a, 0x9d, 0x66, 0x17, 0x60, 0xc1, 0xce, 0x26,
  0x6d, 0x5a, 0x06, 0xe3, 0x8b, 0x36, 0x38, 0x04, 0xc6, 0x56, 0xb3, 0x5a,
  0xa4, 0x34, 0x32, 0xb8, 0x48, 0x9f, 0xb3, 0xde, 0x4e, 0xb4, 0xa8, 0x8b,
  0xbb, 0xa8, 0xb6, 0x33, 0x1c, 0x05, 0x7c, 0x62, 0x2a, 0x14, 0x4b, 0x68,
  0xc0, 0x30, 0x2b, 0x4e, 0x30, 0xd4, 0x53, 0x2d, 0x18, 0xca, 0x30, 0x52,
  0x4e, 0x8d, 0xbf, 0x1d, 0x98, 0x2a, 0xc9, 0x53, 0x70, 0xb2, 0x86, 0xff,
  0x6b, 0x32, 0x56, 0xb0, 0xc4, 0x4e, 0x0b, 0xff, 0xc7, 0x13, 0x3d, 0xb3,
  0x63, 0x8f, 0xfc, 0x46, 0x05, 0x5a, 0x07, 0xbd, 0x91, 0x07, 0x9b, 0xa4,
  0x03, 0x5d, 0x49, 0xe8, 0x63, 0xf0, 0xf5, 0x72, 0xb1, 0x68, 0x59, 0x4d,
  0xd9, 0xc4, 0x69, 0xc6, 0x6c, 0x36, 0x22, 0xed, 0x84, 0xab, 0xc4, 0x90,
  0xc7, 0x26, 0x8b, 0x3c, 0xae, 0x15, 0xc3, 0x85, 0x43, 0x19, 0x7a, 0x0d,
  0x72, 0xdf, 0x8d, 0xfc, 0xc0, 0xee, 0xde, 0xf3, 0x96, 0x91, 0xe1, 0x02,
  0xaa, 0xcc, 0xf4, 0x02, 0xc9, 0xd8, 0x2b, 0x15, 0x6a, 0x31, 0xa6, 0xb1,
  0xce, 0x27, 0x92, 0x58, 0xa8, 0x2c, 0x03, 0x2e, 0x14, 0x45, 0x10, 0xc4,
  0x39, 0xac, 0x34, 0x29, 0x7e, 0x20, 0x9d, 0x81, 0x0d, 0xd0, 0xac, 0xdf,
  0x80, 0xc5, 0x0a, 0x13, 0x7f, 0xfc, 0x7f, 0x5e, 0x5b, 0x1d, 0xdb, 0x9c,
  0x1b, 0x7a, 0xd0, 0x3a, 0x9d, 0xe9, 0x31, 0xd3, 0xe9, 0xcc, 0x65, 0xaf,
  0x41, 0x2c, 0x68, 0x87, 0x2c, 0xd7, 0xc1, 0xac, 0xd0, 0x1e, 0xd2, 0x86,
  0x0a, 0x91, 0xfe, 0xb4, 0xa1, 0x52, 0x25, 0x23, 0x85, 0xe2, 0xa9, 0xe3,
  0xc7, 0x78, 0xdc, 0x72, 0x3b, 0xf7, 0x3a, 0xee, 0xf5, 0x87, 0x16, 0x0c,
  0x8c, 0x90, 0x68, 0x1d, 0x85, 0xf5, 0x8a, 0x19, 0x31, 0x4d, 0x32, 0xfe,
  0x5e, 0xc0, 0x76, 0xdf, 0x23, 0xe5, 0xaa, 0x44, 0x44, 0xe9, 0x8a, 0xd6,
  0x5e, 0x94, 0x06, 0x4c, 0x54, 0xa1, 0x98, 0x2b, 0xf0, 0xb4, 0x87, 0x58,
  0x33, 0xbe, 0x8f, 0x5c, 0x26, 0xad, 0xe0, 0xb8, 0x6a, 0xd0, 0x8a, 0xff,
  0x63, 0x69, 0xf1, 0x7b, 0x30, 0xae, 0x46, 0x5e, 0xdb, 0x3a, 0x32, 0x87,
  0x43, 0x48, 0x3e, 0x3f, 0x3d, 0x34, 0xe0, 0x57, 0xa1, 0xb4, 0x52, 0x6c,
  0x99, 0x2d, 0xcb, 0xb2, 0x56, 0x56, 0x8a, 0xed, 0x72, 0xbd, 0xdd, 0x2e,
  0xd6, 0xca, 0x05, 0x58, 0x2a, 0x17, 0xae, 0xcd, 0xe1, 0xe2, 0xd2, 0xda,
  0x12, 0x59, 0x46, 0xaf, 0xaf, 0x2d, 0xd1, 0xd3, 0x0d, 0x64, 0x06, 0x2c,
  0xad, 0xdb, 0x9e, 0x3d, 0x0c, 0xc4, 0xb5, 0xf5, 0x3b, 0x13, 0x96, 0x21,
  0x24, 0x35, 0xb3, 0x9e, 0xcd, 0x6a, 0xc6, 0xfa, 0xc3, 0x8d, 0xe9, 0xcd,
  0x59, 0xc6, 0xc3, 0x4a, 0xad, 0xdc, 0xb0, 0xd8, 0x67, 0xd0, 0x04, 0x9b,
  0xb1, 0xab, 0x07, 0x06, 0x02, 0x50, 0xa8, 0x0c, 0x98, 0x92, 0x73, 0x38,
  0x31, 0xb6, 0x83, 0x4c, 0x93, 0x15, 0x59, 0x2d, 0x56, 0x1a, 0x59, 0x4b,
  0x0f, 0x74, 0x1b, 0x21, 0x4e, 0x5a, 0xef, 0xd0, 0x28, 0x07, 0xcb, 0x1f,
  0xda, 0xfd, 0xcc, 0x73, 0x61, 0xb1, 0x1b, 0xdc, 0x67, 0x03, 0x3d, 0x73,
  0x75, 0x65, 0xf9, 0x47, 0x6e, 0x07, 0x66, 0x95, 0x8c, 0x0e, 0xe8, 0x07,
  0x23, 0xab, 0x31, 0x5f, 0x1c, 0x6b, 0x7a, 0x50, 0xd8, 0x32, 0x7d, 0xeb,
  0xd4, 0xc2, 0xe9, 0xf7, 0x10, 0xa7, 0x27, 0xe3, 0xc6, 0x05, 0x75, 0x82,
  0x96, 0xb7, 0xe3, 0x07, 0x73, 0xbe, 0x61, 0x67, 0xcb, 0xcb, 0x55, 0x4d,
  0xf7, 0xe0, 0x47, 0xbd, 0xbc, 0xac, 0xe9, 0x0e, 0xa6, 0x54, 0xe0, 0x87,
  0x0b, 0x3f, 0x56, 0xea, 0x45, 0x4d, 0x37, 0xe1, 0x47, 0x05, 0x61, 0xfa,
  0x98, 0xb5, 0x5a, 0xd7, 0xf4, 0x01, 0xa6, 0x54, 0x6b, 0x9a, 0xde, 0x46,
  0x98, 0xda, 0xaa, 0xa6, 0x77, 0x30, 0x65, 0x15, 0x7e, 0x5c, 0x91, 0x94,
  0x9a, 0xd6, 0x6c, 0x0f, 0x4c, 0xdf, 0x9f, 0x1b, 0xcd, 0x01, 0x3f, 0xa0,
  0x72, 0x7f, 0xae, 0x5d, 0xd8, 0x81, 0xb1, 0xe7, 0xfa, 0xb8, 0x9a, 0x79,
  0xe8, 0x59, 0x01, 0x5b, 0xac, 0x65, 0xb5, 0x07, 0xcf, 0x0a, 0x46, 0x9e,
  0x33, 0x17, 0xf4, 0x6d, 0xbf, 0x70, 0x45, 0x53, 0xc7, 0x14, 0xa0, 0xdd,
  0xb7, 0xb6, 0xd5, 0x50, 0xb0, 0x1e, 0xdb, 0x0c, 0xa0, 0x86, 0x8d, 0xc2,
  0x10, 0xd6, 0x13, 0xfe, 0x45, 0xf1, 0xb2, 0xc0, 0x4a, 0x92, 0x76, 0x79,
  0xa3, 0x76, 0xe0, 0x7a, 0x94, 0x6d, 0xba, 0xa7, 0x3b, 0xba, 0xab, 0x9b,
  0x7a, 0x47, 0xbf, 0xd2, 0x47, 0xda, 0x83, 0x3f, 0x02, 0xa6, 0x65, 0x81,
  0x33, 0x04, 0x13, 0x17, 0x1c, 0xc3, 0x62, 0x09, 0xa1, 0x50, 0x19, 0x01,
  0x4b, 0x31, 0x07, 0xc3, 0xbe, 0x69, 0x38, 0xbc, 0x40, 0x1f, 0x56, 0x7f,
  0x2f, 0x70, 0x16, 0x6f, 0x5b, 0x86, 0xcb, 0x12, 0x5b, 0xa3, 0x6e, 0xd7,
  0xf2, 0x78, 0xaa, 0xc9, 0x52, 0xdd, 0x21, 0x8e, 0x69, 0x9f, 0x27, 0x77,
  0x58, 0x72, 0x34, 0x5f, 0xf3, 0x9c, 0xab, 0xb0, 0x6e, 0xcf, 0xda, 0xf2,
  0xdc, 0x5b, 0x3f, 0xc2, 0x35, 0x0a, 0x0b, 0xe1, 0xe7, 0x36, 0xb4, 0xfb,
  0x15, 0x0e, 0x05, 0xa3, 0x98, 0x48, 0x7f, 0x42, 0x24, 0x3f, 0x9e, 0x61,
  0x0d, 0x06, 0xca, 0x02, 0x90, 0xae, 0x2e, 0x00, 0x98, 0x0e, 0x41, 0xeb,
  0x2b, 0x92, 0xcf, 0xdc, 0x61, 0x98, 0x1a, 0x2e, 0x98, 0x40, 0xe6, 0xac,
  0x81, 0x91, 0x2d, 0xea, 0xfd, 0x02, 0xa8, 0x1f, 0x33, 0x00, 0xd6, 0xb0,
  0x1c, 0x2a, 0x73, 0x24, 0x5f, 0x0b, 0xd9, 0xdd, 0xb2, 0x03, 0x18, 0x49,
  0xfb, 0x16, 0xf0, 0xd7, 0x84, 0x1e, 0x32, 0x2e, 0x2e, 0xf5, 0x58, 0x8f,
  0x46, 0x52, 0x62, 0x90, 0x1c, 0x5c, 0x2f, 0xf9, 0xd0, 0x4b, 0x59, 0xc7,
  0xba, 0x05, 0x21, 0x3a, 0x1a, 0x05, 0x98, 0x17, 0x41, 0x71, 0xcc, 0xae,
  0xb3, 0xd9, 0xe9, 0x9c, 0x81, 0xb4, 0xc1, 0x12, 0x9d, 0x20, 0xa2, 0x92,
  0xa3, 0x40, 0x32, 0x28, 0xec, 0xa2, 0xb9, 0xb5, 0x7b, 0x6d, 0x83, 0x95,
  0xeb, 0xb1, 0xf2, 0x13, 0x8b, 0xa7, 0x21, 0x2f, 0x10, 0xbb, 0x8d, 0xb7,
  0x00, 0x58, 0xba, 0x8d, 0x73, 0xcf, 0xa9, 0x05, 0xf3, 0x22, 0xe8, 0x3d,
  0x03, 0x2b, 0xf3, 0x0b, 0xdb, 0xf1, 0xf4, 0xac, 0x2c, 0x79, 0x4a, 0x61,
  0x51, 0xb2, 0x39, 0x4d, 0x7e, 0x52, 0xa5, 0x47, 0x21, 0xb2, 0x9c, 0x5d,
  0x6d, 0xb1, 0x79, 0xc9, 0x92, 0xa0, 0xef, 0x6c, 0x67, 0x07, 0x96, 0xfe,
  0xb8, 0xd3, 0xc1, 0x7a, 0x76, 0x97, 0xee, 0x7b, 0x64, 0x33, 0xb4, 0x6c,
  0x46, 0x46, 0x55, 0x20, 0x03, 0xfe, 0x10, 0xd8, 0x5c, 0x00, 0x4d, 0x9b,
  0xfd, 0x8a, 0xda, 0xa6, 0x5f, 0x3c, 0xd8, 0x63, 0x6a, 0x16, 0x7f, 0x15,
  0x03, 0x27, 0x9a, 0xb4, 0xf0, 0xe1, 0x00, 0x2d, 0x49, 0xc3, 0x2b, 0x04,
  0xee, 0x0b, 0xd0, 0x7b, 0x4e, 0x2f, 0x94, 0x14, 0xdb, 0xb1, 0x03, 0x3e,
  0xf8, 0xe3, 0x43, 0xb3, 0x00, 0xaa, 0x1a, 0xa4, 0x6b, 0xbb, 0x6f, 0x0f,
  0x3a, 0x59, 0x11, 0x2b, 0x87, 0xf4, 0xac, 0xae, 0x67, 0xf9, 0xfd, 0x6d,
  0x2e, 0x54, 0xd9, 0x24, 0x23, 0x0a, 0xc4, 0x4e, 0xe0, 0x25, 0x42, 0x01,
  0x51, 0x00, 0xba, 0x0e, 0xe0, 0x71, 0x7a, 0x16, 0xe9, 0x44, 0x3f, 0x9b,
  0x45, 0x05, 0x9e, 0x52, 0x8d, 0x15, 0xa2, 0xf3, 0xad, 0x80, 0xd3, 0x0d,
  0x85, 0x3b, 0x83, 0x68, 0x5c, 0x50, 0x64, 0x9c, 0x6e, 0xb9, 0x87, 0x0b,
  0xe1, 0xe7, 0x0b, 0xb4, 0x29, 0x94, 0x52, 0x10, 0xc1, 0xec, 0x3a, 0x1d,
  0x35, 0x04, 0xdd, 0xc1, 0xa1, 0x35, 0x62, 0x8a, 0x36, 0xd6, 0xb4, 0x78,
  0x43, 0x61, 0xc8, 0xb6, 0x81, 0xeb, 0xc2, 0x40, 0xca, 0xd2, 0x49, 0x48,
  0xea, 0x25, 0x30, 0x54, 0x61, 0x0a, 0xcf, 0x12, 0x04, 0x63, 0xa9, 0x4f,
  0x38, 0x5c, 0x70, 0x87, 0xa3, 0xdf, 0x2c, 0xe0, 0x62, 0xed, 0xf6, 0xa0,
  0xbb, 0x67, 0x0e, 0xfc, 0x7b, 0x4d, 0xea, 0x94, 0x02, 0x28, 0xf3, 0x6d,
  0xb4, 0x3b, 0xee, 0x40, 0x76, 0xca, 0x1d, 0x98, 0x9f, 0x88, 0x46, 0x6d,
  0x08, 0xda, 0x75, 0xcc, 0xc9, 0xa3, 0x9f, 0x8f, 0x8f, 0xac, 0xfc, 0xc0,
  0x02, 0xce, 0x0e, 0x06, 0x50, 0x3f, 0x65, 0xe2, 0xd6, 0x60, 0x04, 0xaa,
  0xfb, 0x81, 0x7d, 0xed, 0xe1, 0xd6, 0x54, 0xf4, 0xb9, 0x4d, 0x4c, 0xbd,
  0x23, 0x42, 0x2f, 0x4f, 0xdb, 0xf7, 0xec, 0x0e, 0x67, 0x38, 0x0c, 0x87,
  0x30, 0x3d, 0xd1, 0x1b, 0x64, 0xaa, 0x30, 0xe6, 0x4b, 0xbc, 0x5d, 0x31,
  0x8e, 0x8e, 0x86, 0x1d, 0x18, 0x01, 0xb1, 0x91, 0x4b, 0x07, 0x8e, 0x4e,
  0x27, 0xe7, 0x31, 0x14, 0x09, 0xce, 0xc2, 0x7d, 0xa3, 0xf6, 0x3d, 0x08,
  0xc3, 0x83, 0xdd, 0x05, 0x69, 0x31, 0x0c, 0xa1, 0x69, 0x1a, 0x9d, 0xc7,
  0xd8, 0xf4, 0x1b, 0x18, 0x22, 0xa3, 0x9a, 0xe2, 0x7c, 0x63, 0x29, 0x07,
  0x2a, 0x1f, 0x6a, 0x60, 0x53, 0x1e, 0x03, 0x61, 0xb3, 0x8d, 0x16, 0xcf,
  0x02, 0x9b, 0x17, 0x75, 0x78, 0x7c, 0xb8, 0x00, 0x43, 0x3e, 0x75, 0xc0,
  0x24, 0xd9, 0xcb, 0xa7, 0x06, 0x69, 0x2e, 0x2c, 0xa0, 0x56, 0xc9, 0x97,
  0x80, 0x3b, 0x8a, 0xb1, 0x82, 0xec, 0x99, 0xcf, 0x2a, 0xe7, 0xb7, 0x35,
  0xa3, 0xb8, 0xb0, 0xa0, 0x9e, 0xe1, 0x20, 0x4b, 0x0b, 0xa5, 0x8f, 0x63,
  0x43, 0x19, 0x04, 0xb5, 0xd0, 0xfe, 0x7a, 0x64, 0x7b, 0x96, 0xa8, 0xa8,
  0xb5, 0x59, 0xb4, 0x6d, 0xc1, 0x33, 0x6f, 0x4f, 0x68, 0x8a, 0x6e, 0xc9,
  0xf3, 0x1e, 0x9f, 0x3f, 0x53, 0x66, 0x4f, 0xf5, 0xec, 0x9c, 0x32, 0x37,
  0xa7, 0xea, 0xe9, 0x42, 0x67, 0xe8, 0x85, 0xdd, 0x96, 0x9c, 0x08, 0x0b,
  0xc4, 0x9e, 0xc3, 0x26, 0x0e, 0x0a, 0x5d, 0xd7, 0xbb, 0x35, 0xbd, 0x0e,
  0x99, 0xc1, 0xc2, 0x61, 0xc6, 0x8b, 0xa4, 0xcd, 0x62, 0x93, 0xa7, 0xc8,
  0x44, 0xcd, 0x05, 0xa8, 0xe1, 0xfa, 0x7c, 0x98, 0xd5, 0x60, 0x31, 0xe4,
  0x65, 0x07, 0x60, 0x8a, 0x59, 0x46, 0xb1, 0x69, 0xad, 0xc5, 0xc1, 0x88,
  0xe9, 0x55, 0x18, 0x58, 0x4e, 0x2f, 0xe8, 0x37, 0xad, 0x5c, 0x4e, 0x53,
  0xce, 0xf1, 0x17, 0xd6, 0x25, 0x99, 0x09, 0xbb, 0x09, 0x6a, 0xa9, 0xe9,
  0x66, 0x71, 0xd3, 0x4d, 0x1b, 0x8f, 0xe9, 0x81, 0x0a, 0x8a, 0x86, 0xda,
  0x88, 0x01, 0x4e, 0x59, 0x54, 0x16, 0x21, 0xa9, 0x70, 0x3b, 0xa1, 0x63,
  0x62, 0xa0, 0xfd, 0x09, 0xbd, 0x25, 0x80, 0x42, 0x92, 0x0a, 0x6b, 0x64,
  0x5d, 0xc9, 0xa0, 0x29, 0x58, 0x89, 0xfd, 0x24, 0x43, 0xe2, 0x42, 0x5a,
  0x69, 0x50, 0xc9, 0x60, 0xb0, 0xcc, 0x93, 0x67, 0xc9, 0xdb, 0x18, 0x81,
  0x42, 0xaa, 0x0c, 0xd8, 0x8f, 0xd3, 0x27, 0x26, 0xab, 0x66, 0x5e, 0x8a,
  0xf9, 0xab, 0x2f, 0x1e, 0x2c, 0xb2, 0xbe, 0x11, 0x31, 0x8f, 0x87, 0x77,
  0x5f, 0xa9, 0x8a, 0xb0, 0x3a, 0xe2, 0x65, 0x68, 0xb2, 0x50, 0x28, 0x45,
  0x87, 0x7f, 0xbc, 0xaa, 0x19, 0x93, 0xc2, 0xa2, 0xc4, 0x66, 0x13, 0x23,
  0x7f, 0xa3, 0x20, 0x02, 0xc1, 0x4c, 0x71, 0xd5, 0xb5, 0xc1, 0xe0, 0x82,
  0x4e, 0xf7, 0x99, 0xfd, 0xef, 0x0b, 0x73, 0x15, 0xee, 0x44, 0x0c, 0x4e,
  0x41, 0xb3, 0x67, 0xad, 0xc5, 0x94, 0x71, 0x9e, 0x48, 0x67, 0x83, 0xd7,
  0x4e, 0x29, 0xe0, 0xa7, 0x14, 0x60, 0x94, 0x1c, 0xc1, 0xc2, 0x77, 0x60,
  0x1d, 0x82, 0x22, 0xde, 0x0c, 0x04, 0xaa, 0x0c, 0x98, 0x69, 0xf8, 0x12,
  0xec, 0xc8, 0x0c, 0xc0, 0x7a, 0xb6, 0xec, 0x41, 0xb6, 0x50, 0x4b, 0x43,
  0xd6, 0xfc, 0x88, 0x26, 0x64, 0x83, 0x5c, 0x49, 0x4b, 0x41, 0x94, 0xf7,
  0xf3, 0x93, 0xb4, 0x50, 0x6a, 0x2b, 0x27, 0xaa, 0x2e, 0xda, 0xd2, 0x2d,
  0xb2, 0xe5, 0xa4, 0x68, 0xa9, 0xee, 0x83, 0xca, 0xfe, 0x98, 0x3e, 0x98,
  0xd4, 0x80, 0xdc, 0xe4, 0x06, 0xe4, 0x4b, 0x9f, 0xda, 0x84, 0xf6, 0xc8,
  0x1b, 0xdc, 0x9f, 0xf3, 0x6d, 0x6a, 0xda, 0x84, 0xa8, 0xaf, 0x22, 0xea,
  0x7d, 0xf3, 0x26, 0x9a, 0x77, 0x31, 0xa1, 0x05, 0x26, 0x95, 0xf3, 0x0c,
  0xfa, 0x50, 0x4a, 0x85, 0x45, 0xa8, 0xfb, 0xde, 0x7a, 0x81, 0x03, 0xc7,
  0x90, 0x9b, 0x4e, 0xd2, 0xc2, 0xf5, 0xf7, 0x24, 0xaa, 0x84, 0x4e, 0x47,
  0x9a, 0xa8, 0xb6, 0xf2, 0x43, 0xad, 0xec, 0x81, 0x56, 0xf6, 0xd6, 0xec,
  0xa6, 0x07, 0xaa, 0x97, 0x09, 0x93, 0x6d, 0x64, 0xad, 0x9c, 0x97, 0xe4,
  0x1d, 0xe5, 0x80, 0x43, 0x72, 0x73, 0x85, 0x5a, 0x1a, 0x80, 0x4b, 0x01,
  0x14, 0xcc, 0xa7, 0xf9, 0xa6, 0x31, 0x45, 0xb6, 0x4a, 0x7a, 0xdf, 0x30,
  0xf3, 0xbe, 0x3e, 0x30, 0xcc, 0x9c, 0x2f, 0x90, 0x8f, 0x56, 0xe4, 0x99,
  0x9b, 0xb5, 0x75, 0x53, 0xe6, 0xdc, 0x07, 0xdb, 0xf2, 0xc0, 0x6e, 0x63,
  0x99, 0x40, 0x21, 0xf9, 0x6f, 0x02, 0x90, 0xa3, 0x0f, 0x60, 0x31, 0x8f,
  0xff, 0x99, 0xda, 0x38, 0xce, 0x6d, 0xa9, 0x03, 0x40, 0xc9, 0xc0, 0xec,
  0x43, 0x34, 0x02, 0x3d, 0xcf, 0xf8, 0xdf, 0xa1, 0x6f, 0xc5, 0x4a, 0xac,
  0x00, 0xc7, 0xd2, 0x8e, 0xe9, 0xf7, 0xb3, 0x17, 0xe5, 0x45, 0x5f, 0xf7,
  0x2f, 0x35, 0x86, 0xd9, 0x33, 0xd2, 0x46, 0x8e, 0x33, 0xb5, 0x83, 0x92,
  0x9d, 0xe2, 0xe9, 0x4e, 0x34, 0xd3, 0xc3, 0xc2, 0xbf, 0x19, 0x80, 0x4c,
  0x05, 0x91, 0x4c, 0xf9, 0x28, 0x14, 0x76, 0x2e, 0x48, 0x11, 0x8a, 0x58,
  0x43, 0x00, 0xa1, 0x0f, 0x08, 0x27, 0xf7, 0x0d, 0x18, 0xb0, 0xbe, 0x95,
  0x60, 0xab, 0xd8, 0x63, 0xe4, 0xd4, 0xe8, 0x7f, 0xe7, 0x1e, 0xab, 0x42,
  0x8f, 0x55, 0x16, 0x67, 0xec, 0x33, 0xe0, 0xef, 0x84, 0x21, 0xf9, 0x09,
  0x3d, 0xea, 0x8a, 0x8d, 0x67, 0xdd, 0xe2, 0xc8, 0xa9, 0x9f, 0xd2, 0x2d,
  0xc8, 0x30, 0xb4, 0x6e, 0x0e, 0x63, 0x7d, 0xf2, 0xed, 0xcc, 0xb0, 0x93,
  0x98, 0xbf, 0x68, 0xa7, 0x18, 0x7a, 0xb8, 0xf0, 0x22, 0x2d, 0xc1, 0x3a,
  0x45, 0x9a, 0x70, 0xde, 0xe7, 0xac, 0xff, 0xe8, 0x6e, 0xf5, 0x12, 0x8c,
  0x9a, 0xd4, 0xa4, 0x9c, 0xb7, 0x54, 0x4e, 0x6d, 0x16, 0xc9, 0x4c, 0x99,
  0x93, 0xf2, 0x5e, 0xaa, 0xf9, 0x90, 0x27, 0x73, 0x52, 0x68, 0x3c, 0x3d,
  0x08, 0xa6, 0xd5, 0x86, 0xd8, 0x63, 0x00, 0x40, 0x48, 0x2b, 0xea, 0x45,
  0x85, 0xe9, 0xa8, 0x32, 0x12, 0xb5, 0x46, 0x56, 0x31, 0x04, 0x8c, 0x54,
  0x33, 0xac, 0x10, 0x9d, 0xd0, 0xa0, 0xd9, 0xa7, 0x2b, 0xba, 0xfa, 0x23,
  0x2a, 0xe7, 0xad, 0x52, 0x5a, 0x68, 0xe9, 0xcd, 0xfb, 0xee, 0xcd, 0xb5,
  0x6f, 0x9f, 0x2b, 0xdf, 0x3d, 0xcd, 0xdc, 0xda, 0xc5, 0xc5, 0x84, 0x37,
  0xa2, 0x3b, 0x54, 0x8a, 0x11, 0xe9, 0x3a, 0x7c, 0xa3, 0xa1, 0x67, 0x05,
  0x7b, 0xf0, 0x95, 0x9d, 0x2f, 0xe9, 0xf3, 0x25, 0x71, 0x90, 0xe3, 0xee,
  0x0c, 0x9e, 0x14, 0xe0, 0x10, 0x30, 0x9c, 0xc2, 0xd9, 0xee, 0xeb, 0xb3,
  0xab, 0xad, 0xcd, 0x17, 0xbb, 0x87, 0x07, 0xc7, 0xbb, 0x1c, 0x6c, 0x60,
  0x0f, 0x4f, 0xdd, 0xdb, 0xac, 0xad, 0x35, 0x71, 0xa6, 0xf0, 0x8d, 0xf9,
  0x52, 0x73, 0xbe, 0x34, 0xcf, 0xb7, 0x37, 0x52, 0x97, 0xd4, 0x85, 0xf6,
  0x08, 0x14, 0xc8, 0xf5, 0xfe, 0xe0, 0x7e, 0xd8, 0xf7, 0x17, 0x16, 0xb2,
  0x64, 0xb1, 0xee, 0x16, 0x02, 0xef, 0x7e, 0x07, 0x80, 0xb6, 0x49, 0x26,
  0xb6, 0x40, 0x8b, 0x3a, 0x40, 0xb7, 0xc8, 0xa6, 0x11, 0xde, 0x1b, 0x41,
  0x55, 0x94, 0xc2, 0x96, 0x24, 0xbb, 0x54, 0x8b, 0xf2, 0xd9, 0x56, 0xf0,
  0xe9, 0xd4, 0x23, 0xf7, 0x5e, 0xc0, 0xaa, 0x74, 0xb2, 0xfd, 0xa8, 0xe9,
  0x7e, 0xb8, 0xe2, 0x61, 0x32, 0x80, 0x4b, 0x92, 0xec, 0x2c, 0x0d, 0xc9,
  0xa9, 0x16, 0x90, 0xa9, 0xad, 0x4b, 0x40, 0xc3, 0x32, 0x32, 0x91, 0x16,
  0xea, 0xc6, 0x0e, 0xb2, 0x98, 0x54, 0xcf, 0xc4, 0x82, 0xcf, 0x74, 0x12,
  0x61, 0x1e, 0xfb, 0xa4, 0x5b, 0x4a, 0x0e, 0xfd, 0x22, 0xb4, 0x65, 0xb5,
  0xa6, 0x1d, 0xae, 0xdc, 0xe3, 0x3b, 0xd9, 0x38, 0x35, 0xe0, 0x0f, 0x82,
  0x9b, 0xc2, 0xc8, 0xbb, 0x3f, 0xf4, 0xab, 0x70, 0x8f, 0xc7, 0xae, 0xb9,
  0xa4, 0x06, 0x27, 0x35, 0x68, 0xfa, 0x7c, 0x6c, 0x49, 0xc7, 0xf7, 0xc8,
  0x50, 0xca, 0x5c, 0xac, 0xde, 0x35, 0x40, 0x6e, 0xf8, 0x4e, 0xc3, 0x7a,
  0x69, 0x23, 0x06, 0x8f, 0xc4, 0x9e, 0x9a, 0xb8, 0xab, 0x09, 0xdd, 0xd4,
  0x21, 0x72, 0xb6, 0xed, 0x5e, 0xb7, 0x40, 0x92, 0x71, 0x73, 0xca, 0xcb,
  0x86, 0x83, 0x53, 0x45, 0xff, 0x68, 0x10, 0x14, 0x5a, 0xbd, 0x69, 0x10,
  0xdd, 0xa9, 0x10, 0xd0, 0xd9, 0xfa, 0x7c, 0x51, 0x6b, 0x4c, 0xa7, 0x2d,
  0x2b, 0xf0, 0xfa, 0xf1, 0xf1, 0xaa, 0xf0, 0xea, 0xc9, 0xc1, 0xd9, 0xee,
  0x8b, 0x67, 0x9b, 0xdb, 0xbb, 0x57, 0xdb, 0xbb, 0x87, 0x87, 0x57, 0xdb,
  0x27, 0x3b, 0xbb, 0x3f, 0x42, 0x8a, 0xf5, 0x79, 0xb7, 0x80, 0xbb, 0x2e,
  0x85, 0xbb, 0xc7, 0x47, 0xfe, 0xf3, 0x9e, 0x77, 0x41, 0x9a, 0xa1, 0x15,
  0xaa, 0x02, 0xf5, 0xb9, 0xce, 0x85, 0x4b, 0x14, 0x0a, 0x2c, 0xc8, 0x9f,
  0x99, 0x3d, 0xeb, 0x92, 0x6f, 0xe5, 0xc5, 0xb7, 0x7e, 0x64, 0x28, 0xb6,
  0x9f, 0x10, 0x2a, 0x94, 0xc9, 0x38, 0x19, 0x34, 0xe8, 0x93, 0x59, 0xa0,
  0x37, 0x0a, 0x34, 0x7f, 0x83, 0xda, 0x38, 0xd0, 0x90, 0x8e, 0x05, 0xe2,
  0x65, 0xcd, 0xcd, 0x52, 0x38, 0xb9, 0x41, 0xa6, 0x24, 0x1f, 0x58, 0xeb,
  0x83, 0xc6, 0x98, 0x91, 0xfe, 0x0d, 0x0e, 0x3f, 0x63, 0x0b, 0x1e, 0x1f,
  0x67, 0x02, 0x9b, 0xb8, 0xd5, 0xa6, 0xe4, 0xa0, 0x36, 0x5b, 0x1f, 0x16,
  0xd8, 0xbe, 0x4d, 0xda, 0x51, 0x5e, 0x0a, 0x37, 0x8c, 0x8f, 0x61, 0x1d,
  0x9d, 0x58, 0xfa, 0x06, 0x17, 0xc8, 0xe6, 0x34, 0xdd, 0x0c, 0x04, 0xb5,
  0xcd, 0x81, 0x75, 0x82, 0xce, 0x66, 0xf4, 0x20, 0x3f, 0x9c, 0x65, 0xf0,
  0x4c, 0xc2, 0x1c, 0x0c, 0xdc, 0xdb, 0x53, 0x02, 0x03, 0x59, 0x5a, 0x96,
  0x9c, 0x04, 0x33, 0xdc, 0x29, 0xca, 0x08, 0x4a, 0xf6, 0x0d, 0xb5, 0xad,
  0x26, 0xcd, 0x97, 0xa8, 0x57, 0x0f, 0xf0, 0x32, 0xe0, 0x47, 0x89, 0x5f,
  0x38, 0x45, 0xcc, 0xd2, 0x31, 0x7a, 0x94, 0xca, 0xdc, 0x43, 0x80, 0xea,
  0x64, 0xda, 0x7d, 0xd4, 0x24, 0x3e, 0x7a, 0x3f, 0x6a, 0xa2, 0xc9, 0xbb,
  0x05, 0xb7, 0xdb, 0x85, 0xb5, 0x0b, 0x20, 0xf8, 0x98, 0x39, 0x27, 0x2a,
  0x77, 0x0f, 0x8b, 0xf6, 0x50, 0x71, 0xa8, 0x17, 0x0e, 0x5c, 0x61, 0x58,
  0xa2, 0x5d, 0xa2, 0x5e, 0xaa, 0x79, 0xd4, 0xa0, 0x4c, 0x1a, 0x4f, 0xd2,
  0x7c, 0x2d, 0xcf, 0x33, 0x60, 0x92, 0x25, 0x6d, 0xa4, 0x49, 0xb3, 0xbe,
  0xbc, 0xea, 0xb1, 0x87, 0x48, 0x23, 0xb7, 0x8d, 0xc8, 0x39, 0x11, 0xd5,
  0x7f, 0x5f, 0x7d, 0xf1, 0x10, 0x6c, 0x64, 0xec, 0x00, 0xe4, 0xa7, 0x9d,
  0x69, 0x64, 0x32, 0xe3, 0xb9, 0x2f, 0x1e, 0xac, 0x8d, 0x59, 0x2c, 0x86,
  0x57, 0xa4, 0x9a, 0x2d, 0x77, 0xd0, 0x69, 0xcc, 0x0e, 0x8e, 0xe8, 0x67,
  0x35, 0x47, 0x16, 0x27, 0x99, 0x23, 0xe3, 0xe1, 0xdd, 0x8c, 0xa8, 0xf6,
  0xcc, 0x6b, 0x7b, 0x70, 0x3f, 0xfe, 0x6a, 0x3c, 0x4e, 0x7a, 0x8a, 0x8c,
  0x98, 0x13, 0x47, 0x97, 0xf8, 0x6b, 0x50, 0x09, 0x8e, 0x7b, 0x62, 0xd0,
  0x54, 0xd9, 0xeb, 0x82, 0xf5, 0x31, 0x3b, 0xb9, 0x0a, 0xcf, 0xb2, 0x03,
  0x33, 0xb0, 0x42, 0x07, 0x82, 0xb6, 0x7b, 0x7d, 0x6d, 0x07, 0x67, 0xf6,
  0xb5, 0xe5, 0x8e, 0x02, 0xe6, 0x93, 0x22, 0x29, 0x16, 0x29, 0x8d, 0x2b,
  0x93, 0x7c, 0x69, 0x1c, 0xaa, 0xa1, 0x07, 0x11, 0x3a, 0xd2, 0xeb, 0x2a,
  0x1c, 0x9d, 0x82, 0xed, 0xbf, 0x30, 0xbb, 0xa6, 0x67, 0x83, 0x16, 0xa5,
  0x69, 0xe1, 0xa9, 0x9c, 0x44, 0x48, 0xa8, 0x8b, 0x65, 0xf2, 0x6e, 0x6d,
  0xa7, 0xe3, 0xde, 0xe2, 0xfa, 0x9e, 0xa5, 0xd0, 0xa3, 0x52, 0x6e, 0x52,
  0x93, 0x31, 0x0f, 0x75, 0x6b, 0x7a, 0xa9, 0x58, 0xc4, 0x7f, 0x43, 0xe4,
  0xa4, 0xcd, 0x21, 0x52, 0xca, 0x81, 0xb2, 0x46, 0x64, 0x8d, 0x17, 0x7a,
  0x28, 0xa6, 0x40, 0xcf, 0xd2, 0x30, 0x11, 0x6f, 0x49, 0x67, 0x64, 0xd2,
  0xd3, 0x7a, 0xa2, 0x9c, 0xb6, 0x68, 0x9f, 0x09, 0xdd, 0xa1, 0x15, 0x60,
  0x2d, 0xe3, 0xd0, 0x43, 0xec, 0xb2, 0x5c, 0x33, 0x95, 0xeb, 0x90, 0xbf,
  0x0d, 0xa9, 0xc2, 0x58, 0x2f, 0x46, 0x07, 0xb6, 0xb3, 0xf0, 0x8f, 0x52,
  0x0b, 0xed, 0x1e, 0x8f, 0xf5, 0xd5, 0xea, 0xea, 0xe7, 0xf9, 0x33, 0xd1,
  0x43, 0x2b, 0x2a, 0xa7, 0x2a, 0x77, 0x26, 0xe2, 0xc5, 0x84, 0xee, 0x4c,
  0xb5, 0x3a, 0xf5, 0x66, 0x22, 0xbe, 0x4b, 0x2e, 0x77, 0x59, 0x32, 0xb9,
  0xcb, 0x12, 0x7a, 0x33, 0xad, 0x2c, 0x57, 0xa8, 0x37, 0x53, 0xb5, 0x42,
  0x9d, 0x99, 0xea, 0x95, 0x22, 0x75, 0x66, 0x5a, 0xae, 0x56, 0xb9, 0x0f,
  0xd3, 0x55, 0xe8, 0xc3, 0x64, 0x8a, 0x3e, 0x4c, 0x49, 0x47, 0xa3, 0x2b,
  0x7d, 0xa4, 0x77, 0xf5, 0x9e, 0x3e, 0xd4, 0x6f, 0xf4, 0x6b, 0x7d, 0x73,
  0xaa, 0xab, 0x11, 0x75, 0xd8, 0x63, 0x6e, 0x15, 0x86, 0x52, 0xb3, 0x45,
  0xae, 0x41, 0xa0, 0x74, 0x71, 0xd8, 0xc7, 0xfd, 0x82, 0x62, 0x3e, 0x46,
  0xdd, 0x74, 0x4f, 0xa2, 0x1b, 0x85, 0x37, 0x88, 0xb1, 0xc9, 0xd1, 0xb4,
  0x00, 0x12, 0x46, 0xd9, 0x44, 0xef, 0x1b, 0x73, 0x92, 0xf7, 0xcd, 0xa9,
  0xf5, 0xf5, 0x08, 0xf4, 0xfd, 0xa9, 0x85, 0x33, 0xa3, 0xa2, 0xb0, 0xab,
  0xf6, 0xba, 0x51, 0x14, 0x8b, 0x23, 0x93, 0xbc, 0x6c, 0xf8, 0x89, 0xbd,
  0x78, 0x28, 0x34, 0x7b, 0x6d, 0x69, 0x65, 0x95, 0x68, 0x63, 0xf5, 0xce,
  0xea, 0x5e, 0x94, 0x52, 0xf5, 0x27, 0xbb, 0x17, 0x31, 0xd1, 0xde, 0x9e,
  0xba, 0xcc, 0x26, 0xd6, 0x8e, 0xe8, 0x81, 0xc0, 0xcc, 0x27, 0x2f, 0x52,
  0xe9, 0xbe, 0x71, 0x81, 0x24, 0x76, 0x0a, 0x58, 0x99, 0xa0, 0xea, 0xd5,
  0x87, 0xe4, 0x92, 0x7c, 0xea, 0x45, 0x7d, 0x5b, 0x25, 0xa1, 0x6a, 0xf7,
  0xa5, 0x1e, 0x0c, 0x80, 0x34, 0x49, 0x84, 0x91, 0xa1, 0x53, 0x67, 0xae,
  0x98, 0xaf, 0xd8, 0xcc, 0xa4, 0x94, 0x26, 0x10, 0xa2, 0xa8, 0xef, 0x5a,
  0x4d, 0x23, 0x23, 0x63, 0x50, 0x38, 0xb4, 0x9d, 0xf7, 0x1f, 0x49, 0x41,
  0x59, 0xb7, 0x67, 0x67, 0xc6, 0x74, 0x56, 0xf4, 0x0b, 0xd4, 0x79, 0xe5,
  0x23, 0xa9, 0xa8, 0xa8, 0x47, 0xdf, 0xec, 0x94, 0x0d, 0x27, 0x31, 0x6d,
  0x53, 0xbb, 0x24, 0xc7, 0x02, 0x54, 0xfe, 0xac, 0x39, 0xb7, 0x3b, 0x97,
  0x14, 0x28, 0x8d, 0xec, 0xe5, 0xc8, 0x5e, 0x09, 0xd6, 0x27, 0xfa, 0x21,
  0x50, 0x79, 0xed, 0xc0, 0xa4, 0xe1, 0xe0, 0x6c, 0x4f, 0xf6, 0x89, 0x1c,
  0x36, 0x9d, 0x51, 0xce, 0xec, 0x84, 0x79, 0x91, 0x4b, 0x21, 0x35, 0xed,
  0x9e, 0xd9, 0x77, 0xd6, 0xe0, 0x14, 0xbd, 0xe2, 0x26, 0x6e, 0xf6, 0xb2,
  0x32, 0xd4, 0x9d, 0x27, 0xc2, 0x16, 0x22, 0x4b, 0xea, 0xc1, 0xc8, 0xf9,
  0xc2, 0x2b, 0xb0, 0xdc, 0x9d, 0xa8, 0x46, 0x91, 0xa0, 0x24, 0x73, 0x22,
  0xb7, 0xd4, 0xf4, 0xcd, 0x23, 0x3a, 0x69, 0xeb, 0x59, 0x62, 0x76, 0x72,
  0x9b, 0x02, 0x2c, 0x0d, 0xca, 0x13, 0x65, 0x55, 0x04, 0x34, 0xe1, 0xd0,
  0x95, 0x5a, 0x83, 0xeb, 0xbc, 0x22, 0x75, 0x50, 0x0d, 0x27, 0xfa, 0xaf,
  0x7d, 0x67, 0xad, 0xb5, 0x3e, 0xa5, 0x3d, 0x6a, 0x27, 0x35, 0x53, 0xe9,
  0xa4, 0x36, 0x5d, 0x2e, 0xa1, 0xbb, 0x49, 0x29, 0x30, 0x9d, 0x9a, 0x80,
  0x86, 0xbb, 0xb2, 0xf1, 0xe8, 0x2f, 0x7b, 0x9e, 0x7b, 0xbd, 0x8d, 0x0e,
  0xc6, 0x71, 0x07, 0x21, 0xea, 0xea, 0x86, 0x06, 0x6f, 0x20, 0xfb, 0x1d,
  0x48, 0x66, 0x6f, 0xb2, 0xdd, 0xa1, 0xaf, 0x32, 0xf3, 0x30, 0xdb, 0x89,
  0x89, 0x25, 0xe3, 0xbe, 0xec, 0xd9, 0x12, 0x65, 0xcf, 0x1b, 0x13, 0xe5,
  0x36, 0x34, 0xac, 0x3e, 0x41, 0xda, 0x29, 0x3d, 0xa7, 0xd4, 0xb5, 0x26,
  0x6d, 0xf5, 0x94, 0xea, 0xbc, 0xa5, 0x71, 0xdf, 0x3b, 0x86, 0x80, 0xac,
  0x8e, 0xd2, 0x46, 0xd1, 0x0c, 0xfa, 0xc2, 0x2a, 0x78, 0x02, 0x25, 0xd1,
  0x60, 0xe7, 0x1e, 0x0e, 0x92, 0x86, 0x8b, 0xfb, 0xaa, 0xc4, 0xca, 0x4c,
  0xf2, 0x5c, 0x51, 0xe1, 0x89, 0x1c, 0x58, 0x26, 0x20, 0x8a, 0xdc, 0x59,
  0xb8, 0x5f, 0x21, 0x33, 0xbd, 0xb8, 0xa3, 0x1b, 0x6b, 0xfe, 0x67, 0xb2,
  0x55, 0xf6, 0x68, 0x64, 0x8c, 0x1a, 0x39, 0x27, 0x43, 0x8b, 0xfa, 0xf6,
  0x92, 0x71, 0x6a, 0x15, 0x44, 0xa8, 0xb0, 0x2b, 0xb8, 0xe3, 0xe3, 0x94,
  0x52, 0x0c, 0x2c, 0x2c, 0x36, 0xd5, 0xe9, 0x51, 0xc6, 0xe4, 0x1b, 0xeb,
  0xa9, 0xce, 0xab, 0xd4, 0x80, 0x0f, 0x17, 0x01, 0xaa, 0xf3, 0x91, 0xd0,
  0x83, 0x72, 0x0f, 0x64, 0x93, 0x1e, 0x94, 0xf0, 0x7d, 0xc0, 0xb8, 0x81,
  0xd7, 0xb5, 0x3d, 0x2b, 0xfb, 0x40, 0xae, 0xd1, 0x34, 0x60, 0xe5, 0xef,
  0xf0, 0x35, 0xb3, 0xca, 0x95, 0x70, 0xac, 0xa9, 0xdc, 0x3d, 0xa7, 0x70,
  0x42, 0x84, 0xd5, 0x98, 0x5b, 0xd1, 0xa4, 0x52, 0xcc, 0x7f, 0x17, 0x57,
  0x6a, 0x52, 0x2e, 0x2c, 0x6d, 0x23, 0x09, 0x0f, 0xd2, 0x24, 0x3c, 0x1b,
  0x68, 0x63, 0x9a, 0x72, 0x0a, 0x24, 0xd3, 0x11, 0x13, 0x15, 0xb3, 0x53,
  0x8a, 0xd9, 0x0a, 0x9f, 0x4a, 0x2c, 0xaa, 0x74, 0x82, 0x9a, 0x65, 0x9c,
  0x29, 0xca, 0x8d, 0x15, 0x63, 0x96, 0x78, 0x61, 0x2a, 0x17, 0x19, 0x40,
  0x90, 0xff, 0xd2, 0x1c, 0xd8, 0x1d, 0x4c, 0x93, 0x1d, 0x57, 0xad, 0x19,
  0x8e, 0x54, 0x85, 0xe1, 0x95, 0xf0, 0xaf, 0xa3, 0x3e, 0x4f, 0xdd, 0x81,
  0xeb, 0x7a, 0x59, 0x75, 0xdd, 0x04, 0x6c, 0x91, 0x2f, 0x30, 0x52, 0x70,
  0xb1, 0x01, 0x1d, 0x39, 0x50, 0xa5, 0xb4, 0x83, 0x80, 0x4d, 0x42, 0x16,
  0xf9, 0x08, 0x26, 0x28, 0x9b, 0x58, 0xf5, 0xe2, 0x34, 0xa3, 0x1c, 0xcf,
  0xd3, 0xa4, 0x2d, 0xa7, 0x14, 0x74, 0x81, 0x3b, 0x34, 0xa2, 0x7d, 0x83,
  0x59, 0xf0, 0x6d, 0x14, 0x1b, 0x84, 0x54, 0x32, 0xb2, 0xb2, 0xa9, 0xb4,
  0x46, 0x2d, 0xcb, 0x4f, 0x6f, 0x8e, 0xb6, 0x54, 0x9e, 0xcc, 0x23, 0xda,
  0x79, 0x53, 0xbb, 0x37, 0x27, 0x50, 0x36, 0xb5, 0x45, 0x16, 0xae, 0x93,
  0x5e, 0xe0, 0x05, 0x76, 0xa7, 0x37, 0x99, 0x49, 0xe8, 0x45, 0x99, 0x94,
  0x9c, 0x19, 0x51, 0x4f, 0x6a, 0x9a, 0xe4, 0x43, 0x99, 0xa6, 0x7b, 0x16,
  0xa7, 0xb3, 0x78, 0x4a, 0x05, 0x02, 0xf7, 0x52, 0x37, 0x30, 0x27, 0x31,
  0x3e, 0x81, 0x3e, 0x31, 0x6d, 0x19, 0x71, 0xc6, 0x4f, 0x69, 0xec, 0x92,
  0x62, 0x4c, 0xc4, 0x27, 0xd5, 0xd9, 0x71, 0x12, 0xf0, 0x54, 0x94, 0xc2,
  0x18, 0x9b, 0xda, 0x8e, 0xa5, 0xb4, 0x4e, 0x48, 0x47, 0xad, 0x16, 0xcd,
  0x78, 0x63, 0x94, 0x88, 0x91, 0xfb, 0xe3, 0x59, 0x8c, 0xd4, 0x84, 0xdd,
  0xa0, 0x16, 0xa0, 0x99, 0xc4, 0xc0, 0xfa, 0x16, 0x8c, 0x25, 0x4f, 0x9c,
  0x46, 0x5f, 0xb2, 0x48, 0x2d, 0x59, 0xe2, 0x6d, 0xaf, 0xcc, 0xe0, 0x76,
  0xff, 0xe7, 0xcd, 0xbf, 0xe3, 0xc4, 0x26, 0xdc, 0xd5, 0x58, 0x5f, 0x59,
  0xfe, 0xcc, 0x7b, 0x8a, 0x89, 0x15, 0x70, 0x72, 0x6b, 0xaf, 0x5a, 0x63,
  0x5b, 0x7b, 0x64, 0x03, 0xcf, 0xe1, 0x77, 0x0e, 0x71, 0x6f, 0x6f, 0x79,
  0xa5, 0x4c, 0xf7, 0xf6, 0x56, 0x8b, 0x15, 0xbe, 0x71, 0xd7, 0x17, 0x36,
  0xee, 0x62, 0x7b, 0xdb, 0x8a, 0xdd, 0x3b, 0x1f, 0x1d, 0x0f, 0xf5, 0xbe,
  0x3e, 0xd0, 0xdb, 0x7a, 0x87, 0xef, 0xdd, 0x61, 0x56, 0x86, 0xde, 0x21,
  0xce, 0x00, 0xcc, 0x7c, 0x51, 0xef, 0x10, 0xb0, 0xb6, 0x3e, 0x48, 0xdb,
  0xfa, 0x12, 0xd7, 0x7a, 0x7c, 0x9b, 0x2d, 0x74, 0x85, 0x21, 0x98, 0xb6,
  0x30, 0xe2, 0xe4, 0x0b, 0xdc, 0x48, 0x3d, 0x32, 0x1d, 0xb3, 0x67, 0x79,
  0x8a, 0x5d, 0x24, 0x2f, 0x7d, 0xaf, 0x0d, 0xa5, 0xdd, 0xa0, 0x3b, 0x4d,
  0x78, 0xa0, 0xb1, 0x63, 0x06, 0xfc, 0xc2, 0x21, 0xdd, 0x9c, 0x7d, 0xb8,
  0x83, 0x4e, 0xbc, 0x87, 0xff, 0x6c, 0x9f, 0x58, 0x80, 0x56, 0xa7, 0x31,
  0x5f, 0xd2, 0x89, 0x05, 0xdc, 0xc8, 0x64, 0x74, 0x16, 0x8f, 0x68, 0x2c,
  0x91, 0xc4, 0x7b, 0xd2, 0x37, 0x1e, 0x5a, 0xa6, 0xd7, 0x10, 0x45, 0x71,
  0xcb, 0xf4, 0x68, 0xd7, 0x14, 0x5a, 0x36, 0xd3, 0x00, 0x9a, 0x4e, 0xae,
  0xb4, 0xcb, 0x60, 0x98, 0x92, 0x04, 0x0c, 0xe3, 0x3e, 0x48, 0xc0, 0xa1,
  0x63, 0x5f, 0xb2, 0x00, 0xbf, 0x36, 0x2d, 0x82, 0x9f, 0xd0, 0xb4, 0x04,
  0xf0, 0x38, 0xb6, 0x5c, 0x34, 0x61, 0xad, 0x4b, 0x75, 0x3f, 0x5f, 0xeb,
  0x46, 0xdb, 0xf4, 0xd4, 0xb8, 0x62, 0x33, 0x43, 0x68, 0xca, 0x47, 0x26,
  0xac, 0x3a, 0x5f, 0xb8, 0x91, 0x40, 0x04, 0xa2, 0x10, 0x7e, 0x7f, 0x0a,
  0xcb, 0xc7, 0xcc, 0xae, 0xe4, 0x67, 0x60, 0xc4, 0x0f, 0x8a, 0x34, 0x2a,
  0x3a, 0x01, 0x53, 0x4b, 0x08, 0x5d, 0x97, 0x6f, 0x90, 0x23, 0x35, 0x18,
  0xa5, 0x24, 0x7f, 0xd3, 0xb1, 0xaf, 0xa9, 0x59, 0x3a, 0xa5, 0x0d, 0x8a,
  0x95, 0xc6, 0x94, 0x6a, 0x86, 0xe6, 0x48, 0x38, 0x73, 0x98, 0xa4, 0x2e,
  0x54, 0x8a, 0x82, 0x7b, 0x7d, 0xa4, 0x6a, 0x12, 0x0e, 0x30, 0x56, 0x2f,
  0x68, 0xa6, 0xf3, 0x60, 0x74, 0xfd, 0xa3, 0xa1, 0x2e, 0x85, 0xa3, 0x53,
  0x4f, 0xd6, 0x84, 0x16, 0x6c, 0xcc, 0xd0, 0xa6, 0xf0, 0x6c, 0x7f, 0x22,
  0x14, 0xbf, 0x4f, 0xaa, 0x86, 0x11, 0x65, 0x9d, 0x8e, 0x9a, 0xec, 0x7c,
  0x51, 0x38, 0xa5, 0x89, 0xdb, 0xe9, 0x5a, 0xe8, 0xaa, 0x92, 0x52, 0x27,
  0x5b, 0x24, 0xfd, 0xc8, 0x64, 0x40, 0xb1, 0x9e, 0xfb, 0xb4, 0xc1, 0x90,
  0x76, 0xf5, 0x6f, 0x7e, 0xa6, 0x9e, 0x98, 0x01, 0xa8, 0x60, 0xfb, 0xcf,
  0x70, 0x80, 0x74, 0x36, 0x64, 0x76, 0x97, 0xa6, 0xb1, 0x94, 0x96, 0x4e,
  0x23, 0x9b, 0xe3, 0xb1, 0xa4, 0x25, 0x59, 0x34, 0x8b, 0x40, 0xb5, 0x94,
  0x47, 0x07, 0x8e, 0x1d, 0xd8, 0xb0, 0x2e, 0xfb, 0x60, 0x75, 0x42, 0x7a,
  0x15, 0x60, 0x4f, 0x48, 0xc8, 0x05, 0xb6, 0x6e, 0x9b, 0x23, 0x93, 0xa9,
  0x42, 0xef, 0xc4, 0x6e, 0x22, 0xaa, 0x3b, 0x09, 0x83, 0x1d, 0xe7, 0x26,
  0x76, 0xb3, 0x6d, 0xb0, 0xf5, 0xc5, 0x04, 0x0f, 0x30, 0x74, 0xe5, 0xb2,
  0xd7, 0x8a, 0x8f, 0x8f, 0xf6, 0x7a, 0xaa, 0x91, 0x3d, 0x23, 0xb9, 0xec,
  0xd2, 0xcc, 0xb5, 0xed, 0x28, 0xb7, 0x5e, 0x58, 0xad, 0x77, 0xca, 0xed,
  0x17, 0xb4, 0xf6, 0xf2, 0x25, 0xc1, 0xaf, 0x4d, 0x59, 0x16, 0x27, 0x1c,
  0xe2, 0xbd, 0x05, 0xab, 0xf9, 0xc2, 0xc0, 0x35, 0x3b, 0xc4, 0xb3, 0x58,
  0x74, 0x25, 0xd3, 0x74, 0x6a, 0xa0, 0x44, 0x5b, 0x77, 0x68, 0x86, 0xb2,
  0x08, 0x1b, 0xf1, 0x3e, 0x8c, 0x2d, 0x92, 0xc3, 0x79, 0x62, 0xe2, 0x5c,
  0xa0, 0xf2, 0x6f, 0x9f, 0xc5, 0x35, 0x95, 0xca, 0x1f, 0xda, 0xbe, 0xb1,
  0xe5, 0xfa, 0x34, 0x8d, 0x45, 0x10, 0xeb, 0xc1, 0x8c, 0xd0, 0x07, 0x0e,
  0x8d, 0x1f, 0x48, 0x5d, 0xe8, 0xf9, 0xfe, 0xe8, 0xc2, 0x42, 0x06, 0x43,
  0x9e, 0x64, 0x90, 0x2d, 0xa1, 0xe3, 0x97, 0x6c, 0x64, 0x5c, 0x04, 0x97,
  0xc0, 0x49, 0x5b, 0xe2, 0x65, 0xd4, 0xc2, 0xd0, 0x6d, 0x44, 0x9c, 0x62,
  0x0b, 0x77, 0xa1, 0x61, 0x45, 0xbf, 0xef, 0x0d, 0x5b, 0xfa, 0x0e, 0x39,
  0x6a, 0xcc, 0x97, 0xa4, 0x0c, 0x32, 0x0b, 0x1b, 0x16, 0xe9, 0x2c, 0xf1,
  0x20, 0x5e, 0x5a, 0x8d, 0x91, 0xae, 0x8b, 0x7c, 0x1e, 0xb5, 0xb1, 0xd0,
  0x7b, 0xdf, 0x86, 0xbe, 0xa0, 0x3d, 0xfb, 0x12, 0x83, 0xfc, 0x0d, 0xe8,
  0xf8, 0x16, 0x28, 0x89, 0x7f, 0x43, 0x5b, 0x0d, 0xf4, 0x78, 0x94, 0x9b,
  0x6b, 0x18, 0xb6, 0x9c, 0x14, 0xb5, 0x78, 0xc2, 0xde, 0x71, 0x08, 0x24,
  0x97, 0xa5, 0x4c, 0x99, 0xc5, 0x75, 0x37, 0x14, 0x0b, 0x19, 0x01, 0x65,
  0x9e, 0x91, 0xc2, 0x3e, 0xd9, 0x7b, 0x50, 0x14, 0xed, 0x71, 0x9a, 0x68,
  0xc7, 0x25, 0x64, 0x76, 0xc2, 0x1e, 0x1f, 0x33, 0xc4, 0x1c, 0xcd, 0xfc,
  0xc8, 0x85, 0xea, 0xa3, 0x06, 0xd5, 0x6c, 0x92, 0x37, 0xb6, 0x06, 0xbe,
  0xa5, 0x52, 0x7c, 0xe3, 0xb1, 0xfc, 0xfd, 0x20, 0x20, 0x5c, 0x58, 0xc8,
  0x3a, 0x48, 0x2b, 0xcc, 0xc9, 0x5d, 0xf7, 0x4e, 0x9c, 0x13, 0x92, 0x7b,
  0x73, 0x6b, 0xa1, 0xfb, 0x6c, 0x78, 0xb7, 0xa0, 0x21, 0x56, 0x47, 0xdc,
  0xf2, 0x25, 0x1e, 0xc9, 0x1c, 0x4a, 0x36, 0x44, 0x2f, 0x7d, 0x92, 0x31,
  0x1c, 0x4e, 0x78, 0xe1, 0x02, 0x23, 0xe9, 0xb9, 0xfe, 0x99, 0xda, 0x8f,
  0x15, 0x4c, 0xb9, 0xb5, 0x32, 0x5b, 0xef, 0x31, 0x1f, 0x65, 0x85, 0x24,
  0x8d, 0x93, 0x2b, 0x9f, 0xef, 0xb2, 0x05, 0xc2, 0x85, 0x09, 0x41, 0x5e,
  0xf4, 0xd2, 0xa7, 0x21, 0xdf, 0x6c, 0xb7, 0x49, 0x64, 0x0f, 0xb9, 0x0a,
  0xe9, 0x1e, 0x81, 0x8d, 0x77, 0xe1, 0x27, 0xb6, 0x3c, 0xb6, 0x8c, 0xfb,
  0x2e, 0x5b, 0xaf, 0xbc, 0x5c, 0x3a, 0x91, 0x38, 0x69, 0xd1, 0x38, 0x03,
  0x69, 0xc9, 0x2b, 0x62, 0x33, 0x11, 0xa7, 0xbe, 0x7c, 0x94, 0xda, 0x43,
  0x11, 0x99, 0x63, 0xd5, 0x96, 0x47, 0x7f, 0xac, 0xd7, 0x96, 0xab, 0x0d,
  0x76, 0x78, 0xfa, 0x29, 0xdb, 0x28, 0xc4, 0xec, 0xc5, 0xd3, 0xc8, 0xd0,
  0x47, 0x4c, 0x48, 0x22, 0xfb, 0x22, 0xd2, 0xde, 0x47, 0xe8, 0xab, 0x87,
  0xd9, 0x17, 0x97, 0xe1, 0x7a, 0x97, 0x9f, 0x59, 0xa0, 0x43, 0xae, 0x6d,
  0x14, 0x9b, 0xf6, 0x9a, 0xd5, 0xb4, 0xf1, 0x4e, 0x60, 0x04, 0xce, 0xfc,
  0xf1, 0xd7, 0xc2, 0x79, 0x89, 0xa6, 0x0e, 0x47, 0x78, 0xfd, 0xed, 0x52,
  0x0c, 0x1e, 0x10, 0xe5, 0x5e, 0xd8, 0x97, 0x61, 0xc0, 0x80, 0xb5, 0x20,
  0x0a, 0x1a, 0x10, 0x66, 0x92, 0xd2, 0xcc, 0x5f, 0xac, 0xa9, 0x2a, 0x67,
  0x04, 0xe3, 0x04, 0x09, 0x86, 0x15, 0x1e, 0xe9, 0x28, 0x22, 0x16, 0x88,
  0x90, 0xa4, 0x46, 0xf9, 0xae, 0xa3, 0x50, 0x89, 0x15, 0x12, 0x17, 0xc8,
  0x84, 0x59, 0x97, 0x60, 0xb2, 0x30, 0x86, 0xa2, 0x13, 0x5b, 0xf5, 0x33,
  0xf7, 0xba, 0x62, 0x1e, 0x27, 0xc9, 0x9d, 0xae, 0xd2, 0x2a, 0xdb, 0xe9,
  0x22, 0xa1, 0xb8, 0x1c, 0x79, 0x5f, 0xcb, 0x0d, 0xf7, 0xb5, 0x9c, 0x99,
  0xf6, 0xb5, 0x78, 0x00, 0xac, 0xbe, 0xb4, 0xab, 0x85, 0xb6, 0x0a, 0xdb,
  0xd3, 0xea, 0x73, 0x90, 0xf8, 0xf9, 0x3b, 0x3a, 0x2e, 0xbd, 0xe8, 0xbb,
  0xb7, 0x48, 0x6f, 0x38, 0xd8, 0xc9, 0x19, 0x99, 0xb8, 0xe1, 0x90, 0x84,
  0xb0, 0xb4, 0xe4, 0x59, 0x3e, 0xe2, 0x82, 0x25, 0x89, 0x35, 0x19, 0x57,
  0x12, 0x82, 0xe0, 0x9a, 0x71, 0x1f, 0x86, 0xf5, 0x90, 0x7a, 0x9b, 0x05,
  0xa3, 0xf9, 0x22, 0xea, 0xac, 0x36, 0x56, 0xa4, 0x25, 0x6c, 0xb2, 0xc9,
  0x93, 0xa2, 0x6c, 0x0e, 0xdc, 0xcb, 0x9f, 0x64, 0x85, 0x11, 0x03, 0x2f,
  0x69, 0x31, 0x5b, 0x9c, 0x95, 0x2c, 0xe7, 0x65, 0x44, 0xf9, 0x52, 0xd3,
  0x5a, 0x0f, 0x83, 0x9f, 0x08, 0xd5, 0x17, 0x63, 0x35, 0xe6, 0x92, 0x75,
  0xea, 0xd1, 0x1e, 0x61, 0x6a, 0xb9, 0xb2, 0x6c, 0x00, 0x95, 0xe3, 0xb3,
  0x37, 0x17, 0xf2, 0x09, 0x7d, 0x4b, 0xc2, 0xda, 0x14, 0xba, 0x3d, 0x30,
  0xff, 0xbc, 0xc2, 0xc1, 0xf1, 0xcb, 0xdd, 0xd3, 0xb3, 0xdd, 0x9d, 0xab,
  0x9d, 0xdd, 0xbd, 0xcd, 0xf3, 0xc3, 0xb3, 0xab, 0xed, 0x93, 0xc3, 0x93,
  0x53, 0xe1, 0x0e, 0xdf, 0xc7, 0xdf, 0xa5, 0x6b, 0x20, 0x72, 0xe2, 0xc2,
  0xef, 0x83, 0x55, 0x53, 0xae, 0xd5, 0xc9, 0x7c, 0xa4, 0x91, 0x3a, 0xb5,
  0x8f, 0xc4, 0x6c, 0x3a, 0xbe, 0x7d, 0x81, 0x05, 0x2f, 0x09, 0xe6, 0x8f,
  0x2b, 0xdc, 0x0d, 0x4f, 0xae, 0x89, 0xc2, 0x47, 0xae, 0x43, 0x9b, 0x91,
  0x89, 0xda, 0xc4, 0x99, 0x09, 0xfb, 0x9b, 0x08, 0x05, 0x32, 0x38, 0x8f,
  0x9f, 0x5a, 0x13, 0xed, 0xba, 0x87, 0x59, 0x4b, 0x11, 0x01, 0xa2, 0xe5,
  0x22, 0x65, 0x45, 0x3b, 0x1d, 0x34, 0x16, 0x12, 0x10, 0x69, 0xa8, 0x14,
  0x74, 0xd0, 0xed, 0x0c, 0x11, 0x3f, 0x2c, 0x48, 0x83, 0x23, 0x42, 0x81,
  0x94, 0x72, 0xe3, 0x9c, 0x0a, 0x82, 0x35, 0x9e, 0x30, 0x24, 0xd3, 0x87,
  0xd6, 0x38, 0xa9, 0xdd, 0xdc, 0xb1, 0x5e, 0xaf, 0x14, 0x3f, 0x4f, 0x63,
  0xaa, 0x5c, 0x05, 0x93, 0x6a, 0x53, 0x50, 0x92, 0x5e, 0xa8, 0x24, 0xfd,
  0x8f, 0x51, 0x92, 0x92, 0x8a, 0x0c, 0x5d, 0x18, 0x98, 0x9e, 0x34, 0x01,
  0xce, 0x05, 0x38, 0x4f, 0x1a, 0x66, 0x64, 0xc1, 0x17, 0x2a, 0x15, 0xf6,
  0x25, 0x9a, 0xe7, 0x06, 0xdb, 0x27, 0x63, 0x13, 0x32, 0xee, 0x88, 0xb1,
  0x9f, 0xf1, 0x40, 0x5d, 0x3c, 0x9d, 0x6c, 0x97, 0x34, 0xf8, 0x50, 0x9c,
  0xaa, 0xfb, 0x26, 0xc5, 0x10, 0x0b, 0x97, 0x6d, 0xe9, 0x41, 0xc4, 0x22,
  0xaf, 0x6d, 0xa1, 0x01, 0x0c, 0xb7, 0x47, 0xb6, 0xfb, 0x42, 0xee, 0xff,
  0x48, 0xa3, 0x96, 0x69, 0x31, 0x45, 0xce, 0x97, 0x5e, 0x62, 0xab, 0x48,
  0x92, 0x35, 0xb9, 0x0d, 0xd1, 0x4a, 0x47, 0xb5, 0x17, 0x2e, 0xc5, 0x6a,
  0xfb, 0x27, 0x6d, 0xaf, 0x6a, 0x33, 0xfc, 0xc7, 0x8e, 0xba, 0x14, 0x57,
  0x20, 0x26, 0x9a, 0x13, 0x61, 0x52, 0x1a, 0xc1, 0xe3, 0xa7, 0xa9, 0xd3,
  0x85, 0x7d, 0xb4, 0x8e, 0xdd, 0x21, 0x1d, 0xcb, 0x0e, 0x77, 0xe8, 0xc8,
  0xa5, 0x59, 0xe9, 0x9b, 0x8e, 0xe1, 0x66, 0x44, 0x74, 0x8d, 0x35, 0x8a,
  0x48, 0x34, 0x6f, 0x3d, 0x3e, 0xce, 0x07, 0x69, 0x7b, 0x8e, 0x4c, 0x8a,
  0x42, 0xfd, 0x62, 0x5d, 0x94, 0x2e, 0xa7, 0x6e, 0x72, 0x82, 0xd5, 0x16,
  0xcc, 0x04, 0xe7, 0xb0, 0x2d, 0x4c, 0xf3, 0x2e, 0xeb, 0xeb, 0x45, 0x3c,
  0xc5, 0x0c, 0xb7, 0x34, 0x3d, 0x65, 0xab, 0x58, 0x28, 0x35, 0x6c, 0x88,
  0x93, 0xbe, 0x81, 0xfa, 0xf8, 0xe8, 0xae, 0x15, 0x35, 0x69, 0xca, 0xc7,
  0xea, 0x26, 0x6e, 0xef, 0x92, 0xcd, 0x59, 0x32, 0x41, 0x45, 0x4c, 0x92,
  0xa6, 0xc8, 0x74, 0xe7, 0xd2, 0x70, 0x8d, 0xbf, 0x91, 0x3e, 0x8d, 0x86,
  0x92, 0xb5, 0x15, 0x4e, 0xf3, 0x91, 0x9b, 0x3a, 0x3f, 0x3e, 0x98, 0x58,
  0x90, 0xef, 0x34, 0x2a, 0x11, 0x68, 0x64, 0x72, 0xb6, 0xa3, 0x10, 0x38,
  0xd6, 0x45, 0xf1, 0x52, 0xf7, 0xa1, 0x1b, 0x8a, 0x97, 0x79, 0x1b, 0xfa,
  0xc3, 0xcd, 0x3b, 0xb9, 0x92, 0x30, 0x09, 0xd2, 0x89, 0xcf, 0x06, 0x45,
  0x0e, 0x6a, 0x9f, 0xee, 0xb8, 0x84, 0x65, 0x7d, 0x98, 0xe0, 0x9d, 0x0d,
  0xc4, 0xd0, 0x00, 0x7d, 0x6f, 0x38, 0x68, 0xe3, 0x6c, 0x20, 0x26, 0xe5,
  0x21, 0x06, 0x4e, 0xaf, 0x4a, 0xc4, 0x26, 0x54, 0x1c, 0x5a, 0x7c, 0xfd,
  0xa8, 0xa7, 0x81, 0x94, 0x7c, 0x09, 0x7a, 0x3b, 0x92, 0xc6, 0xa8, 0x5c,
  0x51, 0x77, 0x72, 0x4a, 0xcf, 0x76, 0x6a, 0xdb, 0xf5, 0x61, 0x1d, 0x30,
  0x6f, 0x18, 0x2e, 0x6f, 0xa7, 0x65, 0x78, 0x40, 0x9c, 0xfb, 0x91, 0xc4,
  0x15, 0x61, 0x02, 0xb3, 0x80, 0xb4, 0xb1, 0x38, 0xd7, 0x53, 0x9d, 0x6a,
  0x5c, 0x10, 0xc6, 0xa1, 0x94, 0x5f, 0x4a, 0x46, 0x22, 0xa8, 0x57, 0xe3,
  0x02, 0xab, 0xd1, 0x83, 0x44, 0x5e, 0x5c, 0x4d, 0xc4, 0x36, 0xd0, 0x66,
  0x93, 0x3d, 0xb0, 0x36, 0x95, 0x63, 0xdb, 0xe7, 0x5e, 0xb7, 0x4c, 0x01,
  0x40, 0x77, 0x6f, 0xbb, 0xae, 0xd7, 0xb1, 0x1d, 0x80, 0xf4, 0x77, 0xbf,
  0x1e, 0x99, 0x64, 0xb9, 0x1d, 0x6f, 0x88, 0x86, 0x83, 0x3a, 0xb5, 0x40,
  0x10, 0x6f, 0x1b, 0x80, 0xdb, 0xf3, 0xd2, 0x4d, 0xa8, 0x44, 0xab, 0x1e,
  0x1f, 0xfd, 0x18, 0x04, 0xa5, 0x3b, 0x8d, 0xa2, 0x90, 0xee, 0x2c, 0xd3,
  0x30, 0x0b, 0x0b, 0xc8, 0x5b, 0xdc, 0x2f, 0x85, 0x3f, 0xf8, 0x51, 0xa2,
  0x1f, 0xa5, 0x4b, 0x34, 0x98, 0x94, 0xc6, 0x8d, 0x37, 0xd6, 0x97, 0xab,
  0xd5, 0xcf, 0xb3, 0x9a, 0x62, 0xd7, 0x3c, 0x92, 0x06, 0x53, 0x6d, 0x99,
  0xad, 0x33, 0x4b, 0x55, 0xb6, 0xce, 0x24, 0x8e, 0x14, 0x2e, 0x8b, 0xe2,
  0x1c, 0x7a, 0x54, 0x90, 0xdb, 0x52, 0xb5, 0xe5, 0xf0, 0x4e, 0xd4, 0xe0,
  0x23, 0x5d, 0x2b, 0x3c, 0xb2, 0x00, 0x4d, 0xba, 0x56, 0xa0, 0x8f, 0x75,
  0x86, 0x40, 0x74, 0x08, 0x0c, 0x40, 0x88, 0xb7, 0xad, 0x61, 0xd4, 0x5b,
  0xde, 0x53, 0x17, 0xa3, 0x58, 0x72, 0x57, 0x0a, 0x33, 0x9e, 0x2d, 0x87,
  0x37, 0x0e, 0x93, 0xf1, 0x2a, 0xa7, 0x91, 0xc9, 0xc4, 0x93, 0xd9, 0x55,
  0x61, 0xba, 0x1d, 0xf2, 0xc0, 0x9d, 0x20, 0x6e, 0x5d, 0xef, 0xfd, 0x36,
  0x77, 0xab, 0x70, 0xd4, 0x6e, 0x15, 0xf4, 0x9e, 0x46, 0xb8, 0x97, 0x12,
  0x5b, 0xdd, 0xba, 0xb8, 0x52, 0x1e, 0x5a, 0x6d, 0xbb, 0x6b, 0xb7, 0x25,
  0x17, 0x84, 0x4c, 0xe2, 0x5a, 0x4e, 0x46, 0x8f, 0x16, 0xbd, 0xc9, 0x98,
  0xa1, 0x13, 0x17, 0xbb, 0xb1, 0xc3, 0x3a, 0x39, 0x9a, 0x47, 0x53, 0xc9,
  0x18, 0x43, 0x15, 0xde, 0x50, 0xbc, 0x90, 0x1f, 0x71, 0x0b, 0x04, 0x32,
  0x3a, 0x89, 0x96, 0xb1, 0xa4, 0x87, 0x48, 0x94, 0x51, 0x04, 0x53, 0xf8,
  0x2d, 0x6f, 0xbf, 0xcb, 0x47, 0xcc, 0x34, 0xcd, 0xfb, 0x64, 0x87, 0x6a,
  0x95, 0xb1, 0x28, 0xd7, 0x20, 0xc4, 0x93, 0xbd, 0x82, 0x75, 0xd5, 0x2e,
  0x10, 0x25, 0xc6, 0x30, 0x8a, 0xe2, 0xaa, 0x59, 0x4d, 0x6f, 0xcd, 0x08,
  0xc4, 0xc0, 0x6a, 0xa0, 0x6d, 0x27, 0x1e, 0x80, 0x92, 0x29, 0x7d, 0xe2,
  0x21, 0x6a, 0x74, 0xa0, 0x68, 0xe1, 0x48, 0x9b, 0x24, 0xe4, 0x08, 0x45,
  0x12, 0x48, 0xfc, 0x0a, 0x92, 0x8f, 0xf1, 0x52, 0x95, 0xe1, 0x38, 0x15,
  0x3a, 0xdf, 0x22, 0xfb, 0x74, 0xd1, 0xa1, 0xa5, 0x15, 0x93, 0x72, 0x7a,
  0xcd, 0xde, 0x34, 0xe4, 0x54, 0x18, 0xe2, 0x20, 0x47, 0x03, 0x68, 0x3b,
  0xcc, 0x4d, 0x78, 0xa8, 0x69, 0x8a, 0x27, 0x3a, 0x68, 0x19, 0x38, 0x3c,
  0x02, 0x47, 0x11, 0x34, 0x18, 0xce, 0x93, 0xa0, 0xcb, 0xe0, 0xff, 0xb5,
  0x07, 0x28, 0x59, 0x0c, 0x77, 0x37, 0x9c, 0x82, 0xdf, 0xb7, 0xbb, 0xd0,
  0x11, 0x4d, 0x93, 0x79, 0x2c, 0xb0, 0xa6, 0xb0, 0x41, 0x95, 0x8d, 0x55,
  0x1b, 0x14, 0xc8, 0x6b, 0x4b, 0x03, 0xe8, 0xae, 0x33, 0x1e, 0x04, 0x1a,
  0xd6, 0x5a, 0xe1, 0x5c, 0xa4, 0x91, 0x7f, 0xf3, 0xf8, 0x8d, 0x77, 0x35,
  0xc9, 0x47, 0x69, 0x3c, 0x1f, 0xca, 0xb0, 0xed, 0x0b, 0xd7, 0xff, 0xb3,
  0x26, 0xa8, 0xda, 0xc1, 0x5a, 0xc0, 0x28, 0xcd, 0x97, 0x00, 0x8a, 0x47,
  0xdb, 0x78, 0x86, 0x6f, 0x40, 0x64, 0x07, 0xb9, 0x92, 0x86, 0xf3, 0x66,
  0xe1, 0xf8, 0x1c, 0x63, 0x6d, 0xf0, 0x80, 0x1b, 0xb0, 0x7e, 0x30, 0xf9,
  0xd9, 0xed, 0x82, 0x91, 0x2f, 0x95, 0x6b, 0x2b, 0xe5, 0xd5, 0x52, 0x45,
  0x0f, 0x13, 0x1f, 0x8d, 0xf2, 0xda, 0x5a, 0x19, 0x74, 0xa3, 0x9d, 0x35,
  0x61, 0x06, 0x85, 0x25, 0xa0, 0x65, 0x0c, 0xc6, 0xe3, 0x31, 0x0d, 0xb1,
  0x12, 0x19, 0x26, 0x54, 0xfd, 0x73, 0x73, 0x22, 0x34, 0xa6, 0x74, 0x5f,
  0x29, 0x1b, 0xa4, 0xbf, 0xb0, 0x37, 0x1c, 0xd0, 0x60, 0xae, 0x41, 0x4c,
  0x8e, 0xd1, 0x60, 0xd0, 0xb4, 0xe5, 0xfd, 0xe9, 0xb8, 0xb0, 0x92, 0xdb,
  0x35, 0x60, 0x11, 0xc0, 0xac, 0x80, 0x85, 0x07, 0xb4, 0x10, 0x5a, 0x63,
  0x07, 0x0e, 0xde, 0x95, 0x86, 0x92, 0x1b, 0xc0, 0x2a, 0xb4, 0xce, 0x7a,
  0x3b, 0xf4, 0x95, 0xb0, 0xac, 0x36, 0xc1, 0x42, 0x93, 0x37, 0x3a, 0x1a,
  0xb4, 0xe0, 0xe9, 0xfe, 0x16, 0x14, 0xfa, 0xca, 0xeb, 0xb5, 0xb2, 0x5f,
  0x3c, 0x78, 0x85, 0xcd, 0x00, 0xfa, 0xa6, 0x35, 0x0a, 0x2c, 0xec, 0xc4,
  0x42, 0xe0, 0xd2, 0x98, 0x22, 0x00, 0x43, 0xc4, 0x75, 0xaf, 0x47, 0x0f,
  0x0d, 0x34, 0xad, 0xf0, 0x0e, 0xf8, 0x9c, 0xcd, 0xe8, 0x19, 0x6d, 0xac,
  0x7d, 0x35, 0xc1, 0xb8, 0x63, 0x3b, 0x33, 0x62, 0xd9, 0xcb, 0xb0, 0xf6,
  0x2d, 0x56, 0xfb, 0xc0, 0x98, 0xb1, 0xfe, 0xad, 0x94, 0xfa, 0x29, 0xb2,
  0x67, 0x26, 0x71, 0x05, 0xce, 0x62, 0x78, 0x87, 0xc1, 0xf4, 0xdd, 0x22,
  0x11, 0x1f, 0xa1, 0x89, 0x8e, 0x98, 0x36, 0x46, 0x3c, 0x62, 0x4b, 0x91,
  0x78, 0x0c, 0xf6, 0x02, 0xeb, 0xa2, 0x9d, 0x30, 0x83, 0x1d, 0x07, 0xcc,
  0x10, 0x18, 0xa7, 0xcf, 0x1c, 0x09, 0xc8, 0xbc, 0xf0, 0x90, 0x09, 0xdc,
  0x21, 0x1e, 0x9e, 0x5b, 0x05, 0x97, 0xbb, 0x31, 0xe3, 0xb4, 0xba, 0xb0,
  0xd0, 0x06, 0xe5, 0x6c, 0x09, 0x5b, 0x65, 0x9c, 0x01, 0xa4, 0x4d, 0xaa,
  0x0c, 0x42, 0xb9, 0xde, 0x36, 0x08, 0x46, 0x23, 0x81, 0x11, 0x6f, 0x3a,
  0xe9, 0x28, 0x38, 0x90, 0x65, 0xe2, 0x11, 0x22, 0x68, 0x6f, 0xd7, 0x00,
  0x33, 0xb3, 0x8f, 0x66, 0xe6, 0x46, 0xd6, 0x16, 0x16, 0x00, 0xe6, 0xe3,
  0x63, 0x38, 0x97, 0x46, 0xc6, 0x24, 0xee, 0x98, 0xf8, 0x79, 0x07, 0xb7,
  0x10, 0x79, 0xe1, 0x86, 0x09, 0x85, 0x07, 0x80, 0x6d, 0xb6, 0xd2, 0x81,
  0x5c, 0x1a, 0xc4, 0x7f, 0xc0, 0xa9, 0x9a, 0xa7, 0x54, 0x49, 0x78, 0x26,
  0x50, 0x00, 0x03, 0x53, 0x0a, 0x20, 0x08, 0x83, 0x32, 0xba, 0x78, 0x22,
  0xde, 0x5a, 0x52, 0x8f, 0x25, 0x3b, 0x74, 0x9e, 0x8a, 0x47, 0x4c, 0xd2,
  0x52, 0x1d, 0x8a, 0x8a, 0x71, 0xab, 0x51, 0x38, 0x68, 0x88, 0xf6, 0x23,
  0x78, 0xa8, 0x8f, 0x64, 0x10, 0x1c, 0x12, 0xff, 0x62, 0xcf, 0x33, 0xaf,
  0x63, 0x5b, 0x15, 0xe1, 0xc6, 0x5c, 0xfa, 0x62, 0x20, 0xc8, 0x5b, 0xb9,
  0x70, 0xe3, 0x56, 0xa1, 0x80, 0x84, 0x9c, 0x18, 0x17, 0x30, 0x8c, 0xbb,
  0xa4, 0x31, 0xe9, 0x7e, 0x6e, 0x89, 0x48, 0x5c, 0xe2, 0x08, 0x1f, 0x04,
  0x9e, 0x6c, 0xf6, 0x86, 0x01, 0x8b, 0xd6, 0xca, 0xb5, 0x7a, 0x94, 0xc7,
  0xcd, 0x11, 0x31, 0x98, 0x94, 0xb0, 0xd0, 0x56, 0x19, 0x01, 0x78, 0xa9,
  0xe4, 0xe4, 0xd6, 0x89, 0xec, 0x57, 0x5e, 0xd5, 0xdc, 0x84, 0x42, 0x17,
  0xc1, 0x65, 0x6a, 0x28, 0x22, 0x39, 0xc0, 0x99, 0x64, 0x8e, 0x34, 0xb9,
  0x1a, 0x4e, 0xde, 0x36, 0xc1, 0x60, 0x89, 0xf4, 0x3d, 0x47, 0x12, 0xa6,
  0x0b, 0x16, 0x91, 0xc4, 0xa8, 0xd1, 0xd6, 0x55, 0xe6, 0x4f, 0x53, 0xa6,
  0x50, 0xe1, 0x4e, 0x90, 0x46, 0x35, 0x2c, 0x87, 0x6c, 0xb4, 0xf0, 0xe3,
  0x86, 0xf8, 0x60, 0xac, 0x97, 0x97, 0x3f, 0xd3, 0xb8, 0x4f, 0x3c, 0x2c,
  0x91, 0x34, 0xef, 0x89, 0x0d, 0x4f, 0xcc, 0x7b, 0x7c, 0xc8, 0x85, 0x07,
  0x43, 0xa0, 0x81, 0xb5, 0x60, 0xac, 0x15, 0x75, 0x34, 0x9c, 0x07, 0x38,
  0xef, 0xa3, 0x6e, 0xd3, 0x89, 0x9b, 0xc3, 0x15, 0x9e, 0x8a, 0x29, 0x90,
  0x27, 0xcf, 0x0e, 0x85, 0xad, 0x53, 0x3e, 0xb8, 0x12, 0x31, 0x0e, 0xa8,
  0xc6, 0xe1, 0xc6, 0x7b, 0x62, 0x37, 0x4a, 0x78, 0x24, 0xc4, 0x88, 0xe2,
  0x83, 0xc5, 0xdf, 0x47, 0x49, 0xbf, 0x3e, 0x1b, 0x06, 0x6a, 0x94, 0xa2,
  0x1a, 0x38, 0xdc, 0x38, 0xc7, 0x38, 0x57, 0xc6, 0x43, 0xb7, 0x07, 0x6b,
  0xf9, 0x16, 0xfe, 0x03, 0xbd, 0xc0, 0xdc, 0x70, 0xc3, 0xb0, 0x65, 0x36,
  0xbe, 0x09, 0xc3, 0x45, 0x36, 0x8c, 0xae, 0x85, 0xfa, 0xb4, 0x27, 0x62,
  0xc1, 0xe3, 0x0e, 0x2b, 0x0c, 0xaa, 0x15, 0x45, 0xd0, 0x32, 0xca, 0xf5,
  0x95, 0x6a, 0xa5, 0x56, 0xad, 0xd5, 0x17, 0xb0, 0xc8, 0x86, 0x55, 0xa0,
  0x0b, 0x23, 0xab, 0x53, 0x20, 0x95, 0x11, 0x0e, 0x23, 0xa7, 0xdb, 0xd4,
  0xba, 0xe2, 0x5c, 0x76, 0xd3, 0x67, 0x21, 0xec, 0x01, 0x5d, 0x18, 0x72,
  0x30, 0x32, 0xfd, 0x84, 0xb5, 0x52, 0x25, 0xfa, 0x3c, 0xac, 0x2b, 0x74,
  0xb3, 0x26, 0x8a, 0x32, 0x32, 0x5a, 0xc3, 0x8d, 0x87, 0x92, 0x9e, 0x72,
  0x6f, 0xe6, 0x53, 0x43, 0xcc, 0x2c, 0x95, 0x6a, 0x9a, 0xd6, 0xbc, 0x32,
  0x82, 0xc5, 0xd1, 0xf7, 0xb3, 0xe5, 0x45, 0xe1, 0x8e, 0x88, 0x45, 0xdd,
  0xa7, 0x3e, 0x7e, 0xa2, 0xb4, 0xf5, 0x0c, 0x7d, 0xb6, 0x8c, 0xae, 0x90,
  0x1e, 0x52, 0x26, 0xbb, 0xbe, 0x7a, 0xb2, 0xc3, 0x07, 0xe3, 0xd6, 0xd7,
  0x57, 0x16, 0x4a, 0xf5, 0xe5, 0xe5, 0xe5, 0x72, 0xa9, 0x86, 0x1c, 0x07,
  0xa1, 0xb7, 0x04, 0xe3, 0x46, 0x40, 0x62, 0x1a, 0xaa, 0x8c, 0x24, 0x92,
  0x01, 0x22, 0xc1, 0x29, 0xa9, 0x63, 0xa4, 0x8b, 0x2e, 0x3a, 0x78, 0x41,
  0x13, 0xe8, 0x32, 0x3e, 0x7c, 0xda, 0x23, 0xba, 0xba, 0x8f, 0x7b, 0x9f,
  0x1d, 0x22, 0x65, 0xf5, 0xe5, 0x52, 0x71, 0x65, 0xa5, 0x5e, 0x5d, 0x90,
  0x45, 0xeb, 0xf1, 0x11, 0xe6, 0x92, 0x6c, 0xad, 0x58, 0xa9, 0x94, 0xea,
  0xd5, 0x95, 0x05, 0x59, 0x16, 0xb5, 0x49, 0x25, 0x35, 0xff, 0xd6, 0x0e,
  0xda, 0x7d, 0x75, 0x59, 0xc8, 0x7e, 0x68, 0xc3, 0xea, 0x7c, 0x8e, 0x35,
  0xa7, 0xde, 0x20, 0x5f, 0x95, 0x4a, 0xad, 0x56, 0xad, 0x56, 0xca, 0x8d,
  0xfe, 0x34, 0x53, 0xa8, 0x5c, 0xab, 0xc5, 0x10, 0x5e, 0x12, 0x16, 0x35,
  0x5b, 0x9e, 0x65, 0xbe, 0x6f, 0x12, 0x6c, 0xbc, 0x66, 0xc0, 0x96, 0xe5,
  0x6c, 0x8b, 0x53, 0xb1, 0xb6, 0xb6, 0xf2, 0x08, 0xb8, 0x58, 0x31, 0xf6,
  0x6e, 0xed, 0xc4, 0xea, 0x05, 0x8b, 0x14, 0x2b, 0xa4, 0x6e, 0x51, 0x93,
  0xda, 0xda, 0xfa, 0xb6, 0xdb, 0xda, 0xfa, 0x94, 0xb6, 0xb6, 0xc2, 0xb6,
  0x8e, 0xfb, 0x86, 0x47, 0xca, 0x17, 0x5a, 0x60, 0x11, 0x74, 0xb2, 0x7d,
  0xbd, 0x5a, 0x5e, 0xad, 0xae, 0xd6, 0x97, 0x8b, 0xd5, 0xe2, 0xc2, 0x2c,
  0xfb, 0xa9, 0xae, 0x6a, 0xdf, 0xf4, 0x64, 0x68, 0x7e, 0x0d, 0x33, 0x80,
  0x3b, 0x69, 0x6b, 0x94, 0xc2, 0x68, 0xa4, 0xf2, 0xc7, 0x52, 0x79, 0x45,
  0x13, 0x05, 0x9a, 0x32, 0xb2, 0x3f, 0xd3, 0x8e, 0xee, 0xb7, 0x42, 0x81,
  0x58, 0x39, 0x9a, 0x06, 0x38, 0x2a, 0x75, 0x57, 0x7d, 0x3b, 0x18, 0x46,
  0xa5, 0x32, 0x27, 0x65, 0x58, 0xea, 0x24, 0x3e, 0x44, 0x80, 0xf1, 0x21,
  0x48, 0xd8, 0xb7, 0x4d, 0x7f, 0x4b, 0x56, 0x0b, 0x9a, 0x68, 0xb9, 0x4c,
  0x1c, 0x46, 0x0b, 0x0b, 0x45, 0x63, 0xc2, 0x00, 0x34, 0xff, 0x89, 0xf8,
  0xc5, 0xf7, 0xe4, 0x3f, 0x65, 0xf0, 0x4f, 0x1b, 0x10, 0xe6, 0xb7, 0x3a,
  0x20, 0xcc, 0xe9, 0x03, 0x62, 0xea, 0x10, 0x9e, 0xa6, 0xae, 0x3e, 0x9a,
  0xe2, 0x89, 0xea, 0x2a, 0x8d, 0xe2, 0x54, 0x75, 0x35, 0xa9, 0xfa, 0xb8,
  0xba, 0x32, 0xe5, 0xc1, 0x6f, 0xfe, 0x98, 0x0c, 0x7e, 0x1c, 0x36, 0x7c,
  0xe7, 0xff, 0x23, 0x67, 0x66, 0x5c, 0x43, 0xfe, 0x18, 0x4e, 0xcb, 0x6d,
  0x52, 0x73, 0x67, 0x23, 0xcf, 0x65, 0x86, 0x98, 0x61, 0x0b, 0xf9, 0x52,
  0xa5, 0x5a, 0x2e, 0x41, 0xc2, 0xea, 0x63, 0xff, 0x31, 0xec, 0x72, 0x19,
  0x48, 0xc8, 0xd1, 0xf4, 0x01, 0xa9, 0x5c, 0x04, 0x00, 0xa5, 0x90, 0x67,
  0xe3, 0xae, 0xf6, 0x68, 0x0a, 0xa0, 0xa9, 0x2a, 0x24, 0x0b, 0xc4, 0xcc,
  0x53, 0x44, 0x93, 0xb4, 0xc9, 0x46, 0x48, 0x5c, 0x5c, 0xfc, 0x1f, 0x43,
  0x81, 0x74, 0x45, 0x97, 0x18, 0xd6, 0x7a, 0xb1, 0x1d, 0x69, 0x08, 0x18,
  0x6d, 0x95, 0x58, 0x9d, 0x4c, 0x5f, 0xce, 0x03, 0x81, 0x03, 0xc2, 0xb0,
  0x54, 0xfa, 0xd0, 0xc3, 0x26, 0xaf, 0x6c, 0x61, 0x4b, 0x22, 0xaf, 0x9b,
  0x50, 0xce, 0x02, 0x79, 0x69, 0xe5, 0x95, 0xd4, 0x81, 0x4d, 0x4d, 0x44,
  0x02, 0x4f, 0x1d, 0xc4, 0xb0, 0x76, 0x91, 0x2d, 0xde, 0xde, 0xe8, 0x37,
  0x62, 0xed, 0x89, 0x59, 0xe6, 0x83, 0x0d, 0xb3, 0x11, 0xc3, 0x19, 0xb3,
  0xd3, 0x17, 0x8c, 0x5a, 0xa5, 0xbe, 0xb2, 0x5c, 0x5c, 0x2d, 0x95, 0xe2,
  0x59, 0x8f, 0xc6, 0xd5, 0xda, 0x5a, 0x79, 0x75, 0xa1, 0xb2, 0x5c, 0x5b,
  0x29, 0xae, 0xd6, 0x2b, 0x2b, 0x55, 0x74, 0xf1, 0xab, 0x97, 0x97, 0x3f,
  0x6f, 0x79, 0x96, 0x12, 0x6f, 0xc6, 0x08, 0x54, 0xcf, 0x54, 0x29, 0x4e,
  0x66, 0x8a, 0xab, 0x6c, 0xe9, 0xb6, 0x4a, 0x4e, 0x66, 0x2e, 0x60, 0x05,
  0xac, 0x2c, 0xd9, 0x1d, 0x39, 0xc2, 0x79, 0x39, 0x75, 0xf4, 0x23, 0xe7,
  0x28, 0x6c, 0x11, 0xd0, 0xa1, 0xd1, 0x7c, 0x78, 0xc4, 0xc1, 0x6d, 0xd7,
  0xe9, 0xda, 0x3d, 0x2d, 0xcb, 0xe1, 0xb0, 0x4c, 0x3b, 0xfe, 0xfe, 0x83,
  0x23, 0xfa, 0x41, 0x86, 0x9b, 0x99, 0x0e, 0x2c, 0x68, 0x75, 0xa0, 0xad,
  0xe0, 0xde, 0x3a, 0x56, 0x67, 0xeb, 0xbe, 0x40, 0x9e, 0x81, 0x3e, 0xe9,
  0xe2, 0xd6, 0x34, 0x4c, 0x52, 0xfe, 0x3a, 0x3e, 0xf3, 0x02, 0x3f, 0x48,
  0x7d, 0x6d, 0x52, 0x0f, 0x39, 0x11, 0xf3, 0xb5, 0xac, 0xcd, 0xbe, 0xc1,
  0x0c, 0xe6, 0xcb, 0x7d, 0xbb, 0x60, 0x22, 0xfd, 0x4d, 0x74, 0xa9, 0x8a,
  0x50, 0xd2, 0x7a, 0x71, 0xf3, 0x89, 0xe4, 0x46, 0x41, 0x7c, 0x60, 0xa6,
  0xf7, 0x87, 0x03, 0x50, 0x53, 0xc0, 0xf5, 0x92, 0xa6, 0x35, 0xa2, 0x22,
  0x2c, 0xd9, 0xc7, 0x03, 0x57, 0xa2, 0xb1, 0xc7, 0xe3, 0x59, 0x5b, 0xd3,
  0xfc, 0x08, 0x6a, 0x79, 0x75, 0xc4, 0x43, 0xd5, 0xc2, 0xed, 0x26, 0x42,
  0x21, 0x0d, 0x7d, 0x39, 0x77, 0x05, 0x8a, 0x8b, 0x3e, 0x07, 0x37, 0x32,
  0x1e, 0x48, 0x46, 0x83, 0x6e, 0x7e, 0x4b, 0x01, 0x38, 0x3a, 0xec, 0x45,
  0x45, 0x7c, 0x8b, 0x14, 0xd6, 0x6c, 0x76, 0x1b, 0x2c, 0x13, 0x7e, 0x1f,
  0x4f, 0xa7, 0x75, 0x36, 0x3a, 0x3a, 0xab, 0xa9, 0x71, 0x61, 0x5d, 0x8e,
  0xf9, 0xd6, 0x83, 0x43, 0xeb, 0x1d, 0x69, 0xfa, 0x88, 0xd5, 0x3b, 0x41,
  0xc4, 0x22, 0x91, 0x88, 0x0e, 0x35, 0xa6, 0xb1, 0x22, 0xa5, 0x53, 0xf3,
  0xb8, 0x31, 0x64, 0x6b, 0x0f, 0x25, 0xb2, 0xdf, 0x2f, 0x80, 0xf1, 0x8e,
  0x22, 0x89, 0x53, 0xfa, 0x4a, 0x2a, 0xc8, 0x72, 0x6c, 0xa1, 0xbb, 0x60,
  0xb8, 0x81, 0x94, 0x7f, 0xde, 0x70, 0x8b, 0x1c, 0x05, 0x61, 0x84, 0x89,
  0xdd, 0x69, 0x04, 0x31, 0xd9, 0x57, 0x78, 0xdb, 0xd6, 0xd1, 0xd9, 0x38,
  0x0e, 0x16, 0x1b, 0x58, 0xa1, 0x83, 0x18, 0x3f, 0xd4, 0x7f, 0x88, 0x74,
  0x60, 0x43, 0x54, 0x88, 0x7a, 0xa4, 0xba, 0x1b, 0xa2, 0x1e, 0xd7, 0xd9,
  0x5b, 0xd4, 0x7c, 0x31, 0x8f, 0x7e, 0x92, 0xba, 0xe8, 0x8d, 0x2f, 0xe7,
  0x28, 0xec, 0xe0, 0x14, 0x00, 0xb5, 0x5b, 0xc5, 0x34, 0x58, 0x66, 0x4d,
  0xa8, 0xc1, 0x26, 0x3a, 0x5c, 0xcc, 0x5c, 0x46, 0x55, 0x05, 0x1a, 0x6a,
  0xc0, 0x16, 0xfc, 0x53, 0xf0, 0x89, 0x24, 0x10, 0xc9, 0x0f, 0x3c, 0xd3,
  0x0f, 0x88, 0xf4, 0x42, 0xa6, 0xf4, 0xad, 0xf7, 0xcd, 0x41, 0x77, 0x3b,
  0x06, 0x91, 0x48, 0xe3, 0x03, 0xe5, 0x41, 0x7c, 0x6c, 0xa0, 0xe1, 0x48,
  0x6f, 0x0f, 0xe8, 0xf1, 0xe0, 0x59, 0x0d, 0x53, 0x97, 0x42, 0x84, 0x34,
  0x1c, 0x39, 0x64, 0x88, 0x1e, 0x45, 0x5b, 0xc1, 0xac, 0xf0, 0x43, 0x8f,
  0x05, 0x19, 0x6e, 0x58, 0x7a, 0x3c, 0xc0, 0x70, 0x23, 0x04, 0xe2, 0xcf,
  0xcc, 0x35, 0x6c, 0x21, 0x85, 0x01, 0x79, 0x7a, 0x14, 0x83, 0x17, 0x6a,
  0x88, 0x3e, 0x74, 0xbe, 0x07, 0xc3, 0x52, 0xc9, 0x03, 0x04, 0x51, 0xa0,
  0x60, 0x96, 0x4a, 0x3f, 0xf4, 0x58, 0xbc, 0x61, 0x27, 0x16, 0x80, 0x58,
  0x4f, 0x9c, 0x40, 0x03, 0x48, 0x22, 0x4d, 0x27, 0xbb, 0xc8, 0x00, 0x8e,
  0x0a, 0xeb, 0xc0, 0xd9, 0xf2, 0xb0, 0x38, 0x7d, 0xf2, 0x14, 0xc0, 0xd3,
  0x33, 0x75, 0xd0, 0x3d, 0xf6, 0xf5, 0xe8, 0x9a, 0xf7, 0x06, 0x65, 0xac,
  0x53, 0x50, 0x25, 0xeb, 0xd4, 0x5a, 0x6e, 0xf4, 0xc7, 0xa8, 0xbd, 0xa4,
  0x41, 0x2a, 0x0e, 0xb6, 0xc4, 0xcd, 0x03, 0xd1, 0xc8, 0xe7, 0x0a, 0x0c,
  0x2f, 0x23, 0x90, 0xad, 0x69, 0x71, 0x01, 0x60, 0x53, 0x7b, 0x1f, 0xf7,
  0xe5, 0x55, 0xe9, 0xd1, 0xc6, 0x35, 0xd3, 0xaa, 0xfc, 0x58, 0x5b, 0x88,
  0xa7, 0x86, 0x45, 0xe3, 0x89, 0x0b, 0x60, 0x0e, 0x8a, 0x82, 0x44, 0x80,
  0xe4, 0x57, 0x2d, 0x2c, 0x41, 0x3c, 0x48, 0x76, 0xf4, 0x49, 0x32, 0x45,
  0xb1, 0xa2, 0xf9, 0x62, 0x0a, 0x82, 0x44, 0x9d, 0x4f, 0xf2, 0xa3, 0x4f,
  0x9e, 0x89, 0x32, 0x10, 0x66, 0xe1, 0x07, 0xcf, 0x78, 0x15, 0xd5, 0x1a,
  0x7d, 0xca, 0x99, 0xd8, 0x77, 0x31, 0x00, 0x4c, 0x42, 0xa0, 0x84, 0x24,
  0x10, 0xb8, 0x44, 0x2a, 0x82, 0xc6, 0x1f, 0x4e, 0x8c, 0x78, 0x15, 0xa6,
  0xc9, 0x60, 0x02, 0x3f, 0xe2, 0x89, 0x04, 0x30, 0x55, 0xaa, 0x68, 0x91,
  0xd4, 0x6c, 0x2c, 0xac, 0x12, 0x30, 0x52, 0x4c, 0x95, 0x41, 0x7a, 0x50,
  0xb9, 0x54, 0x33, 0x04, 0x59, 0x89, 0x65, 0x09, 0x85, 0x62, 0xd6, 0xb8,
  0x58, 0x28, 0x96, 0x35, 0x96, 0xe7, 0x22, 0x71, 0x2a, 0x66, 0x42, 0xc7,
  0xd7, 0x18, 0xa2, 0x09, 0x6e, 0x69, 0x8f, 0x8f, 0x7c, 0x9d, 0x2b, 0xa7,
  0xc3, 0x50, 0x29, 0x57, 0x3e, 0x73, 0x6e, 0x94, 0x5e, 0x73, 0x01, 0xca,
  0x77, 0x0e, 0x8e, 0xae, 0x4e, 0x9e, 0x6d, 0x6e, 0x1f, 0x9c, 0xbd, 0x81,
  0x2f, 0xb5, 0x07, 0x7f, 0x72, 0x96, 0xc4, 0x58, 0x2b, 0xcd, 0x54, 0xf0,
  0x72, 0x6d, 0x59, 0x97, 0x31, 0x17, 0x6a, 0x89, 0xaa, 0x7d, 0xf1, 0x96,
  0x22, 0x7e, 0x1c, 0x5a, 0x3d, 0xb3, 0x7d, 0xbf, 0xdb, 0xe9, 0x59, 0x1b,
  0x7c, 0xef, 0xb7, 0x91, 0xb1, 0x3b, 0x96, 0xdb, 0xf3, 0xcc, 0x61, 0xdf,
  0x6e, 0x67, 0xc6, 0x7a, 0xb5, 0xb6, 0xfc, 0x39, 0xf7, 0xa1, 0x52, 0xc2,
  0x25, 0x44, 0xb7, 0xa3, 0xd2, 0x00, 0x94, 0xe7, 0x1d, 0x61, 0xcc, 0x38,
  0xb2, 0xf9, 0xbb, 0x0d, 0xa3, 0x04, 0xbb, 0x5f, 0x78, 0x3c, 0x3e, 0x71,
  0x40, 0xc1, 0x8e, 0x3c, 0x62, 0x57, 0x80, 0x71, 0x13, 0x6c, 0xfa, 0x36,
  0x00, 0x3f, 0x32, 0x64, 0x11, 0x03, 0x0e, 0x1c, 0xd0, 0x18, 0xd0, 0xb8,
  0x2c, 0x8d, 0x4f, 0xc9, 0xa3, 0x10, 0x64, 0x23, 0x6f, 0x33, 0x76, 0x5e,
  0xc8, 0xda, 0xe2, 0xf1, 0x00, 0xdc, 0xfc, 0x46, 0x28, 0xc9, 0xe0, 0x58,
  0xb4, 0x71, 0x68, 0xaf, 0x3d, 0x28, 0xb2, 0x17, 0x26, 0xec, 0x53, 0xf0,
  0x40, 0xe3, 0x78, 0x58, 0x19, 0x12, 0xa5, 0xaa, 0x42, 0x57, 0x24, 0xf2,
  0x68, 0xe0, 0x7a, 0x0a, 0xb1, 0xb3, 0x56, 0xcc, 0x43, 0xb1, 0xa7, 0xa0,
  0x49, 0xc5, 0x1f, 0xab, 0xdf, 0xe4, 0x11, 0x18, 0xc8, 0x41, 0xec, 0x2c,
  0x95, 0x9b, 0x4e, 0xdb, 0x1a, 0x6c, 0x4a, 0xc5, 0xb2, 0x2a, 0x5c, 0xea,
  0x1a, 0x78, 0xf5, 0xe3, 0x94, 0x30, 0x10, 0x0f, 0x4c, 0x5c, 0x68, 0xdf,
  0x86, 0xfe, 0x58, 0x21, 0x12, 0x6c, 0xc5, 0x29, 0x2d, 0x6a, 0x75, 0x8c,
  0x1d, 0x3c, 0x77, 0x76, 0xdc, 0x5b, 0x7e, 0x10, 0x99, 0x2a, 0x66, 0x32,
  0x11, 0x49, 0xb4, 0x94, 0xb6, 0x69, 0x6d, 0x67, 0x61, 0xa5, 0x62, 0x8d,
  0x17, 0xdf, 0x0d, 0x97, 0x07, 0x46, 0x76, 0x22, 0x0f, 0xc6, 0x1a, 0x8d,
  0xb0, 0x18, 0x93, 0x6e, 0xcb, 0xa8, 0x17, 0x8b, 0x3f, 0x5e, 0x32, 0x39,
  0x95, 0x31, 0xf1, 0xa7, 0x01, 0x22, 0x47, 0x6a, 0x75, 0xc7, 0x45, 0x27,
  0x74, 0xd0, 0xd6, 0x7c, 0x36, 0xea, 0xc6, 0xfc, 0xc4, 0x52, 0xcd, 0x29,
  0x68, 0xb9, 0x56, 0xb3, 0xd6, 0x8b, 0x0a, 0xa7, 0xf6, 0x04, 0xa3, 0xd9,
  0x85, 0x9f, 0x84, 0xd0, 0x94, 0xd4, 0xbd, 0xf6, 0x23, 0x97, 0x0e, 0x65,
  0x57, 0xcd, 0xd0, 0x15, 0x61, 0x0b, 0xbf, 0xd3, 0xbe, 0x90, 0x9c, 0x02,
  0x26, 0xf7, 0xc7, 0xa7, 0x74, 0x82, 0x2a, 0xf5, 0xc7, 0xa4, 0x5f, 0x60,
  0x62, 0xc5, 0x21, 0x0a, 0x7f, 0x80, 0x7a, 0x16, 0x2b, 0xea, 0x41, 0xdd,
  0x8a, 0xa2, 0xaa, 0x0f, 0xff, 0xff, 0xb9, 0xe5, 0xbb, 0x9f, 0x5b, 0x48,
  0x88, 0x2c, 0xda, 0x29, 0x72, 0x34, 0xaf, 0xc9, 0x92, 0x9a, 0x62, 0x70,
  0x84, 0x7b, 0xa6, 0xca, 0xc8, 0x45, 0x60, 0xa3, 0xae, 0xd4, 0x3f, 0xf3,
  0x82, 0x5f, 0xe2, 0x39, 0x40, 0xb0, 0x4c, 0x87, 0xee, 0x2d, 0xf5, 0x6a,
  0xd8, 0x41, 0x44, 0xe4, 0xb9, 0x23, 0xdc, 0xce, 0x69, 0xb9, 0x77, 0x08,
  0x0a, 0xeb, 0xa6, 0x58, 0x3a, 0x06, 0x62, 0x60, 0x11, 0x9f, 0xc5, 0x9c,
  0xa4, 0x25, 0x8b, 0x4e, 0x30, 0xe9, 0xf0, 0x0f, 0x99, 0xff, 0xe7, 0xd7,
  0xff, 0xef, 0x4c, 0xe3, 0x22, 0x0c, 0x64, 0x71, 0xdb, 0x58, 0xd1, 0xfb,
  0x8d, 0xea, 0xf8, 0x52, 0x87, 0x9c, 0x9f, 0x88, 0x72, 0x96, 0x59, 0x4e,
  0x89, 0xe6, 0xfc, 0x64, 0x94, 0x53, 0x67, 0x39, 0x65, 0x9a, 0xf3, 0x53,
  0x51, 0x4e, 0x8d, 0xe5, 0x54, 0x68, 0xce, 0x4f, 0x47, 0x39, 0x55, 0xb9,
  0x9e, 0x9f, 0x89, 0x72, 0x2a, 0x2c, 0xa7, 0x46, 0x73, 0x7e, 0x36, 0xca,
  0x29, 0xb3, 0x9c, 0x3a, 0xcd, 0xf9, 0xb9, 0x28, 0xa7, 0xc4, 0x72, 0x96,
  0x69, 0xce, 0xcf, 0x27, 0xdb, 0xb3, 0x42, 0x73, 0x7e, 0x41, 0xce, 0x59,
  0x8e, 0x72, 0x7e, 0x51, 0xce, 0xa9, 0x47, 0x39, 0xbf, 0x24, 0xe7, 0xd4,
  0xa2, 0x9c, 0x7f, 0x2e, 0xe7, 0x54, 0xa3, 0x9c, 0x5f, 0x96, 0x73, 0x2a,
  0x51, 0xce, 0xbf, 0x90, 0x73, 0xca, 0x51, 0xce, 0xbf, 0x94, 0x73, 0x4a,
  0x51, 0xce, 0xbf, 0xa2, 0x39, 0xd5, 0x64, 0x3d, 0x3f, 0x4c, 0xb6, 0x94,
  0xf5, 0xcf, 0x37, 0x34, 0x67, 0x39, 0x89, 0xed, 0xd7, 0xe5, 0x5e, 0xa8,
  0x46, 0xbd, 0xf0, 0x1b, 0x51, 0x3d, 0xb1, 0x9c, 0xdf, 0x4c, 0xb6, 0x94,
  0xe5, 0xfc, 0x96, 0x8a, 0x07, 0xba, 0xba, 0x97, 0x7f, 0x5b, 0x85, 0x45,
  0x57, 0xd7, 0xf8, 0x3b, 0x69, 0x78, 0xab, 0x49, 0x1a, 0x7e, 0x57, 0x25,
  0xbf, 0x71, 0x58, 0xd6, 0xfa, 0xdf, 0x4b, 0xf2, 0x92, 0x61, 0xf9, 0xd7,
  0xaa, 0x1c, 0x5d, 0xcd, 0xa9, 0xdf, 0x57, 0xf5, 0x88, 0xb2, 0xd5, 0xff,
  0xef, 0xef, 0xff, 0xc1, 0x1f, 0x51, 0xe0, 0x52, 0xbc, 0x2b, 0x20, 0xeb,
  0x8f, 0x69, 0x56, 0x59, 0x91, 0xf5, 0x27, 0x34, 0xab, 0xa2, 0xc8, 0xfa,
  0x53, 0xb9, 0x76, 0x31, 0xeb, 0xcf, 0x68, 0x56, 0x4d, 0x91, 0xf5, 0xe7,
  0x34, 0xab, 0xae, 0xc8, 0xfa, 0x8b, 0xe4, 0x50, 0x2a, 0xb1, 0xac, 0xbf,
  0x4c, 0x8e, 0x3f, 0x9e, 0xf5, 0x57, 0xc9, 0x41, 0xcb, 0xb3, 0xfe, 0x3a,
  0x39, 0xd2, 0x79, 0xd6, 0xdf, 0x24, 0xd5, 0x03, 0xcf, 0xfa, 0xdb, 0xa4,
  0x4e, 0xe1, 0x59, 0x7f, 0xa7, 0x1a, 0x1c, 0x9c, 0xe1, 0xcb, 0x31, 0xe0,
  0xbf, 0x9f, 0x04, 0x5c, 0x8c, 0x01, 0xff, 0x83, 0x6a, 0xa0, 0xa4, 0x01,
  0xff, 0xe3, 0x24, 0xe0, 0x18, 0x19, 0x7f, 0xa8, 0x50, 0xab, 0xa5, 0x54,
  0xe0, 0x9f, 0x98, 0x04, 0x5c, 0x4e, 0xa4, 0x54, 0xa7, 0x22, 0xfc, 0xc9,
  0x24, 0xc2, 0x32, 0xcb, 0xfa, 0xa9, 0x64, 0x56, 0x85, 0x65, 0xfd, 0x74,
  0x32, 0xab, 0xc6, 0xb2, 0x7e, 0x26, 0x99, 0x55, 0x67, 0x59, 0x3f, 0x9b,
  0xcc, 0x5a, 0x66, 0x59, 0x3f, 0x27, 0x4b, 0x5d, 0x39, 0x92, 0xba, 0x3f,
  0xfc, 0x79, 0x59, 0x56, 0x2b, 0x42, 0xd6, 0x2f, 0xc8, 0xc2, 0x5f, 0x13,
  0xb2, 0x7e, 0x51, 0x1e, 0x32, 0x75, 0x21, 0xeb, 0x97, 0xe4, 0x81, 0xb6,
  0x2c, 0x64, 0x7d, 0x93, 0x54, 0xbb, 0x65, 0x49, 0x45, 0x44, 0x29, 0x65,
  0xc6, 0xf0, 0x28, 0xa5, 0x9e, 0x48, 0xe1, 0x5d, 0x20, 0xe3, 0xa9, 0x26,
  0xf0, 0xd4, 0x13, 0x78, 0xa2, 0x14, 0x4a, 0xd8, 0xaf, 0xcb, 0xcd, 0x91,
  0x81, 0x8b, 0x89, 0x4a, 0xcb, 0x89, 0x4a, 0xcb, 0x89, 0x4a, 0xab, 0x09,
  0x3c, 0xd5, 0x04, 0x9e, 0x7a, 0x02, 0x4f, 0x9c, 0xb0, 0xdf, 0x48, 0x0e,
  0x7c, 0xb9, 0x38, 0x93, 0xa8, 0x71, 0xf8, 0xe6, 0x3b, 0x9a, 0x12, 0xbf,
  0x02, 0xa5, 0x2e, 0x4a, 0x3a, 0xbe, 0x91, 0x5d, 0xbc, 0xd4, 0x2f, 0x8a,
  0xd2, 0xaf, 0x92, 0x94, 0x46, 0x14, 0xe9, 0xaf, 0x32, 0x78, 0x9a, 0x4e,
  0xfe, 0x2d, 0xb1, 0xdf, 0x24, 0xff, 0xd7, 0x30, 0x9f, 0xa6, 0x95, 0xd8,
  0xbf, 0x45, 0xf6, 0x1b, 0x6a, 0x4e, 0x33, 0x8f, 0x80, 0x92, 0x1f, 0xc2,
  0xe8, 0x7b, 0x28, 0x35, 0x32, 0x47, 0x45, 0xbd, 0x50, 0x9b, 0x3b, 0x2c,
  0xc1, 0xbf, 0x99, 0x31, 0x60, 0xfc, 0x21, 0x0c, 0xb4, 0x87, 0x8a, 0x22,
  0xfd, 0x27, 0x19, 0x7c, 0xa1, 0xa6, 0x17, 0xe7, 0x0e, 0xe1, 0xdf, 0x12,
  0x4d, 0xff, 0x29, 0x06, 0x1f, 0x4f, 0xff, 0xe7, 0x1c, 0x3f, 0x26, 0x91,
  0x0c, 0x19, 0xdf, 0xbf, 0xe4, 0xf5, 0xa4, 0xe4, 0xff, 0x2b, 0x89, 0x3e,
  0x96, 0x1d, 0xa1, 0xff, 0x35, 0x89, 0xcc, 0x44, 0xf6, 0x0f, 0xe3, 0xd4,
  0xca, 0xc8, 0x7f, 0x23, 0x4e, 0xb4, 0x9c, 0xfd, 0x9b, 0xaa, 0xd2, 0xc5,
  0x30, 0xfb, 0x77, 0x54, 0xa5, 0xa3, 0xec, 0xdf, 0x4d, 0x70, 0x6a, 0xee,
  0x28, 0x51, 0xc5, 0xbf, 0x4f, 0xb0, 0x4d, 0x01, 0xf4, 0x1f, 0xd2, 0x31,
  0x45, 0xd5, 0xfd, 0xf7, 0x74, 0x4c, 0x11, 0xd0, 0xff, 0x48, 0xf4, 0x76,
  0x08, 0x14, 0x31, 0xed, 0x4f, 0x13, 0x5d, 0xaf, 0x00, 0xfa, 0xb3, 0x89,
  0x98, 0x8a, 0x14, 0xe8, 0x6f, 0x27, 0x62, 0x62, 0x40, 0x7f, 0xa7, 0xc6,
  0x24, 0x4a, 0xd1, 0x37, 0xbf, 0xa4, 0x46, 0x24, 0xc1, 0xfc, 0x59, 0xc4,
  0x25, 0xa9, 0xd1, 0xdf, 0xfc, 0x55, 0xc4, 0x19, 0x39, 0xe3, 0xcf, 0xe5,
  0x12, 0x21, 0x49, 0xdf, 0xfc, 0xb5, 0x5c, 0x22, 0xca, 0xf8, 0x0b, 0xb9,
  0x44, 0xd8, 0x45, 0xdf, 0xfc, 0x8d, 0x5c, 0x22, 0xca, 0xf8, 0xcb, 0x44,
  0x1d, 0x8c, 0xdc, 0xbf, 0x4d, 0xd4, 0xc1, 0x32, 0xa8, 0xc4, 0xb3, 0xed,
  0xed, 0xaf, 0xa0, 0xc9, 0x5f, 0x3c, 0x14, 0x6a, 0xf9, 0x60, 0x8c, 0x58,
  0xf9, 0x4f, 0x96, 0x9a, 0x8b, 0x52, 0xe1, 0xe7, 0x57, 0xa4, 0xf8, 0xaf,
  0xc8, 0xc5, 0x49, 0x09, 0x6b, 0x8c, 0xac, 0xe2, 0x3f, 0x41, 0x30, 0x48,
  0x89, 0x28, 0x15, 0x7f, 0x96, 0x68, 0xf1, 0x5f, 0x95, 0x8b, 0x87, 0xa3,
  0x52, 0x45, 0x04, 0x4b, 0x56, 0x51, 0xf1, 0x6b, 0x6a, 0x2a, 0x4a, 0x11,
  0x15, 0x51, 0x47, 0x72, 0x0a, 0x30, 0x25, 0x46, 0xcd, 0x0f, 0x65, 0x34,
  0x51, 0xdd, 0x21, 0x9a, 0x44, 0x02, 0xb4, 0xae, 0x14, 0x91, 0xc5, 0xf1,
  0x25, 0x12, 0x58, 0x05, 0xdf, 0xa4, 0x32, 0x5b, 0x6c, 0x33, 0x1d, 0x4d,
  0x02, 0xcf, 0xa3, 0x96, 0x53, 0x34, 0xbf, 0x9e, 0x6c, 0x6e, 0x2e, 0x6a,
  0x2e, 0x6f, 0x5c, 0x31, 0x6c, 0x6e, 0x5e, 0x68, 0x6e, 0x3e, 0xa2, 0xe6,
  0x37, 0x54, 0xd4, 0xe4, 0xe2, 0xcd, 0xcd, 0xc5, 0x9a, 0x5b, 0x94, 0x99,
  0x90, 0x8b, 0x73, 0x45, 0x68, 0xee, 0x6f, 0x26, 0x7a, 0xb7, 0x28, 0x36,
  0x46, 0xe8, 0xc6, 0xb0, 0x77, 0xe5, 0x4e, 0xa7, 0x68, 0x7e, 0x2b, 0xde,
  0x2d, 0x62, 0x5b, 0xc4, 0xdf, 0x45, 0x75, 0xef, 0x16, 0x29, 0x9a, 0xdf,
  0x9e, 0xd8, 0xbb, 0xca, 0x76, 0x14, 0x13, 0xbd, 0xab, 0xe4, 0x0a, 0xab,
  0xe0, 0x77, 0x52, 0xf9, 0x29, 0xb6, 0x99, 0x70, 0x41, 0xdd, 0xf5, 0x14,
  0xcd, 0xef, 0xc6, 0xd1, 0x88, 0x6d, 0x91, 0xda, 0xa5, 0xee, 0x5d, 0x46,
  0xcd, 0xef, 0xa5, 0xca, 0x5a, 0xaa, 0x30, 0x17, 0xe7, 0xe2, 0x42, 0xa0,
  0x14, 0x66, 0x56, 0xc1, 0xbf, 0x4e, 0xe9, 0xdd, 0x52, 0x4a, 0x67, 0x4e,
  0x1c, 0xc1, 0xbf, 0xff, 0xa9, 0x7a, 0x44, 0xee, 0x72, 0x94, 0x0d, 0x8a,
  0xf0, 0xdf, 0xcc, 0x82, 0x70, 0xa6, 0xa1, 0x3b, 0x37, 0x9b, 0xa8, 0xd0,
  0x6a, 0xff, 0x6d, 0x3a, 0x53, 0xd4, 0xa3, 0x7d, 0xd2, 0x38, 0xff, 0x77,
  0x69, 0x92, 0xc0, 0xba, 0xfc, 0xa3, 0xd5, 0xed, 0xbf, 0x57, 0x2b, 0x0e,
  0x99, 0x9f, 0x9f, 0xa6, 0x07, 0xd4, 0x02, 0x45, 0xab, 0xfd, 0x0f, 0x9f,
  0x3a, 0xc7, 0xc8, 0x22, 0x83, 0x6c, 0xa4, 0x08, 0xff, 0xa3, 0x8a, 0x31,
  0xa5, 0x74, 0x7d, 0x37, 0x51, 0xeb, 0xff, 0xa7, 0x8f, 0xa4, 0x6e, 0x12,
  0x53, 0x3e, 0x62, 0x2e, 0xf8, 0xcf, 0x13, 0x94, 0xa3, 0x50, 0xe5, 0xec,
  0x53, 0xf1, 0x7f, 0xf9, 0x38, 0xa6, 0x4c, 0x56, 0x96, 0xff, 0x35, 0x55,
  0x97, 0x09, 0x9d, 0x33, 0xa3, 0x4e, 0xf9, 0x88, 0xe1, 0xf3, 0xdf, 0x66,
  0x1a, 0x3e, 0x33, 0xb1, 0xe3, 0xbf, 0x4f, 0x67, 0xc7, 0xac, 0xc3, 0xe6,
  0x7f, 0x7c, 0xd2, 0x44, 0x39, 0xa3, 0x72, 0xf9, 0xf6, 0x99, 0xf8, 0xc7,
  0xcc, 0x08, 0x2c, 0x61, 0x53, 0x8a, 0xdc, 0xd0, 0xfb, 0x93, 0xd0, 0xf0,
  0x2d, 0x22, 0x1f, 0x58, 0xea, 0x9f, 0xc6, 0x60, 0xe7, 0x62, 0xf9, 0xdc,
  0x5c, 0x16, 0xad, 0x59, 0x5d, 0x69, 0x7a, 0xfe, 0xbd, 0xc2, 0xbc, 0xd5,
  0x95, 0x26, 0xe7, 0x3f, 0x28, 0xcc, 0x5a, 0x5d, 0x69, 0x32, 0xff, 0xa3,
  0xc2, 0x9c, 0xd5, 0x55, 0xa6, 0xf2, 0x0f, 0x7f, 0x79, 0x0a, 0x64, 0xb4,
  0xbc, 0xf9, 0x17, 0x53, 0x6a, 0x8f, 0x16, 0x1d, 0xbf, 0x32, 0x05, 0x67,
  0xb4, 0xd0, 0xf9, 0xd5, 0x29, 0x5c, 0x8a, 0x70, 0x7e, 0x33, 0x85, 0x4b,
  0x11, 0x9d, 0xbf, 0x3e, 0x9d, 0x4e, 0xd6, 0xf6, 0xdf, 0x9a, 0x82, 0x33,
  0xa2, 0xf3, 0xb7, 0xa7, 0xd3, 0xc9, 0x70, 0xfe, 0x5e, 0x72, 0xe1, 0xad,
  0x26, 0xf3, 0x5f, 0xa7, 0xaf, 0xb8, 0xd5, 0x98, 0x7f, 0x3f, 0x75, 0x91,
  0xac, 0xe6, 0xd8, 0xbf, 0x99, 0xc0, 0x07, 0x69, 0xed, 0xff, 0x6f, 0x27,
  0x74, 0x97, 0x6a, 0xbd, 0xfd, 0xef, 0xd2, 0xd8, 0x96, 0xb6, 0x39, 0xf0,
  0x1f, 0x27, 0xf3, 0x24, 0x62, 0xf3, 0x7f, 0x4a, 0xdd, 0x45, 0x50, 0xb3,
  0xe4, 0x3f, 0xa7, 0xae, 0xfc, 0xd5, 0x2c, 0xf9, 0x2f, 0x13, 0xba, 0x51,
  0x62, 0xc9, 0x7f, 0x9d, 0x89, 0x25, 0x11, 0xe1, 0xff, 0x2d, 0x95, 0x25,
  0x89, 0x96, 0x10, 0xf8, 0x3f, 0x98, 0xad, 0xf3, 0xa3, 0x0a, 0xfe, 0x70,
  0x26, 0xce, 0x44, 0x2c, 0xff, 0x9f, 0x69, 0x0d, 0x88, 0x6f, 0x14, 0xfd,
  0x51, 0x72, 0x63, 0x49, 0xcd, 0xbb, 0x3f, 0x4e, 0x13, 0xa7, 0x94, 0x26,
  0xfe, 0x49, 0x1a, 0xaf, 0xd3, 0xa4, 0xe4, 0xcf, 0x67, 0x92, 0xef, 0x88,
  0x25, 0x7f, 0x31, 0x53, 0xe7, 0x47, 0xf8, 0x93, 0x4b, 0xfc, 0xa2, 0x9a,
  0x25, 0x7f, 0x35, 0x95, 0x25, 0x4c, 0xfc, 0xfe, 0x7a, 0xea, 0x08, 0x93,
  0x29, 0xfe, 0x9b, 0xa9, 0xe2, 0x27, 0x13, 0xf2, 0xf7, 0x89, 0x71, 0x33,
  0xa7, 0xac, 0x4b, 0xae, 0xe5, 0x1f, 0xd2, 0x4b, 0x4d, 0xe0, 0xce, 0x3f,
  0xa6, 0x8c, 0xd1, 0x18, 0x73, 0xbe, 0x49, 0x6e, 0x44, 0xce, 0x29, 0x47,
  0x89, 0xbc, 0x21, 0xf3, 0x13, 0x49, 0xde, 0xcf, 0x4d, 0x15, 0xb9, 0x6f,
  0x7e, 0x32, 0xbd, 0x23, 0xa4, 0x2d, 0xa5, 0x9f, 0x9a, 0x3e, 0x9a, 0x14,
  0xdd, 0xf1, 0xcd, 0x4f, 0x4f, 0x1d, 0x53, 0x8a, 0x4e, 0xf9, 0xe6, 0x67,
  0x26, 0x8b, 0xa9, 0x7a, 0x34, 0x7c, 0xf3, 0xb3, 0x93, 0x85, 0x35, 0x65,
  0x4c, 0x7c, 0xf3, 0x73, 0x33, 0xcc, 0xe3, 0x73, 0x89, 0x3e, 0xfa, 0xf9,
  0xe9, 0x92, 0x9e, 0xdc, 0x2a, 0xfc, 0xe6, 0x17, 0xa6, 0xcf, 0x17, 0xc9,
  0xad, 0xca, 0x6f, 0x7e, 0x71, 0xba, 0x4a, 0x4d, 0x6e, 0x95, 0x7e, 0xc3,
  0xb7, 0x9b, 0x0b, 0x74, 0x4f, 0xa2, 0x50, 0xa5, 0x24, 0xd5, 0xe9, 0xd7,
  0x6a, 0x08, 0xf7, 0xcb, 0x7c, 0xf7, 0x6d, 0x32, 0xdc, 0x0f, 0x79, 0x57,
  0x16, 0x8a, 0xf5, 0xfa, 0x32, 0xcd, 0x2c, 0xb3, 0x5f, 0x47, 0xb4, 0xd0,
  0x21, 0x2d, 0x74, 0x54, 0x58, 0xae, 0x54, 0x2a, 0xac, 0x38, 0xfd, 0x45,
  0x31, 0xfc, 0x0c, 0xaf, 0xe9, 0x93, 0x31, 0x84, 0x5c, 0x2f, 0x32, 0xce,
  0x96, 0x29, 0x38, 0x83, 0xad, 0xd6, 0x18, 0xdb, 0x59, 0x2e, 0x43, 0xbd,
  0xc2, 0x30, 0xd5, 0x42, 0x3c, 0xbf, 0x10, 0x52, 0xf2, 0x59, 0x78, 0xbe,
  0x11, 0xed, 0x35, 0x26, 0x5b, 0x55, 0xda, 0x15, 0x75, 0xfa, 0xb5, 0x4a,
  0xe1, 0xf8, 0xd6, 0xfe, 0x14, 0xb8, 0x1f, 0x0a, 0x22, 0x4c, 0x98, 0x44,
  0x33, 0x91, 0x49, 0x14, 0xba, 0x4a, 0x13, 0xea, 0xf4, 0x0b, 0x99, 0xc4,
  0x8a, 0xc3, 0x2f, 0x8a, 0xe1, 0xe7, 0x84, 0x9a, 0x3e, 0x0d, 0x83, 0x28,
  0x6d, 0x45, 0x36, 0xce, 0xca, 0x14, 0x9c, 0xc1, 0x56, 0xf9, 0xe8, 0x63,
  0x22, 0xce, 0x2a, 0x59, 0x65, 0xcc, 0xfd, 0x25, 0x91, 0x84, 0x4f, 0x40,
  0xf0, 0xcd, 0x1f, 0x4c, 0xd8, 0x78, 0xcd, 0x05, 0x4b, 0x85, 0x52, 0x6d,
  0xb1, 0x50, 0x1b, 0xcf, 0x6d, 0x27, 0x92, 0x74, 0x82, 0x54, 0x8f, 0x36,
  0x5a, 0xfe, 0xf0, 0x33, 0x31, 0x15, 0x43, 0x4c, 0xff, 0x73, 0xe2, 0x8a,
  0x38, 0x81, 0x29, 0x9f, 0x8e, 0xe9, 0x8f, 0x3e, 0x13, 0x13, 0x6d, 0x1d,
  0x3a, 0xd2, 0x2b, 0x1d, 0x80, 0x1e, 0x32, 0xff, 0xeb, 0x27, 0xb1, 0x8a,
  0x4e, 0xb4, 0x9c, 0xa2, 0x4a, 0x03, 0xb4, 0x5a, 0x70, 0x3f, 0xb4, 0x1a,
  0x45, 0x9d, 0x5c, 0x15, 0x78, 0x66, 0x76, 0x3a, 0x78, 0xa9, 0xa7, 0x0c,
  0x44, 0xfd, 0xaf, 0x9f, 0xfc, 0x63, 0x56, 0x22, 0x5f, 0xd2, 0xf3, 0xa1,
  0xfe, 0x3a, 0x84, 0xaf, 0x12, 0xea, 0x1a, 0x52, 0xae, 0xa4, 0xe3, 0x03,
  0xc3, 0xbc, 0x58, 0x49, 0xc6, 0x52, 0x22, 0x58, 0xfe, 0x84, 0x61, 0x61,
  0x0b, 0x36, 0x8a, 0x28, 0xaa, 0x57, 0x2c, 0x4f, 0xab, 0xfd, 0x53, 0x56,
  0xa0, 0x4c, 0x6b, 0xa5, 0x45, 0xca, 0x1f, 0x57, 0xe9, 0x9f, 0x89, 0x8d,
  0xc5, 0x55, 0xe2, 0x36, 0x68, 0xfa, 0x1a, 0x20, 0xc1, 0xd3, 0xc3, 0xc2,
  0xf2, 0x72, 0x9d, 0x70, 0x6c, 0x6e, 0x1b, 0xbf, 0xca, 0xe5, 0xaa, 0x4e,
  0x73, 0xc9, 0x89, 0xa2, 0x9a, 0x23, 0x14, 0xed, 0x9f, 0x33, 0xb4, 0xa0,
  0x1a, 0x00, 0x65, 0xa1, 0x5a, 0x46, 0x8c, 0xa8, 0x02, 0x56, 0xca, 0xa0,
  0xa3, 0x96, 0x89, 0x2e, 0xd8, 0xc6, 0xef, 0xd2, 0x32, 0xe2, 0xc4, 0x7c,
  0x20, 0xbf, 0x1c, 0x22, 0x55, 0xd2, 0xfa, 0x17, 0x22, 0x83, 0x4a, 0x94,
  0xd6, 0x6a, 0x75, 0x45, 0x27, 0xe7, 0x9f, 0x84, 0x56, 0xc2, 0x82, 0xed,
  0x62, 0x48, 0x2b, 0xe6, 0x92, 0x73, 0x50, 0x25, 0x17, 0x29, 0xd6, 0xbf,
  0xe4, 0xa4, 0xae, 0xb0, 0xd6, 0x2f, 0x13, 0x8c, 0xa8, 0xd4, 0x08, 0xb1,
  0xe5, 0x32, 0x45, 0x8a, 0xd4, 0x31, 0x72, 0x11, 0x04, 0x2b, 0x59, 0x11,
  0xe8, 0x4d, 0x22, 0xfe, 0x2b, 0x2e, 0x15, 0x20, 0x76, 0x54, 0x2c, 0x50,
  0xfe, 0x88, 0x64, 0xd0, 0x1f, 0x9c, 0x28, 0x02, 0xfd, 0xd7, 0x29, 0xd0,
  0xb3, 0x77, 0xe5, 0xdf, 0x70, 0xf6, 0x70, 0x0c, 0x79, 0x5e, 0x5f, 0x49,
  0x51, 0xdf, 0xdf, 0xa5, 0x42, 0x33, 0x0a, 0x24, 0xe8, 0xbf, 0x4f, 0x81,
  0x9e, 0x9d, 0xba, 0x7f, 0x48, 0xe5, 0x46, 0x29, 0x56, 0x5f, 0xda, 0xe0,
  0xbc, 0x00, 0x2c, 0x7f, 0x9b, 0xb9, 0x4c, 0xf1, 0xdd, 0xbb, 0x20, 0x54,
  0x5e, 0x4e, 0x28, 0xfb, 0x8f, 0x13, 0xcb, 0xfe, 0x35, 0x29, 0x9b, 0xf4,
  0x14, 0x14, 0x2e, 0x8f, 0xd9, 0x34, 0x88, 0x2c, 0x5e, 0xb0, 0xc5, 0xc0,
  0x4e, 0xf4, 0x1c, 0xbe, 0x9b, 0xee, 0x1c, 0x78, 0x61, 0x93, 0x4b, 0xc0,
  0x5d, 0xee, 0x2e, 0x1d, 0xbb, 0xf4, 0xc9, 0x82, 0x5b, 0xf1, 0xfb, 0x68,
  0xae, 0x51, 0x6c, 0xba, 0x61, 0x74, 0xc9, 0xa6, 0x1b, 0x5d, 0xa2, 0x35,
  0x8d, 0xe0, 0xc2, 0xbd, 0xd4, 0xfb, 0x86, 0xb7, 0xb4, 0xa2, 0x0f, 0x0c,
  0x67, 0x69, 0xa5, 0x69, 0x91, 0xc8, 0x75, 0xf8, 0x32, 0x50, 0xd6, 0xce,
  0x99, 0x85, 0xbb, 0xc5, 0xbe, 0xee, 0xc3, 0xdf, 0xfb, 0xc5, 0x81, 0x6e,
  0x16, 0x6e, 0xe1, 0xcb, 0x2c, 0xf4, 0x17, 0x07, 0xda, 0x78, 0x0c, 0x75,
  0x75, 0x39, 0xd9, 0x9a, 0x1e, 0x86, 0xd2, 0xec, 0x19, 0x1e, 0xa3, 0xae,
  0x97, 0x42, 0x9d, 0x47, 0x2f, 0xa4, 0x22, 0x65, 0x7d, 0xc3, 0x61, 0x8f,
  0x15, 0x36, 0xfb, 0x8f, 0x8f, 0xd9, 0x3e, 0x09, 0xbd, 0x79, 0x64, 0x0e,
  0xf1, 0x2a, 0x2e, 0x26, 0xeb, 0x7d, 0x8d, 0x47, 0x8f, 0xc5, 0x60, 0x81,
  0x61, 0x4c, 0x3d, 0x44, 0x9f, 0xf1, 0x49, 0xd4, 0xcd, 0xcc, 0xbc, 0x81,
  0xbd, 0xeb, 0x76, 0xe7, 0x06, 0x5a, 0xd0, 0xf7, 0xdc, 0xdb, 0x39, 0xc4,
  0xb1, 0xeb, 0x79, 0xd0, 0xf8, 0xaf, 0xce, 0x1d, 0xeb, 0x6e, 0x48, 0xa2,
  0x1b, 0xcd, 0x85, 0x65, 0xe7, 0x10, 0x7c, 0x2e, 0xf3, 0xc5, 0xc3, 0x60,
  0x9c, 0xf9, 0x8a, 0x87, 0x48, 0xec, 0x13, 0x32, 0x06, 0xc4, 0x55, 0x7d,
  0xbe, 0x2d, 0x44, 0xc2, 0xbc, 0x28, 0xf2, 0xd7, 0x75, 0x30, 0x44, 0x3a,
  0xff, 0xe9, 0x18, 0xe1, 0xb3, 0xd8, 0x78, 0x41, 0xd8, 0xdb, 0x61, 0x37,
  0xa4, 0x0b, 0x6d, 0x0c, 0xeb, 0x62, 0xb1, 0x0e, 0xcb, 0x66, 0x28, 0x4c,
  0x46, 0x6b, 0x3a, 0xec, 0xf5, 0x34, 0x1b, 0x5a, 0xc6, 0xde, 0xdb, 0xf6,
  0x58, 0xc3, 0x5c, 0x83, 0x3c, 0x19, 0x42, 0x68, 0x3f, 0xe8, 0xee, 0x99,
  0x03, 0xff, 0x5e, 0xcb, 0x3a, 0x34, 0x02, 0x8c, 0x83, 0x91, 0x86, 0xb3,
  0x99, 0x72, 0x27, 0xa3, 0x61, 0x94, 0x41, 0x6c, 0xd9, 0xc1, 0xb5, 0xd9,
  0x23, 0xc1, 0x24, 0xb3, 0xc0, 0x49, 0x4a, 0x3e, 0x91, 0x1a, 0xbd, 0x8b,
  0xb4, 0x0f, 0x68, 0x2c, 0x69, 0xff, 0x95, 0x1d, 0xf4, 0xb3, 0x99, 0xef,
  0x41, 0xb1, 0x8e, 0x31, 0x34, 0x3d, 0xdf, 0x3a, 0xc0, 0x20, 0xa2, 0xec,
  0xea, 0x6a, 0x49, 0xaf, 0x68, 0x7a, 0xa9, 0xae, 0xe9, 0x57, 0xc9, 0xbc,
  0x8a, 0x5e, 0xa3, 0x79, 0xa3, 0x64, 0x5e, 0x4d, 0x5f, 0xa6, 0x79, 0x5d,
  0x63, 0xc0, 0x83, 0xaa, 0x2e, 0x2f, 0x2c, 0x24, 0xe0, 0x96, 0xf5, 0x55,
  0x02, 0xf7, 0xf8, 0x58, 0x0a, 0x63, 0xc1, 0xcc, 0xcb, 0x94, 0xe1, 0x9d,
  0x33, 0x20, 0x6e, 0xb6, 0x0e, 0x23, 0x57, 0xd6, 0xe6, 0x40, 0x9a, 0xaf,
  0xcd, 0x80, 0x75, 0xdc, 0xdc, 0x6d, 0xdf, 0x72, 0xe6, 0x3a, 0xd4, 0x61,
  0x64, 0x6e, 0x68, 0xe2, 0xad, 0x44, 0x67, 0xae, 0x87, 0xd7, 0x1a, 0xa1,
  0x4f, 0x2f, 0x18, 0x47, 0x2e, 0x81, 0x4e, 0x7f, 0xd4, 0xa2, 0x82, 0x02,
  0xe4, 0x0f, 0xc2, 0x00, 0xab, 0x1a, 0xb9, 0xd0, 0x1d, 0x90, 0x80, 0x9b,
  0x85, 0x6b, 0x73, 0x48, 0x5e, 0xf4, 0x21, 0x0d, 0xd9, 0x1b, 0xb8, 0x66,
  0x40, 0x22, 0x1a, 0x8f, 0xe5, 0xc0, 0xb5, 0x9e, 0xf4, 0x0a, 0x93, 0x0f,
  0x69, 0xfe, 0x9a, 0xdd, 0xf4, 0x21, 0xcd, 0x2c, 0x74, 0xa0, 0x3f, 0x2e,
  0xaa, 0x8b, 0x59, 0x6b, 0xd1, 0xce, 0xf9, 0xda, 0xa5, 0xd1, 0xd1, 0xe3,
  0x69, 0xb9, 0xd2, 0xa5, 0x71, 0x95, 0x4c, 0x2d, 0x5f, 0x1a, 0xa3, 0x64,
  0x6a, 0x05, 0xd4, 0x09, 0xbe, 0xde, 0xe4, 0x5f, 0x2e, 0x66, 0xcb, 0xb5,
  0xda, 0x62, 0x57, 0x6b, 0xba, 0x85, 0xe1, 0x28, 0x88, 0xfa, 0xde, 0xc4,
  0x59, 0x02, 0xa3, 0x64, 0x2a, 0x64, 0xc7, 0x62, 0x52, 0xf8, 0x8c, 0x72,
  0x25, 0xeb, 0x90, 0xc0, 0x94, 0x20, 0x40, 0x7d, 0x32, 0xa8, 0x30, 0xc8,
  0xc2, 0x58, 0x18, 0x4b, 0x46, 0x5b, 0x17, 0xc7, 0x3c, 0x1b, 0x9e, 0x38,
  0xbc, 0x7b, 0x8a, 0xe1, 0x3d, 0x4c, 0xf3, 0x64, 0x66, 0x83, 0x7e, 0x38,
  0x49, 0x25, 0xe9, 0xae, 0xf6, 0x60, 0x49, 0x4f, 0x96, 0x89, 0x63, 0x3a,
  0x7c, 0x58, 0xfe, 0x02, 0x2a, 0xbd, 0x84, 0x01, 0xcd, 0xfc, 0xb1, 0x61,
  0x24, 0x79, 0xb6, 0xe5, 0x63, 0xcc, 0x45, 0xa2, 0x34, 0x02, 0xd0, 0x51,
  0x24, 0x08, 0x25, 0x34, 0x10, 0x5f, 0x2a, 0xa3, 0x97, 0x58, 0xe9, 0xdd,
  0x4e, 0x77, 0xf1, 0x78, 0x74, 0xdd, 0xb2, 0xbc, 0x42, 0x24, 0x94, 0x9a,
  0x1e, 0x18, 0x19, 0x4e, 0x4d, 0xc6, 0xe0, 0xda, 0xa2, 0xbd, 0xd1, 0xce,
  0x82, 0x01, 0x07, 0x76, 0x42, 0x6d, 0xc9, 0x59, 0xf4, 0xb4, 0x46, 0x5b,
  0x78, 0xd9, 0x7e, 0x40, 0x5e, 0xb6, 0xe7, 0x32, 0x32, 0x07, 0x92, 0xfa,
  0xc0, 0x83, 0x46, 0x0e, 0x30, 0xc2, 0x6f, 0xdb, 0x30, 0x59, 0x1c, 0x06,
  0xae, 0x2c, 0xdc, 0x81, 0x55, 0xb0, 0xa8, 0x0c, 0x6f, 0xbb, 0xa3, 0x41,
  0x67, 0xce, 0x71, 0x41, 0x83, 0xdb, 0x4e, 0x27, 0x14, 0x52, 0x9b, 0x5d,
  0xc9, 0x43, 0x66, 0xa1, 0x30, 0xa3, 0x24, 0x07, 0x44, 0x05, 0xe1, 0xc5,
  0x71, 0xdb, 0x19, 0x59, 0x63, 0x1e, 0xfa, 0x42, 0x94, 0x5a, 0x49, 0x54,
  0x9b, 0x1d, 0x12, 0x88, 0xbd, 0x73, 0x51, 0x82, 0x7f, 0xdb, 0xc0, 0xda,
  0x7e, 0xb6, 0x43, 0x18, 0x8b, 0x0c, 0xc6, 0x08, 0x55, 0x1a, 0x76, 0x2d,
  0x65, 0x30, 0xe1, 0x4c, 0x7b, 0xe0, 0xfa, 0x16, 0xe5, 0x13, 0xd1, 0xd8,
  0xc3, 0x70, 0xa2, 0x19, 0x09, 0x9d, 0x7a, 0x93, 0x36, 0x7b, 0x41, 0x9f,
  0xb2, 0x4b, 0x7a, 0xf3, 0x37, 0x0b, 0x0b, 0x59, 0x75, 0x9f, 0xea, 0x03,
  0xce, 0x9d, 0x36, 0xd1, 0x50, 0x58, 0x5d, 0x79, 0xa7, 0xd9, 0x2e, 0x78,
  0x54, 0xa0, 0xe8, 0x6c, 0x44, 0x88, 0xb1, 0x87, 0xd9, 0x36, 0xfe, 0x12,
  0xba, 0xaf, 0xc9, 0x1b, 0xed, 0x2e, 0x95, 0xca, 0x4d, 0xb1, 0x2f, 0x07,
  0x8b, 0x1d, 0xa1, 0x4b, 0x5c, 0xda, 0x25, 0x1d, 0x45, 0xa7, 0xb4, 0x0d,
  0x17, 0x3b, 0xe5, 0x0a, 0x3a, 0xa5, 0x4d, 0x3b, 0xe5, 0xea, 0x73, 0x3a,
  0xa5, 0xad, 0xea, 0x94, 0x11, 0xc6, 0xf8, 0x4a, 0xe9, 0x94, 0x11, 0xe9,
  0x94, 0x11, 0xe9, 0x94, 0x2b, 0xd2, 0x29, 0xa3, 0xa8, 0x53, 0xc0, 0x80,
  0xd1, 0xb3, 0x38, 0x71, 0x84, 0x56, 0xcc, 0xc6, 0x46, 0x51, 0x5b, 0xcc,
  0x76, 0x96, 0xca, 0x1a, 0x66, 0x88, 0x06, 0x4d, 0x94, 0x03, 0xfd, 0x58,
  0x22, 0xd7, 0x75, 0x51, 0x5a, 0x37, 0xb2, 0xa9, 0x83, 0x46, 0x8f, 0x7a,
  0x5b, 0x6b, 0xd0, 0xf4, 0x44, 0xbf, 0x03, 0x45, 0x37, 0x92, 0x7d, 0xa1,
  0x63, 0x14, 0x22, 0xc6, 0x77, 0x87, 0x4f, 0xb9, 0x4d, 0xde, 0xb9, 0x73,
  0x2e, 0xed, 0x5e, 0x0c, 0x8b, 0xc2, 0xc6, 0x72, 0x18, 0x8f, 0x31, 0x7c,
  0xeb, 0x83, 0x44, 0x6b, 0xb5, 0xb5, 0x31, 0x37, 0x23, 0x1e, 0xb6, 0xf9,
  0xca, 0x09, 0x3b, 0xf7, 0x83, 0x6d, 0xe1, 0xfb, 0x4a, 0x37, 0xd6, 0x99,
  0x9b, 0x0d, 0x5f, 0x60, 0x80, 0x7f, 0xca, 0xf8, 0x4f, 0x05, 0xff, 0xa9,
  0xe2, 0x3f, 0xb5, 0x4b, 0x4d, 0x3f, 0x8c, 0xca, 0x61, 0xcf, 0x8b, 0x05,
  0x34, 0xfd, 0x28, 0xca, 0x24, 0x21, 0x43, 0xc4, 0xcc, 0x71, 0x44, 0x70,
  0x5f, 0x92, 0x47, 0x93, 0x85, 0x07, 0x2d, 0x46, 0xe2, 0x61, 0xa9, 0x55,
  0xfc, 0xe3, 0x63, 0xa8, 0x25, 0x50, 0xdf, 0x93, 0x38, 0x6f, 0xfc, 0x79,
  0xc0, 0x72, 0x62, 0x6e, 0xca, 0x9c, 0xb9, 0xee, 0x5c, 0x17, 0x3e, 0x4d,
  0xaf, 0x47, 0x26, 0x7b, 0x2a, 0x30, 0x82, 0x04, 0x65, 0xe2, 0xb1, 0xce,
  0xdb, 0xd1, 0xfb, 0x7d, 0x46, 0x59, 0x6b, 0x83, 0x4a, 0x5f, 0x34, 0x82,
  0x7c, 0x7f, 0xd1, 0xcc, 0x0f, 0x16, 0x4d, 0xdd, 0x59, 0x58, 0xc0, 0x58,
  0xbc, 0x98, 0x8c, 0x51, 0x98, 0xe0, 0x8f, 0xe1, 0x66, 0x85, 0x88, 0x94,
  0x98, 0x92, 0x2b, 0xd4, 0x34, 0xb4, 0x6b, 0x03, 0x1d, 0x43, 0x0d, 0x91,
  0x14, 0xc3, 0xcf, 0x01, 0x06, 0xa1, 0xa6, 0x52, 0x4a, 0x4d, 0xf6, 0x47,
  0xd5, 0x60, 0x0b, 0x35, 0x78, 0xfc, 0x96, 0x58, 0x1b, 0x4c, 0xe6, 0x5a,
  0xfd, 0xf3, 0xae, 0xc8, 0xb8, 0x2d, 0xdf, 0x02, 0x51, 0xd8, 0x89, 0xa2,
  0x13, 0xec, 0xd8, 0xc0, 0x3e, 0x5f, 0x7d, 0xc9, 0x65, 0xa5, 0x46, 0xae,
  0x6b, 0x4f, 0x2c, 0x24, 0xab, 0x21, 0x3a, 0x29, 0x78, 0x44, 0x8e, 0x83,
  0xc2, 0x29, 0x09, 0xc4, 0x7f, 0x42, 0x8b, 0x7b, 0xd9, 0x6c, 0x00, 0x44,
  0x73, 0xec, 0x41, 0x01, 0xc7, 0x3e, 0x49, 0x83, 0x81, 0x05, 0xdd, 0x68,
  0xe1, 0x25, 0x7f, 0x8b, 0xf6, 0xfc, 0xbc, 0x2f, 0x3c, 0xb9, 0x33, 0x9f,
  0xcd, 0x08, 0xd1, 0x14, 0xb6, 0x69, 0x2c, 0xf5, 0x2d, 0xf7, 0x0e, 0xe3,
  0x17, 0x64, 0x6c, 0x67, 0xce, 0x0f, 0x23, 0xec, 0x78, 0x1b, 0x18, 0x40,
  0x06, 0x6a, 0x70, 0x50, 0xd9, 0xd1, 0xc7, 0xb5, 0xb3, 0xfc, 0x9e, 0xb6,
  0x16, 0x0e, 0x32, 0xbf, 0x90, 0x8a, 0x0f, 0x2d, 0x4c, 0xdb, 0x21, 0x51,
  0x50, 0x31, 0x5c, 0x86, 0x3b, 0x0d, 0x96, 0x2c, 0x09, 0xf0, 0xa3, 0xe9,
  0x60, 0x48, 0x7b, 0x17, 0xff, 0xb1, 0x31, 0xa4, 0x34, 0x46, 0x16, 0x6b,
  0xc2, 0x32, 0xe3, 0xc1, 0xe3, 0xec, 0x03, 0x06, 0x3d, 0xc0, 0x64, 0xdd,
  0xb8, 0x60, 0xad, 0xc9, 0x0f, 0x11, 0x65, 0x9e, 0xc5, 0x86, 0xcf, 0x43,
  0x56, 0xe6, 0x72, 0x0c, 0x83, 0xd8, 0x0c, 0xda, 0x7d, 0x28, 0x25, 0x35,
  0xc4, 0x8b, 0x9e, 0x25, 0xc4, 0x86, 0x52, 0x3b, 0xc3, 0xdd, 0x21, 0x97,
  0xaf, 0x4d, 0x7c, 0x0e, 0x9a, 0x5e, 0xc5, 0x8b, 0xb5, 0x5f, 0xc3, 0x9b,
  0xff, 0x15, 0xe1, 0x2d, 0xd0, 0x70, 0x90, 0xda, 0x42, 0x2c, 0x81, 0xda,
  0x72, 0xad, 0xb8, 0xb2, 0x66, 0x60, 0x28, 0x88, 0x35, 0x03, 0x3e, 0x6a,
  0x2b, 0xe3, 0x10, 0xce, 0x17, 0xe0, 0xac, 0x75, 0xa3, 0x54, 0x5e, 0xa9,
  0x95, 0xca, 0x04, 0x10, 0x7f, 0xae, 0x96, 0x1e, 0x1f, 0x49, 0xea, 0xf2,
  0x72, 0xb5, 0x1a, 0xa6, 0x96, 0x78, 0xea, 0x4a, 0xbd, 0x5a, 0xe4, 0xa9,
  0xcb, 0xf5, 0x65, 0x92, 0xba, 0x8a, 0x01, 0xc7, 0x30, 0x6d, 0x75, 0x75,
  0xa5, 0x42, 0x53, 0x56, 0x57, 0x58, 0xd9, 0x62, 0x69, 0xb9, 0x46, 0x92,
  0xea, 0xb5, 0x62, 0x99, 0xa6, 0xc1, 0xaf, 0xca, 0x2a, 0x43, 0xb7, 0x5a,
  0x5e, 0xe1, 0xe8, 0x56, 0x6b, 0x95, 0x1a, 0xaf, 0xba, 0x5a, 0xe7, 0x04,
  0x2d, 0x57, 0x57, 0x96, 0xc7, 0x9f, 0x30, 0x26, 0xda, 0xee, 0x35, 0x98,
  0x73, 0xd6, 0x31, 0x58, 0xf7, 0x2f, 0x4d, 0xcf, 0x36, 0x9d, 0xe0, 0xa4,
  0xdb, 0x05, 0xe3, 0xcc, 0xe0, 0x2b, 0x08, 0x1a, 0xa6, 0x55, 0x90, 0xf9,
  0x60, 0x52, 0xc4, 0x48, 0x1e, 0xf9, 0x02, 0x84, 0xbf, 0x6d, 0x0e, 0x30,
  0x56, 0x07, 0x46, 0x73, 0xd8, 0xbd, 0x76, 0xdf, 0xd9, 0xe4, 0x17, 0xde,
  0x97, 0xf3, 0x6c, 0xb4, 0xaa, 0x9f, 0xf1, 0x59, 0x9e, 0x20, 0x22, 0x99,
  0x89, 0x24, 0xd1, 0x9a, 0x8c, 0x02, 0x0e, 0x48, 0xa9, 0x62, 0x7c, 0x08,
  0x1c, 0x2e, 0x56, 0x52, 0x5b, 0x92, 0xf6, 0xce, 0x5d, 0x8f, 0x50, 0xfc,
  0x61, 0xd6, 0x6d, 0x59, 0x73, 0x5d, 0x2c, 0x9a, 0x09, 0x6f, 0xa0, 0x5a,
  0x34, 0xe6, 0x44, 0xac, 0x7a, 0x5b, 0x9f, 0x48, 0xb0, 0x22, 0x30, 0x05,
  0xc8, 0x4f, 0xb9, 0x28, 0x08, 0x53, 0x79, 0x99, 0x22, 0xa6, 0xcd, 0xf7,
  0xf5, 0x04, 0x6f, 0x24, 0xf5, 0x41, 0x16, 0xca, 0x3c, 0xc4, 0x85, 0x41,
  0x1e, 0x7f, 0xf7, 0xd6, 0x89, 0x8a, 0x6c, 0x5b, 0xf6, 0x20, 0x5b, 0x2a,
  0xd4, 0x16, 0x1d, 0x6d, 0x61, 0x81, 0xb2, 0x01, 0xa3, 0x8d, 0x43, 0x35,
  0xeb, 0x18, 0xb1, 0x71, 0x61, 0x1e, 0x25, 0x15, 0xfe, 0xd8, 0xf4, 0x8f,
  0x92, 0xb2, 0x4a, 0xb5, 0xca, 0x29, 0xab, 0xc3, 0xa8, 0xa8, 0x8c, 0xf1,
  0xe2, 0xac, 0x3e, 0xb9, 0x2f, 0x15, 0x88, 0x6c, 0x32, 0x59, 0x29, 0x32,
  0x56, 0xab, 0xcb, 0x65, 0x5e, 0xc1, 0x6a, 0xbd, 0x52, 0xe2, 0xf8, 0x53,
  0x84, 0x28, 0xc4, 0xc0, 0x11, 0x3c, 0xe0, 0xcb, 0x05, 0x0f, 0x74, 0x95,
  0xda, 0x78, 0x60, 0x6f, 0x5c, 0xeb, 0x74, 0x81, 0x8a, 0xfb, 0x33, 0xf8,
  0xcc, 0xb7, 0x22, 0x7d, 0xcc, 0x62, 0x02, 0x7d, 0x42, 0x51, 0x1d, 0x63,
  0x8e, 0x27, 0xd3, 0xc9, 0x2e, 0x0f, 0xfc, 0x09, 0xdc, 0x21, 0xe2, 0x67,
  0x91, 0x76, 0x52, 0x06, 0x89, 0xac, 0xff, 0x23, 0x3b, 0x25, 0x6b, 0xe5,
  0xe5, 0x98, 0xce, 0x81, 0x96, 0xb7, 0x35, 0xed, 0xfb, 0xf1, 0x44, 0x12,
  0x9d, 0x64, 0xb5, 0xfe, 0x39, 0xf1, 0x39, 0x28, 0x83, 0x5f, 0xa8, 0x02,
  0x82, 0xf3, 0x29, 0x8d, 0xbc, 0x38, 0x64, 0x2b, 0x9f, 0x2d, 0xa6, 0xcf,
  0xbb, 0x84, 0xaf, 0xff, 0x92, 0xc4, 0xbe, 0xe9, 0x87, 0xe8, 0xc2, 0xbb,
  0xec, 0x89, 0x77, 0xaa, 0x78, 0xc6, 0x8d, 0x6d, 0xdd, 0x0e, 0x5d, 0x2f,
  0x20, 0xd7, 0x78, 0x4f, 0xdd, 0x5b, 0xfe, 0x92, 0x10, 0x4f, 0xdf, 0x75,
  0x3a, 0x8a, 0xd4, 0x6d, 0x73, 0x38, 0xb4, 0x3a, 0x69, 0x65, 0x68, 0xae,
  0x5c, 0x92, 0xac, 0xd9, 0x41, 0x2e, 0xf9, 0xb7, 0x45, 0xa4, 0x34, 0xcc,
  0x95, 0xde, 0xec, 0x93, 0x2e, 0xe3, 0x8a, 0x4f, 0xf5, 0xf1, 0x99, 0x64,
  0x34, 0xec, 0xe0, 0xd3, 0x74, 0xcc, 0x58, 0x83, 0xb6, 0x44, 0x21, 0xcc,
  0x63, 0x98, 0x02, 0x05, 0x12, 0x5b, 0x9f, 0x0f, 0x1e, 0x1f, 0xe7, 0xed,
  0xc7, 0xc7, 0x80, 0x3e, 0x4a, 0x65, 0x13, 0xb3, 0x3b, 0xa0, 0x8f, 0x52,
  0xd9, 0x68, 0x13, 0x26, 0x82, 0x07, 0x30, 0x0e, 0x87, 0x17, 0x5b, 0xf8,
  0x13, 0x16, 0x7e, 0x81, 0x06, 0xfd, 0x0a, 0x1f, 0xb5, 0x23, 0x8f, 0xdf,
  0x79, 0xf8, 0x82, 0x14, 0xfd, 0x61, 0x46, 0x31, 0xc8, 0x1d, 0x5c, 0x68,
  0xf7, 0xa3, 0x67, 0xee, 0x5c, 0x3d, 0x7a, 0xd4, 0xce, 0x5c, 0x37, 0xf8,
  0xfb, 0x75, 0xfd, 0xb5, 0xe2, 0x86, 0x58, 0x67, 0x23, 0xab, 0xe8, 0xd6,
  0x62, 0x4a, 0xb7, 0xfa, 0x29, 0xbd, 0xea, 0x28, 0x7b, 0xd5, 0x9d, 0xd8,
  0xab, 0xe6, 0x84, 0x5e, 0xed, 0xc7, 0x7a, 0x95, 0x9a, 0xd3, 0x42, 0xc7,
  0x22, 0x4f, 0xb5, 0x71, 0x2c, 0x30, 0x38, 0x33, 0xb3, 0xf8, 0x4a, 0x30,
  0xd1, 0x2e, 0x7c, 0xef, 0x22, 0x1f, 0xf2, 0x96, 0xb3, 0x96, 0x13, 0xf0,
  0x46, 0xdd, 0xe6, 0x0d, 0x89, 0x92, 0x35, 0x43, 0xa0, 0x62, 0x23, 0x60,
  0x0f, 0x05, 0xf2, 0x5c, 0x30, 0x70, 0x58, 0x8a, 0xba, 0xcd, 0x20, 0x05,
  0x6b, 0x42, 0x79, 0x00, 0x5f, 0x53, 0x81, 0x53, 0x26, 0x34, 0x18, 0xec,
  0x47, 0x20, 0x5f, 0x37, 0x66, 0xc7, 0x6e, 0xaf, 0x2b, 0xbb, 0x12, 0x4b,
  0x29, 0xfa, 0x92, 0xc5, 0xb8, 0x49, 0x74, 0xbc, 0x61, 0x28, 0x80, 0x01,
  0x47, 0x3c, 0x23, 0x49, 0x64, 0xd4, 0x2c, 0x89, 0x27, 0x29, 0x15, 0xa9,
  0x68, 0x52, 0x54, 0xc3, 0x33, 0xbe, 0x45, 0x94, 0xe9, 0x94, 0x93, 0xd7,
  0x78, 0x27, 0x28, 0xd8, 0xc4, 0x2c, 0x46, 0xcc, 0x0e, 0x1b, 0x97, 0x2a,
  0xc5, 0xd5, 0xcf, 0x7f, 0x79, 0x2e, 0x3d, 0xb8, 0x29, 0x79, 0xd5, 0x1c,
  0x83, 0x9b, 0xae, 0x88, 0xef, 0x52, 0x90, 0x67, 0xe7, 0xc8, 0x4b, 0x15,
  0xf8, 0xec, 0x5c, 0xa5, 0x5a, 0xa3, 0xcf, 0xce, 0x55, 0x57, 0x6a, 0xf8,
  0xf0, 0x13, 0xa4, 0xe0, 0x8f, 0x36, 0x7f, 0xac, 0xae, 0xc3, 0xdf, 0xb7,
  0xb8, 0x32, 0x1e, 0x02, 0x5a, 0xdb, 0x33, 0xb3, 0x87, 0xe7, 0x47, 0xfc,
  0xcb, 0xf5, 0xc9, 0xe6, 0x4b, 0x83, 0x5f, 0x72, 0x1c, 0xc7, 0x73, 0xb6,
  0x07, 0xf6, 0x10, 0x23, 0xb0, 0x59, 0x02, 0x88, 0x4b, 0x66, 0x46, 0x21,
  0x01, 0x57, 0x41, 0xb1, 0x4f, 0x45, 0xb9, 0x31, 0xd9, 0x3f, 0x1e, 0xb1,
  0xc9, 0xaa, 0xfb, 0x80, 0x01, 0x9a, 0x86, 0x40, 0x8e, 0x1f, 0xf1, 0x96,
  0x86, 0x56, 0x20, 0x89, 0xe3, 0xc4, 0x33, 0x1a, 0x3c, 0xde, 0x0d, 0x8f,
  0x10, 0x2a, 0x84, 0x94, 0x22, 0xc1, 0x28, 0xf9, 0xcb, 0x19, 0x72, 0xd0,
  0xd0, 0xe8, 0xcd, 0x0c, 0xbb, 0xf3, 0xca, 0xf4, 0xae, 0xcf, 0x87, 0x51,
  0xf0, 0x16, 0xf2, 0x1a, 0xcd, 0x91, 0x39, 0x64, 0x0f, 0xd7, 0xed, 0xb9,
  0x23, 0xef, 0x4b, 0xeb, 0x1e, 0x8f, 0x04, 0xe4, 0xfc, 0x6d, 0xf7, 0xba,
  0x85, 0xef, 0x73, 0xa5, 0xc1, 0x11, 0x82, 0x8d, 0x0b, 0xfe, 0xec, 0x23,
  0xd5, 0x49, 0xcf, 0xe4, 0x44, 0x7c, 0xcc, 0x6b, 0x0b, 0x6d, 0x02, 0xb0,
  0x0a, 0x61, 0x81, 0x05, 0x1d, 0x82, 0xd6, 0x07, 0x37, 0x45, 0x68, 0x60,
  0x2f, 0x7e, 0x08, 0x49, 0xfa, 0x21, 0x2c, 0x25, 0xbd, 0xea, 0x44, 0x48,
  0x68, 0xcb, 0x2f, 0x3d, 0xf1, 0xf7, 0x3d, 0x68, 0xcf, 0x91, 0x18, 0x78,
  0xb0, 0x8c, 0xe1, 0xaf, 0x8b, 0x38, 0x9b, 0x9d, 0x8e, 0x28, 0x6a, 0xdb,
  0xc4, 0x8a, 0x22, 0x78, 0xcc, 0xc2, 0xee, 0x0d, 0x30, 0x72, 0xf7, 0xda,
  0xc6, 0xcd, 0x5b, 0x5a, 0x20, 0x0d, 0x7e, 0x22, 0xb6, 0x82, 0x85, 0x78,
  0xc2, 0x1a, 0x4f, 0x59, 0xd0, 0xd5, 0x8f, 0xa8, 0x34, 0xb5, 0xc8, 0x34,
  0x9c, 0x52, 0xd5, 0x2c, 0x8c, 0xcb, 0x36, 0xce, 0x8a, 0x74, 0xfc, 0x46,
  0x7d, 0x4d, 0xc6, 0xf8, 0xb1, 0x75, 0x8b, 0xfd, 0x12, 0x46, 0xfa, 0x08,
  0xae, 0x87, 0xac, 0x9e, 0x1b, 0x10, 0xb2, 0xea, 0xa2, 0x28, 0x50, 0x85,
  0x58, 0x08, 0xcb, 0x5c, 0x55, 0x4f, 0xc9, 0xa6, 0xe1, 0xfa, 0x72, 0x55,
  0x11, 0x6b, 0x70, 0x67, 0xd0, 0xd8, 0xfb, 0xd2, 0x76, 0x79, 0xac, 0xd6,
  0xf8, 0xc1, 0x8b, 0xfe, 0x60, 0x0e, 0x86, 0x7d, 0xb3, 0x21, 0xd5, 0x93,
  0x8c, 0x43, 0x79, 0x4b, 0x36, 0xd0, 0xcd, 0xce, 0x1e, 0x69, 0xaf, 0x13,
  0x0c, 0xee, 0x89, 0x4e, 0x11, 0xc3, 0x95, 0x45, 0x7b, 0x99, 0x16, 0xd9,
  0xcb, 0xa4, 0x41, 0x4e, 0x40, 0x22, 0xb5, 0xf0, 0x30, 0x89, 0x86, 0xc6,
  0xcd, 0xf2, 0x47, 0x11, 0xd3, 0xba, 0x36, 0xc4, 0x39, 0xbe, 0x25, 0xc3,
  0x27, 0x8c, 0x85, 0x16, 0x0e, 0xa8, 0x30, 0x54, 0x56, 0xc7, 0x7d, 0xc5,
  0x40, 0x92, 0x63, 0xae, 0x88, 0x2f, 0x4e, 0x85, 0xf9, 0x61, 0x3c, 0x21,
  0x94, 0x88, 0x41, 0xe1, 0xa0, 0x33, 0xb0, 0xce, 0x4c, 0xff, 0xfd, 0xf3,
  0x91, 0x35, 0xb2, 0x84, 0x40, 0xcb, 0x95, 0x4a, 0x33, 0x58, 0x2b, 0x95,
  0xeb, 0x24, 0x16, 0x2f, 0xbe, 0x44, 0xfa, 0x35, 0x02, 0x44, 0x31, 0x8b,
  0xe6, 0xe5, 0x71, 0x4a, 0x8f, 0xf7, 0xf4, 0x4e, 0x41, 0x8a, 0xbb, 0x37,
  0xe1, 0x7b, 0xf7, 0xf5, 0x99, 0x16, 0xd1, 0xc2, 0x68, 0xf6, 0xcc, 0xdb,
  0x33, 0x97, 0x44, 0x4c, 0xfd, 0x68, 0x5c, 0xcd, 0x18, 0x3d, 0xfe, 0xc7,
  0xd3, 0x83, 0xf1, 0x82, 0xb0, 0x2b, 0xc5, 0x97, 0xaf, 0x64, 0xf5, 0x98,
  0x10, 0x72, 0x6a, 0xdb, 0xb3, 0xae, 0xcb, 0x12, 0x3b, 0x37, 0x7a, 0x77,
  0x8b, 0x74, 0x3a, 0x6e, 0xe5, 0xb4, 0xe9, 0x1b, 0xf4, 0x30, 0x0b, 0x16,
  0xee, 0xc8, 0x63, 0x2a, 0x13, 0x00, 0xee, 0xd5, 0x02, 0x74, 0x15, 0x4a,
  0x10, 0x33, 0x75, 0x63, 0xcd, 0x8d, 0x3d, 0x25, 0x19, 0xd3, 0x9e, 0xb1,
  0x6c, 0x51, 0x1f, 0x8f, 0xc7, 0xf1, 0xf1, 0x89, 0x8d, 0xe8, 0xa2, 0x49,
  0x4c, 0x44, 0x91, 0xe8, 0x52, 0x1e, 0xea, 0x8f, 0x10, 0xc1, 0x8f, 0x04,
  0x23, 0xd3, 0xb9, 0xaa, 0xc7, 0xe0, 0x13, 0x3d, 0x4b, 0x0b, 0x76, 0xed,
  0x01, 0xbe, 0x46, 0x8a, 0x1b, 0xb4, 0xe5, 0xc5, 0x70, 0x30, 0x90, 0x35,
  0xe2, 0x9a, 0x41, 0xeb, 0x3c, 0x8b, 0x34, 0xe9, 0xe3, 0x63, 0xb5, 0xb8,
  0x5a, 0xd7, 0x34, 0xad, 0xe0, 0x83, 0x1d, 0x91, 0xcd, 0xb2, 0x65, 0x5c,
  0x20, 0x95, 0x23, 0x0f, 0x83, 0x89, 0x09, 0x1b, 0x72, 0x7e, 0x5e, 0xce,
  0x6d, 0x04, 0x05, 0x30, 0x0f, 0x30, 0x9c, 0x31, 0x10, 0x74, 0xee, 0x5b,
  0x1d, 0xc8, 0x97, 0x13, 0x34, 0x7a, 0xd6, 0x1a, 0x18, 0xf9, 0x12, 0xae,
  0x39, 0x9b, 0xf2, 0x41, 0x20, 0x7f, 0x40, 0x8d, 0x9c, 0x07, 0x62, 0x80,
  0xd7, 0x0b, 0xff, 0x32, 0x4e, 0x8f, 0xad, 0x05, 0x60, 0xe8, 0xe3, 0x43,
  0xcf, 0xb1, 0x3c, 0x72, 0x48, 0x3a, 0x87, 0xb1, 0xc8, 0xf3, 0x81, 0x61,
  0x54, 0x34, 0xf6, 0xee, 0x03, 0x7f, 0xbf, 0x9b, 0x9d, 0xaa, 0x82, 0x42,
  0x45, 0x75, 0xe6, 0x19, 0x7e, 0xb8, 0x9b, 0x6d, 0x15, 0xc8, 0x89, 0x27,
  0x11, 0x15, 0xc1, 0x98, 0x88, 0x73, 0xc6, 0x5a, 0x0f, 0x36, 0x4a, 0x8d,
  0x3c, 0xbe, 0x36, 0xc7, 0x5e, 0xf0, 0x14, 0xfb, 0x2b, 0xcf, 0x7f, 0x84,
  0xaf, 0x3b, 0x5d, 0x5b, 0x5e, 0x8f, 0xce, 0x95, 0x59, 0x5f, 0x77, 0xf0,
  0xec, 0x11, 0x5f, 0x67, 0x04, 0xcb, 0x23, 0x97, 0x13, 0xb6, 0x9d, 0xbd,
  0xf0, 0x30, 0xb5, 0x69, 0xad, 0xe3, 0x76, 0x77, 0x3e, 0xcf, 0x1e, 0xf0,
  0x06, 0xf9, 0xb7, 0x02, 0x82, 0x20, 0xeb, 0x5d, 0x58, 0x97, 0x4c, 0x26,
  0x69, 0x9d, 0x24, 0x1e, 0xb8, 0xab, 0xa5, 0x4f, 0x0e, 0xc5, 0xc9, 0x93,
  0x24, 0xc8, 0x0a, 0x0c, 0x28, 0x97, 0xf1, 0x8f, 0x1f, 0x40, 0x50, 0xa5,
  0xd5, 0x0b, 0x75, 0x1e, 0x8b, 0x57, 0x9e, 0x98, 0x84, 0x63, 0xe1, 0xcf,
  0x04, 0x92, 0xa2, 0xd8, 0x54, 0x91, 0xa5, 0x10, 0xcb, 0x99, 0x48, 0x11,
  0x17, 0x27, 0x4d, 0xb7, 0xc6, 0x22, 0x03, 0xa5, 0x77, 0x35, 0x41, 0xb8,
  0xc9, 0xa8, 0x16, 0xfa, 0x5e, 0xf7, 0xd5, 0xa4, 0xdb, 0x3a, 0x7b, 0x39,
  0x95, 0x9e, 0x88, 0x7a, 0xba, 0x83, 0x27, 0xa2, 0x56, 0x78, 0x18, 0x2a,
  0x8c, 0x24, 0x6f, 0xd1, 0x91, 0x50, 0x7e, 0xdf, 0xe6, 0xaf, 0xb2, 0xd3,
  0x77, 0xb3, 0xbc, 0xa5, 0xb2, 0x16, 0x81, 0xd0, 0x1d, 0x97, 0x26, 0x2c,
  0xc8, 0x82, 0x3b, 0x12, 0xab, 0x96, 0x1c, 0x2a, 0x67, 0x79, 0xbe, 0x6e,
  0xe9, 0xae, 0x50, 0xf1, 0x9c, 0x8f, 0x9a, 0xc6, 0x61, 0x72, 0xa6, 0xf9,
  0xa2, 0x98, 0x81, 0x75, 0x07, 0x46, 0xbb, 0x68, 0x58, 0x16, 0xee, 0x0c,
  0x9a, 0x52, 0xb8, 0x5b, 0xb2, 0x13, 0x99, 0xf7, 0x3c, 0xf3, 0x9e, 0x64,
  0xc6, 0xac, 0xda, 0xc2, 0x5d, 0x0e, 0xac, 0xc7, 0x64, 0xf2, 0x7d, 0x0e,
  0xd6, 0xbb, 0x89, 0x64, 0xb9, 0xca, 0x04, 0x2a, 0x55, 0x05, 0x32, 0x21,
  0x89, 0x6a, 0x96, 0xec, 0x70, 0xd2, 0x4d, 0xb5, 0x6b, 0x48, 0x4f, 0x73,
  0x4e, 0xf1, 0x5d, 0x05, 0xfe, 0xc0, 0x8a, 0x28, 0x38, 0x3c, 0x1a, 0x3d,
  0x0c, 0x1e, 0x12, 0x8a, 0xde, 0xe4, 0x8a, 0x52, 0x04, 0x62, 0x21, 0xe5,
  0x4d, 0x7c, 0xd7, 0x9c, 0x89, 0xa5, 0x3f, 0x16, 0x07, 0x8f, 0xc5, 0xa7,
  0xf5, 0xa1, 0x08, 0x8f, 0xef, 0xa0, 0x0b, 0xf3, 0xb1, 0xd5, 0x64, 0x8b,
  0x32, 0x49, 0x09, 0x8b, 0x91, 0xf2, 0x25, 0x5d, 0x8b, 0xc7, 0xd6, 0x51,
  0xef, 0x06, 0x73, 0x44, 0xa8, 0x58, 0xef, 0x06, 0x62, 0xef, 0xe6, 0xf3,
  0x4d, 0x2b, 0x1a, 0xf7, 0x63, 0x8c, 0xdd, 0x7a, 0x6a, 0xe2, 0xa3, 0xd1,
  0xd0, 0x83, 0x1d, 0xb2, 0x75, 0xc9, 0x27, 0x11, 0x74, 0x66, 0x8a, 0x4e,
  0xe0, 0x62, 0x33, 0x23, 0x3e, 0x94, 0xca, 0x23, 0xfc, 0xc3, 0xc4, 0x93,
  0x55, 0xcf, 0x43, 0x7a, 0x54, 0x5c, 0x51, 0xd1, 0x27, 0x22, 0x17, 0x91,
  0x26, 0x40, 0x85, 0x13, 0x43, 0xb2, 0x11, 0xc5, 0xf0, 0x8e, 0xe8, 0xa3,
  0x90, 0x59, 0x5e, 0x50, 0x1f, 0x81, 0x25, 0x35, 0x52, 0x9a, 0x21, 0xc2,
  0xc1, 0xb6, 0x1f, 0x95, 0xd0, 0x47, 0xa0, 0x65, 0x47, 0xa4, 0x3e, 0xb2,
  0x9d, 0x8b, 0x95, 0x6e, 0x3a, 0xbe, 0x7d, 0x80, 0x12, 0xc1, 0xb6, 0xcb,
  0xad, 0xf5, 0x30, 0xf8, 0x21, 0xb1, 0x26, 0x93, 0x71, 0xc2, 0x93, 0xdb,
  0xe9, 0xc7, 0x6e, 0xe8, 0x06, 0x03, 0x0b, 0x16, 0x7a, 0xf2, 0xd8, 0xb9,
  0x9b, 0xcb, 0xe4, 0xe2, 0x3a, 0x2d, 0x89, 0x13, 0x1f, 0x64, 0x40, 0x7a,
  0x62, 0x1b, 0xcd, 0xd1, 0x6b, 0xf5, 0xd1, 0xd3, 0x97, 0x29, 0xd6, 0x2d,
  0xdf, 0x58, 0x73, 0x85, 0x90, 0xf8, 0x64, 0x36, 0xf4, 0x9a, 0xec, 0x65,
  0x24, 0x6b, 0xf2, 0x1b, 0x48, 0x5e, 0xf4, 0xf4, 0xb7, 0x82, 0x2b, 0x81,
  0xa6, 0x7c, 0xea, 0x88, 0x4b, 0x6f, 0x3b, 0xfd, 0x11, 0x5d, 0x28, 0xe9,
  0x19, 0x2e, 0x3e, 0xef, 0xed, 0x38, 0x30, 0x89, 0xf2, 0xac, 0x6c, 0xf8,
  0x0c, 0x33, 0xfc, 0x53, 0xbe, 0xd4, 0x62, 0x4f, 0x22, 0xc1, 0x12, 0x7e,
  0xc3, 0xa5, 0x1c, 0x2a, 0xb8, 0x24, 0xd8, 0x7f, 0x56, 0xc5, 0xbb, 0x28,
  0xae, 0xb6, 0xd6, 0x50, 0xe5, 0x47, 0x21, 0xb4, 0xf9, 0xf0, 0xf5, 0xa8,
  0x9c, 0xc9, 0x2f, 0x01, 0x09, 0x0f, 0x31, 0xd0, 0xb7, 0x4b, 0x3a, 0xfa,
  0x15, 0x1f, 0x9a, 0xa3, 0x88, 0x2f, 0x47, 0x72, 0xfc, 0x6f, 0x55, 0xd1,
  0x0e, 0x14, 0xbe, 0x22, 0x87, 0x95, 0x23, 0xde, 0x23, 0x23, 0xd2, 0x0d,
  0x5d, 0xde, 0x0d, 0xce, 0xe4, 0x6e, 0x90, 0xd7, 0x4a, 0x13, 0xe2, 0x94,
  0x77, 0x16, 0x16, 0xcc, 0xb5, 0x15, 0x7c, 0x13, 0x28, 0x67, 0xac, 0xa0,
  0xbf, 0xd7, 0xa4, 0xee, 0x33, 0x3f, 0xb9, 0xfb, 0xa0, 0x64, 
Download .txt
gitextract_90qmtrh_/

├── .clang-format
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── support-request.md
│   └── workflows/
│       ├── backend.yml
│       ├── docker.yml
│       ├── frontend.yml
│       └── release.yml
├── .gitignore
├── CMakeLists.txt
├── Dockerfile
├── Dockerfile.alpine
├── LICENSE
├── README.md
├── app.rc.in
├── cmake/
│   └── GetGitVersion.cmake
├── html/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.json
│   ├── .gitignore
│   ├── .prettierrc.js
│   ├── .yarn/
│   │   └── patches/
│   │       └── zmodem.js-npm-0.1.10-e5537fa2ed.patch
│   ├── .yarnrc.yml
│   ├── README.md
│   ├── gulpfile.js
│   ├── package.json
│   ├── src/
│   │   ├── components/
│   │   │   ├── app.tsx
│   │   │   ├── modal/
│   │   │   │   ├── index.tsx
│   │   │   │   └── modal.scss
│   │   │   └── terminal/
│   │   │       ├── index.tsx
│   │   │       └── xterm/
│   │   │           ├── addons/
│   │   │           │   ├── overlay.ts
│   │   │           │   └── zmodem.ts
│   │   │           └── index.ts
│   │   ├── index.tsx
│   │   ├── style/
│   │   │   └── index.scss
│   │   └── template.html
│   ├── tsconfig.json
│   └── webpack.config.js
├── man/
│   ├── README.md
│   ├── ttyd.1
│   └── ttyd.man.md
├── scripts/
│   └── cross-build.sh
├── snap/
│   └── snapcraft.yaml
└── src/
    ├── compat.h
    ├── html.h
    ├── http.c
    ├── protocol.c
    ├── pty.c
    ├── pty.h
    ├── server.c
    ├── server.h
    ├── utils.c
    └── utils.h
Download .txt
SYMBOL INDEX (151 symbols across 13 files)

FILE: html/src/components/app.tsx
  class App (line 55) | class App extends Component {
    method render (line 56) | render() {

FILE: html/src/components/modal/index.tsx
  type Props (line 5) | interface Props {
  class Modal (line 10) | class Modal extends Component<Props> {
    method constructor (line 11) | constructor(props: Props) {
    method render (line 15) | render({ show, children }: Props) {

FILE: html/src/components/terminal/index.tsx
  type Props (line 8) | interface Props extends XtermOptions {
  type State (line 12) | interface State {
  class Terminal (line 16) | class Terminal extends Component<Props, State> {
    method constructor (line 20) | constructor(props: Props) {
    method componentDidMount (line 25) | async componentDidMount() {
    method componentWillUnmount (line 31) | componentWillUnmount() {
    method render (line 35) | render({ id }: Props, { modal }: State) {
    method showModal (line 49) | showModal() {
    method sendFile (line 54) | sendFile(event: Event) {

FILE: html/src/components/terminal/xterm/addons/overlay.ts
  class OverlayAddon (line 6) | class OverlayAddon implements ITerminalAddon {
    method constructor (line 11) | constructor() {
    method activate (line 33) | activate(terminal: Terminal): void {
    method dispose (line 37) | dispose(): void {}
    method showOverlay (line 40) | showOverlay(msg: string, timeout?: number): void {

FILE: html/src/components/terminal/xterm/addons/zmodem.ts
  type ZmodeOptions (line 7) | interface ZmodeOptions {
  class ZmodemAddon (line 17) | class ZmodemAddon implements ITerminalAddon {
    method constructor (line 25) | constructor(private options: ZmodeOptions) {}
    method activate (line 27) | activate(terminal: Terminal) {
    method dispose (line 33) | dispose() {
    method consume (line 40) | consume(data: ArrayBuffer) {
    method reset (line 54) | private reset() {
    method addDisposableListener (line 59) | private addDisposableListener(target: EventTarget, type: string, liste...
    method trzszInit (line 65) | private trzszInit() {
    method zmodemInit (line 94) | private zmodemInit() {
    method zmodemDetect (line 115) | private zmodemDetect(detection: Zmodem.Detection): void {
    method sendFile (line 131) | public sendFile(files: FileList) {
    method receiveFile (line 141) | private receiveFile() {
    method writeProgress (line 159) | private writeProgress(offer: Zmodem.Offer) {
    method bytesHuman (line 171) | private bytesHuman(bytes: any, precision: number): string {

FILE: html/src/components/terminal/xterm/index.ts
  type TtydTerminal (line 16) | interface TtydTerminal extends Terminal {
  type Window (line 21) | interface Window {
  type Command (line 26) | enum Command {
  type Preferences (line 38) | type Preferences = ITerminalOptions & ClientOptions;
  type RendererType (line 40) | type RendererType = 'dom' | 'canvas' | 'webgl';
  type ClientOptions (line 42) | interface ClientOptions {
  type FlowControl (line 56) | interface FlowControl {
  type XtermOptions (line 62) | interface XtermOptions {
  function toDisposable (line 70) | function toDisposable(f: () => void): IDisposable {
  function addEventListener (line 74) | function addEventListener(target: EventTarget, type: string, listener: E...
  class Xterm (line 79) | class Xterm {
    method constructor (line 107) | constructor(
    method dispose (line 112) | dispose() {
    method register (line 120) | private register<T extends IDisposable>(d: T): T {
    method sendFile (line 126) | public sendFile(files: FileList) {
    method refreshToken (line 131) | public async refreshToken() {
    method onWindowUnload (line 144) | private onWindowUnload(event: BeforeUnloadEvent) {
    method open (line 155) | public open(parent: HTMLElement) {
    method initListeners (line 173) | private initListeners() {
    method writeData (line 207) | public writeData(data: string | Uint8Array) {
    method sendData (line 230) | public sendData(data: string | Uint8Array) {
    method connect (line 248) | public connect() {
    method onSocketOpen (line 260) | private onSocketOpen() {
    method onSocketClose (line 281) | private onSocketClose(event: CloseEvent) {
    method parseOptsFromUrlQuery (line 309) | private parseOptsFromUrlQuery(query: string): Preferences {
    method onSocketData (line 343) | private onSocketData(event: MessageEvent) {
    method applyPreferences (line 371) | private applyPreferences(prefs: Preferences) {
    method setRendererType (line 472) | private setRendererType(value: RendererType) {

FILE: src/http.c
  function send_unauthorized (line 14) | static int send_unauthorized(struct lws *wsi, unsigned int code, enum lw...
  function check_auth (line 28) | static int check_auth(struct lws *wsi, struct pss_http *pss) {
  function accept_gzip (line 46) | static bool accept_gzip(struct lws *wsi) {
  function uncompress_html (line 52) | static bool uncompress_html(char **output, size_t *output_len) {
  function pss_buffer_free (line 82) | static void pss_buffer_free(struct pss_http *pss) {
  function access_log (line 86) | static void access_log(struct lws *wsi, const char *path) {
  function callback_http (line 93) | int callback_http(struct lws *wsi, enum lws_callback_reasons reason, voi...

FILE: src/protocol.c
  function send_initial_message (line 17) | static int send_initial_message(struct lws *wsi, int index) {
  function json_object (line 39) | static json_object *parse_window_size(const char *buf, size_t len, uint1...
  function check_host_origin (line 51) | static bool check_host_origin(struct lws *wsi) {
  function pty_ctx_t (line 73) | static pty_ctx_t *pty_ctx_init(struct pss_tty *pss) {
  function pty_ctx_free (line 80) | static void pty_ctx_free(pty_ctx_t *ctx) { free(ctx); }
  function process_read_cb (line 82) | static void process_read_cb(pty_process *process, pty_buf_t *buf, bool e...
  function process_exit_cb (line 96) | static void process_exit_cb(pty_process *process) {
  type pss_tty (line 115) | struct pss_tty
  type pss_tty (line 132) | struct pss_tty
  function spawn_process (line 154) | static bool spawn_process(struct pss_tty *pss, uint16_t columns, uint16_...
  function wsi_output (line 171) | static void wsi_output(struct lws *wsi, pty_buf_t *buf) {
  function check_auth (line 187) | static bool check_auth(struct lws *wsi, struct pss_tty *pss) {
  function callback_tty (line 201) | int callback_tty(struct lws *wsi, enum lws_callback_reasons reason, void...

FILE: src/pty.c
  function alloc_cb (line 40) | static void alloc_cb(uv_handle_t *unused, size_t suggested_size, uv_buf_...
  function close_cb (line 45) | static void close_cb(uv_handle_t *handle) { free(handle); }
  function async_free_cb (line 47) | static void async_free_cb(uv_handle_t *handle) {
  function pty_buf_t (line 51) | pty_buf_t *pty_buf_init(char *base, size_t len) {
  function pty_buf_free (line 59) | void pty_buf_free(pty_buf_t *buf) {
  function read_cb (line 65) | static void read_cb(uv_stream_t *stream, ssize_t n, const uv_buf_t *buf) {
  function write_cb (line 79) | static void write_cb(uv_write_t *req, int unused) {
  function pty_process (line 85) | pty_process *process_init(void *ctx, uv_loop_t *loop, char *argv[], char...
  function process_running (line 98) | bool process_running(pty_process *process) {
  function process_free (line 102) | void process_free(pty_process *process) {
  function pty_pause (line 124) | void pty_pause(pty_process *process) {
  function pty_resume (line 130) | void pty_resume(pty_process *process) {
  function pty_write (line 137) | int pty_write(pty_process *process, pty_buf_t *buf) {
  function pty_resize (line 148) | bool pty_resize(pty_process *process) {
  function pty_kill (line 160) | bool pty_kill(pty_process *process, int sig) {
  function conpty_init (line 170) | bool conpty_init() {
  function WCHAR (line 192) | static WCHAR *to_utf16(char *str) {
  function WCHAR (line 205) | static WCHAR *join_args(char **argv) {
  function conpty_setup (line 221) | static bool conpty_setup(HPCON *hnd, COORD size, STARTUPINFOEXW *si_ex, ...
  function connect_cb (line 286) | static void connect_cb(uv_connect_t *req, int status) {
  function conpty_exit (line 293) | static void CALLBACK conpty_exit(void *context, BOOLEAN unused) {
  function async_cb (line 298) | static void async_cb(uv_async_t *async) {
  function pty_spawn (line 312) | int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exi...
  function fd_set_cloexec (line 381) | static bool fd_set_cloexec(const int fd) {
  function fd_duplicate (line 387) | static bool fd_duplicate(int fd, uv_pipe_t *pipe) {
  function wait_cb (line 398) | static void wait_cb(void *arg) {
  function async_cb (line 419) | static void async_cb(uv_async_t *async) {
  function pty_spawn (line 427) | int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exi...

FILE: src/pty.h
  type pty_buf_t (line 19) | typedef struct {
  type pty_process_ (line 24) | struct pty_process_
  type pty_process (line 25) | typedef struct pty_process_ pty_process;
  type pty_process_ (line 29) | struct pty_process_ {

FILE: src/server.c
  type lws_context (line 22) | struct lws_context
  type server (line 23) | struct server
  type endpoints (line 24) | struct endpoints
  type lws (line 26) | struct lws
  type lws_callback_reasons (line 26) | enum lws_callback_reasons
  type lws (line 27) | struct lws
  type lws_callback_reasons (line 27) | enum lws_callback_reasons
  type lws_protocols (line 30) | struct lws_protocols
  type pss_http (line 30) | struct pss_http
  type pss_tty (line 31) | struct pss_tty
  type lws_extension (line 36) | struct lws_extension
  type option (line 55) | struct option
  function print_help (line 90) | static void print_help() {
  function print_config (line 140) | static void print_config() {
  type server (line 164) | struct server
  type server (line 165) | struct server
  type server (line 168) | struct server
  type server (line 170) | struct server
  function server_free (line 207) | static void server_free(struct server *ts) {
  function signal_cb (line 233) | static void signal_cb(uv_signal_t *watcher, int signum) {
  function parse_int (line 256) | static int parse_int(char *name, char *str) {
  function calc_command_start (line 267) | static int calc_command_start(int argc, char **argv) {
  function main (line 304) | int main(int argc, char **argv) {

FILE: src/server.h
  type endpoints (line 20) | struct endpoints {
  type lws_context (line 28) | struct lws_context
  type server (line 29) | struct server
  type endpoints (line 30) | struct endpoints
  type pss_http (line 32) | struct pss_http {
  type pss_tty (line 39) | struct pss_tty {
  type pty_ctx_t (line 59) | typedef struct {
  type server (line 64) | struct server {

FILE: src/utils.c
  function endswith (line 63) | bool endswith(const char *str, const char *suffix) {
  function get_sig_name (line 69) | int get_sig_name(int sig, char *buf, size_t len) {
  function get_sig (line 75) | int get_sig(const char *sig_name) {
  function open_uri (line 84) | int open_uri(char *uri) {
  function print_error (line 181) | void print_error(char *func) {
Condensed preview — 55 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,381K chars).
[
  {
    "path": ".clang-format",
    "chars": 92,
    "preview": "BasedOnStyle: Google\nLanguage: Cpp\nColumnLimit: 120\nIndentWidth: 2\nTabWidth: 2\nUseTab: Never"
  },
  {
    "path": ".gitattributes",
    "chars": 30,
    "preview": "src/html.h linguist-generated\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 33,
    "preview": "github: tsl0922\npatreon: tsl0922\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 622,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 604,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/support-request.md",
    "chars": 148,
    "preview": "---\nname: Support Request\nabout: Support request or question\ntitle: ''\nlabels: question\nassignees: ''\n\n---\n\nDescribe you"
  },
  {
    "path": ".github/workflows/backend.yml",
    "chars": 2245,
    "preview": "name: backend\n\non:\n  push:\n    paths:\n    - \".github/workflows/backend.yml\"\n    - \"CMakeLists.txt\"\n    - \"src/*\"\n    - \""
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 2285,
    "preview": "name: docker\n\non:\n  push:\n    branches: main\n    tags: [\"*\"]\n\njobs:\n  build:\n    runs-on: ubuntu-24.04\n    permissions:\n"
  },
  {
    "path": ".github/workflows/frontend.yml",
    "chars": 582,
    "preview": "name: frontend\n\non:\n  push:\n    paths:\n    - \".github/workflows/frontend.yml\"\n    - \"html/*\"\n  pull_request:\n    paths:\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1086,
    "preview": "name: release\n\non:\n  push:\n    tags: [\"*\"]\n\njobs:\n  build:\n    uses: ./.github/workflows/backend.yml\n  publish:\n    need"
  },
  {
    "path": ".gitignore",
    "chars": 465,
    "preview": "# Prerequisites\n*.d\n\n# Object files\n*.o\n*.ko\n*.obj\n*.elf\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Libraries\n*.lib\n*.a\n*.la\n"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 4461,
    "preview": "cmake_minimum_required(VERSION 3.12.0)\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\")\n\nproject(ttyd"
  },
  {
    "path": "Dockerfile",
    "chars": 301,
    "preview": "FROM ubuntu:24.04\n\nARG TARGETARCH\n\n# Dependencies\nRUN apt-get update && apt-get install -y --no-install-recommends tini "
  },
  {
    "path": "Dockerfile.alpine",
    "chars": 224,
    "preview": "FROM alpine\n\nARG TARGETARCH\n\n# Dependencies\nRUN apk add --no-cache bash tini\n\n# Application\nCOPY ./dist/${TARGETARCH}/tt"
  },
  {
    "path": "LICENSE",
    "chars": 1094,
    "preview": "MIT License\n\nCopyright (c) 2016-2026 Shuanglei Tao <tsl0922@gmail.com>\n\nPermission is hereby granted, free of charge, to"
  },
  {
    "path": "README.md",
    "chars": 5492,
    "preview": "![backend](https://github.com/tsl0922/ttyd/workflows/backend/badge.svg)\n![frontend](https://github.com/tsl0922/ttyd/work"
  },
  {
    "path": "app.rc.in",
    "chars": 965,
    "preview": "#include <winver.h>\n\n#define VERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0\n#define V"
  },
  {
    "path": "cmake/GetGitVersion.cmake",
    "chars": 1249,
    "preview": "find_package(Git)\n\nfunction(get_git_version var1 var2)\n  if(GIT_EXECUTABLE)\n    execute_process(\n      COMMAND ${GIT_EXE"
  },
  {
    "path": "html/.editorconfig",
    "chars": 207,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespa"
  },
  {
    "path": "html/.eslintignore",
    "chars": 6,
    "preview": "dist/\n"
  },
  {
    "path": "html/.eslintrc.json",
    "chars": 394,
    "preview": "{\n  \"extends\": \"./node_modules/gts/\",\n  \"overrides\": [\n    {\n      \"files\": [\"**/*.ts\", \"**/*.tsx\"],\n      \"parserOption"
  },
  {
    "path": "html/.gitignore",
    "chars": 104,
    "preview": "node_modules\ndist\n*.log\n\n.yarn/cache\n.yarn/unplugged\n.yarn/build-state.yml\n.yarn/install-state.gz\n.pnp.*"
  },
  {
    "path": "html/.prettierrc.js",
    "chars": 123,
    "preview": "module.exports = {\n  ...require('gts/.prettierrc.json'),\n  \"bracketSpacing\": true,\n  \"tabWidth\": 4,\n  \"printWidth\": 120,"
  },
  {
    "path": "html/.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch",
    "chars": 1648,
    "preview": "diff --git a/src/zsession.js b/src/zsession.js\nindex 5f0b8f9d8afa6fba0acd6dd0477afa186f7aad9a..c7ea98e0f08c97d63d321f784"
  },
  {
    "path": "html/.yarnrc.yml",
    "chars": 25,
    "preview": "nodeLinker: node-modules\n"
  },
  {
    "path": "html/README.md",
    "chars": 314,
    "preview": "## Prerequisites\n\n> **NOTE:** yarn v2 is required.\n\nInstall [Yarn](https://yarnpkg.com/getting-started/install), and run"
  },
  {
    "path": "html/gulpfile.js",
    "chars": 1865,
    "preview": "const { src, dest, task, series } = require('gulp');\nconst clean = require('gulp-clean');\nconst gzip = require('gulp-gzi"
  },
  {
    "path": "html/package.json",
    "chars": 2167,
    "preview": "{\n  \"private\": true,\n  \"name\": \"ttyd\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Share your terminal over the web\",\n  \"rep"
  },
  {
    "path": "html/src/components/app.tsx",
    "chars": 2024,
    "preview": "import { h, Component } from 'preact';\n\nimport { Terminal } from './terminal';\n\nimport type { ITerminalOptions, ITheme }"
  },
  {
    "path": "html/src/components/modal/index.tsx",
    "chars": 636,
    "preview": "import { h, Component, ComponentChildren } from 'preact';\n\nimport './modal.scss';\n\ninterface Props {\n    show: boolean;\n"
  },
  {
    "path": "html/src/components/modal/modal.scss",
    "chars": 1388,
    "preview": ".modal {\n  bottom: 0;\n  left: 0;\n  right: 0;\n  top: 0;\n  align-items: center;\n  display: flex;\n  overflow: hidden;\n  pos"
  },
  {
    "path": "html/src/components/terminal/index.tsx",
    "chars": 1487,
    "preview": "import { bind } from 'decko';\nimport { Component, h } from 'preact';\nimport { Xterm, XtermOptions } from './xterm';\n\nimp"
  },
  {
    "path": "html/src/components/terminal/xterm/addons/overlay.ts",
    "chars": 2362,
    "preview": "// ported from hterm.Terminal.prototype.showOverlay\n// https://chromium.googlesource.com/apps/libapps/+/master/hterm/js/"
  },
  {
    "path": "html/src/components/terminal/xterm/addons/zmodem.ts",
    "chars": 6216,
    "preview": "import { bind } from 'decko';\nimport { saveAs } from 'file-saver';\nimport { IDisposable, ITerminalAddon, Terminal } from"
  },
  {
    "path": "html/src/components/terminal/xterm/index.ts",
    "chars": 18444,
    "preview": "import { bind } from 'decko';\nimport type { IDisposable, ITerminalOptions } from '@xterm/xterm';\nimport { Terminal } fro"
  },
  {
    "path": "html/src/index.tsx",
    "chars": 238,
    "preview": "if (process.env.NODE_ENV === 'development') {\n    require('preact/debug');\n}\nimport 'whatwg-fetch';\nimport { h, render }"
  },
  {
    "path": "html/src/style/index.scss",
    "chars": 239,
    "preview": "html,\nbody {\n  height: 100%;\n  min-height: 100%;\n  margin: 0;\n  overflow: hidden;\n}\n\n#terminal-container {\n  width: auto"
  },
  {
    "path": "html/src/template.html",
    "chars": 665,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=ed"
  },
  {
    "path": "html/tsconfig.json",
    "chars": 433,
    "preview": "{\n  \"extends\": \"./node_modules/gts/tsconfig-google.json\",\n  \"compilerOptions\": {\n    \"moduleResolution\": \"node\",\n    \"es"
  },
  {
    "path": "html/webpack.config.js",
    "chars": 2837,
    "preview": "const path = require('path');\nconst { merge } = require('webpack-merge');\nconst ESLintPlugin = require('eslint-webpack-p"
  },
  {
    "path": "man/README.md",
    "chars": 107,
    "preview": "# Building the man page\n\n```bash\ngo get github.com/cpuguy83/go-md2man\ngo-md2man < ttyd.man.md  > ttyd.1\n```"
  },
  {
    "path": "man/ttyd.1",
    "chars": 8757,
    "preview": ".nh\n.TH ttyd 1 \"September 2016\" ttyd \"User Manual\"\n\n.SH NAME\n.PP\nttyd - Share your terminal over the web\n\n\n.SH SYNOPSIS\n"
  },
  {
    "path": "man/ttyd.man.md",
    "chars": 8202,
    "preview": "ttyd 1 \"September 2016\" ttyd \"User Manual\"\n==================================================\n\n# NAME\n  ttyd - Share you"
  },
  {
    "path": "scripts/cross-build.sh",
    "chars": 7666,
    "preview": "#!/bin/bash\n#\n# Example:\n#         env BUILD_TARGET=mips ./scripts/cross-build.sh\n#\nset -eo pipefail\n\nCROSS_ROOT=\"${CROS"
  },
  {
    "path": "snap/snapcraft.yaml",
    "chars": 969,
    "preview": "name: ttyd\nadopt-info: ttyd\nsummary: Share your terminal over the web\ndescription: |\n ttyd is a simple command-line tool"
  },
  {
    "path": "src/compat.h",
    "chars": 404,
    "preview": "/* compat.h -- MSVC compatibility shims for POSIX functions */\n#ifndef TTYD_COMPAT_H\n#define TTYD_COMPAT_H\n\n#ifdef _MSC_"
  },
  {
    "path": "src/html.h",
    "chars": 1197154,
    "preview": "unsigned char index_html[] = {\n  0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xec, 0xbd,\n  0x69, 0x77, 0"
  },
  {
    "path": "src/http.c",
    "chars": 8347,
    "preview": "#include <libwebsockets.h>\n#include <string.h>\n#include <zlib.h>\n\n#include \"html.h\"\n#include \"server.h\"\n#include \"utils."
  },
  {
    "path": "src/protocol.c",
    "chars": 12310,
    "preview": "#include <errno.h>\n#include <json.h>\n#include <libwebsockets.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib"
  },
  {
    "path": "src/pty.c",
    "chars": 13949,
    "preview": "#include <errno.h>\n#include <fcntl.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#i"
  },
  {
    "path": "src/pty.h",
    "chars": 1491,
    "preview": "#ifndef TTYD_PTY_H\n#define TTYD_PTY_H\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <uv.h>\n\n#ifdef _WIN32\n#ifndef H"
  },
  {
    "path": "src/server.c",
    "chars": 22506,
    "preview": "#include \"server.h\"\n\n#include <errno.h>\n#include <getopt.h>\n#include <json.h>\n#include <libwebsockets.h>\n#include <signa"
  },
  {
    "path": "src/server.h",
    "chars": 2167,
    "preview": "#include <libwebsockets.h>\n#include <stdbool.h>\n#include <uv.h>\n\n#include \"pty.h\"\n\n// client message\n#define INPUT '0'\n#"
  },
  {
    "path": "src/utils.c",
    "chars": 4549,
    "preview": "#include <ctype.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#i"
  },
  {
    "path": "src/utils.h",
    "chars": 1002,
    "preview": "#ifndef TTYD_UTIL_H\n#define TTYD_UTIL_H\n\n#define container_of(ptr, type, member)                \\\n  ({                  "
  }
]

About this extraction

This page contains the full source code of the tsl0922/ttyd GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 55 files (1.3 MB), approximately 1.0M tokens, and a symbol index with 151 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!